Visualizzazione dei risultati da 1 a 5 su 5
  1. #1
    Utente di HTML.it L'avatar di Landi
    Registrato dal
    Jun 2012
    residenza
    Torino
    Messaggi
    39

    [Android] Crash activity login

    Ciao a tutti, sto scrivendo un' app che prevede l'apertura sulla MainActivity con due pulsanti: login o catalogo (si tratta di una "biblioteca online"). Premendo il pulsante login si apre l'activity LoginActivity che è quella proposta da android studio che poi pulirò da alcuni metodi di cui non necessito. Infine è presente l'activity ControlPanel (al momento con una sola textview di benvenuto) che sarà mostrata a login avvenuto.
    Lanciando l'app e arrivando al login, inserisco le credenziali, ma al momento di eseguire l'intent per aprire ControlPanel, l'activity LoginActivity si chiude con l'avviso che il programma è stato arrestato e mi riporta alla MainActivity.
    Allego il codice.

    LoginActivity - le uniche istruzioni di codice aggiunte in onPostExecute sono
    codice:
     Intent i = new Intent(LoginActivity.this, ControlPanel.class);
                    startActivity(i);
    codice:
    import android.animation.Animator;
    import android.animation.AnimatorListenerAdapter;
    import android.annotation.TargetApi;
    import android.app.LoaderManager.LoaderCallbacks;
    import android.content.CursorLoader;
    import android.content.Intent;
    import android.content.Loader;
    import android.content.pm.PackageManager;
    import android.database.Cursor;
    import android.net.Uri;
    import android.os.AsyncTask;
    import android.os.Build;
    import android.os.Bundle;
    import android.provider.ContactsContract;
    import android.support.annotation.NonNull;
    import android.support.design.widget.Snackbar;
    import android.support.v7.app.AppCompatActivity;
    import android.text.TextUtils;
    import android.view.KeyEvent;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.view.inputmethod.EditorInfo;
    import android.widget.ArrayAdapter;
    import android.widget.AutoCompleteTextView;
    import android.widget.Button;
    import android.widget.EditText;
    import android.widget.TextView;
    import java.util.ArrayList;
    import java.util.List;
    import static android.Manifest.permission.READ_CONTACTS;
    public class LoginActivity extends AppCompatActivity implements LoaderCallbacks<Cursor> {
         private static final int REQUEST_READ_CONTACTS = 0;
        private static final String[] DUMMY_CREDENTIALS = new String[]{
                "foo@example.com:hello", "bar@example.com:world"
        };
        
        private UserLoginTask mAuthTask = null;
    
        // UI references.
        private AutoCompleteTextView mEmailView;
        private EditText mPasswordView;
        private View mProgressView;
        private View mLoginFormView;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_login);
            // Set up the login form.
            mEmailView = (AutoCompleteTextView) findViewById(R.id.email);
            populateAutoComplete();
    
            mPasswordView = (EditText) findViewById(R.id.password);
            mPasswordView.setOnEditorActionListener(new TextView.OnEditorActionListener() {
                @Override
                public boolean onEditorAction(TextView textView, int id, KeyEvent keyEvent) {
                    if (id == R.id.login || id == EditorInfo.IME_NULL) {
                        attemptLogin();
                        return true;
                    }
                    return false;
                }
            });
    
            Button mEmailSignInButton = (Button) findViewById(R.id.email_sign_in_button);
            mEmailSignInButton.setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View view) {
                    attemptLogin();
                }
            });
    
            mLoginFormView = findViewById(R.id.login_form);
            mProgressView = findViewById(R.id.login_progress);
        }
    
        private void populateAutoComplete() {
            if (!mayRequestContacts()) {
                return;
            }
    
            getLoaderManager().initLoader(0, null, this);
        }
    
        private boolean mayRequestContacts() {
            if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
                return true;
            }
            if (checkSelfPermission(READ_CONTACTS) == PackageManager.PERMISSION_GRANTED) {
                return true;
            }
            if (shouldShowRequestPermissionRationale(READ_CONTACTS)) {
                Snackbar.make(mEmailView, R.string.permission_rationale, Snackbar.LENGTH_INDEFINITE)
                        .setAction(android.R.string.ok, new View.OnClickListener() {
                            @Override
                            @TargetApi(Build.VERSION_CODES.M)
                            public void onClick(View v) {
                                requestPermissions(new String[]{READ_CONTACTS}, REQUEST_READ_CONTACTS);
                            }
                        });
            } else {
                requestPermissions(new String[]{READ_CONTACTS}, REQUEST_READ_CONTACTS);
            }
            return false;
        }
        @Override
        public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
                                               @NonNull int[] grantResults) {
            if (requestCode == REQUEST_READ_CONTACTS) {
                if (grantResults.length == 1 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    populateAutoComplete();
                }
            }
        }
      private void attemptLogin() {
            if (mAuthTask != null) {
                return;
            }
    
            // Reset errors.
            mEmailView.setError(null);
            mPasswordView.setError(null);
    
            // Store values at the time of the login attempt.
            String email = mEmailView.getText().toString();
            String password = mPasswordView.getText().toString();
    
            boolean cancel = false;
            View focusView = null;
    
            // Check for a valid password, if the user entered one.
            if (!TextUtils.isEmpty(password) && !isPasswordValid(password)) {
                mPasswordView.setError(getString(R.string.error_invalid_password));
                focusView = mPasswordView;
                cancel = true;
            }
    
            // Check for a valid email address.
            if (TextUtils.isEmpty(email)) {
                mEmailView.setError(getString(R.string.error_field_required));
                focusView = mEmailView;
                cancel = true;
            } else if (!isEmailValid(email)) {
                mEmailView.setError(getString(R.string.error_invalid_email));
                focusView = mEmailView;
                cancel = true;
            }
    
            if (cancel) {
                // There was an error; don't attempt login and focus the first
                // form field with an error.
                focusView.requestFocus();
            } else {
                // Show a progress spinner, and kick off a background task to
                // perform the user login attempt.
                showProgress(true);
                mAuthTask = new UserLoginTask(email, password);
                mAuthTask.execute((Void) null);
            }
        }
    
        private boolean isEmailValid(String email) {
            //TODO: Replace this with your own logic
            return email.contains("@");
        }
    
        private boolean isPasswordValid(String password) {
            //TODO: Replace this with your own logic
            return password.length() > 4;
        }
    
       @TargetApi(Build.VERSION_CODES.HONEYCOMB_MR2)
        private void showProgress(final boolean show) {
            // On Honeycomb MR2 we have the ViewPropertyAnimator APIs, which allow
            // for very easy animations. If available, use these APIs to fade-in
            // the progress spinner.
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB_MR2) {
                int shortAnimTime = getResources().getInteger(android.R.integer.config_shortAnimTime);
    
                mLoginFormView.setVisibility(show ? View.GONE : View.VISIBLE);
                mLoginFormView.animate().setDuration(shortAnimTime).alpha(
                        show ? 0 : 1).setListener(new AnimatorListenerAdapter() {
                    @Override
                    public void onAnimationEnd(Animator animation) {
                        mLoginFormView.setVisibility(show ? View.GONE : View.VISIBLE);
                    }
                });
    
                mProgressView.setVisibility(show ? View.VISIBLE : View.GONE);
                mProgressView.animate().setDuration(shortAnimTime).alpha(
                        show ? 1 : 0).setListener(new AnimatorListenerAdapter() {
                    @Override
                    public void onAnimationEnd(Animator animation) {
                        mProgressView.setVisibility(show ? View.VISIBLE : View.GONE);
                    }
                });
            } else {
                // The ViewPropertyAnimator APIs are not available, so simply show
                // and hide the relevant UI components.
                mProgressView.setVisibility(show ? View.VISIBLE : View.GONE);
                mLoginFormView.setVisibility(show ? View.GONE : View.VISIBLE);
            }
        }
    
        @Override
        public Loader<Cursor> onCreateLoader(int i, Bundle bundle) {
            return new CursorLoader(this,
                    // Retrieve data rows for the device user's 'profile' contact.
                    Uri.withAppendedPath(ContactsContract.Profile.CONTENT_URI,
                            ContactsContract.Contacts.Data.CONTENT_DIRECTORY), ProfileQuery.PROJECTION,
    
                    // Select only email addresses.
                    ContactsContract.Contacts.Data.MIMETYPE +
                            " = ?", new String[]{ContactsContract.CommonDataKinds.Email
                    .CONTENT_ITEM_TYPE},
    
                    // Show primary email addresses first. Note that there won't be
                    // a primary email address if the user hasn't specified one.
                    ContactsContract.Contacts.Data.IS_PRIMARY + " DESC");
        }
    
        @Override
        public void onLoadFinished(Loader<Cursor> cursorLoader, Cursor cursor) {
            List<String> emails = new ArrayList<>();
            cursor.moveToFirst();
            while (!cursor.isAfterLast()) {
                emails.add(cursor.getString(ProfileQuery.ADDRESS));
                cursor.moveToNext();
            }
    
            addEmailsToAutoComplete(emails);
        }
    
        @Override
        public void onLoaderReset(Loader<Cursor> cursorLoader) {
    
        }
    
        private void addEmailsToAutoComplete(List<String> emailAddressCollection) {
            //Create adapter to tell the AutoCompleteTextView what to show in its dropdown list.
            ArrayAdapter<String> adapter =
                    new ArrayAdapter<>(LoginActivity.this,
                            android.R.layout.simple_dropdown_item_1line, emailAddressCollection);
    
            mEmailView.setAdapter(adapter);
        }
    
    
        private interface ProfileQuery {
            String[] PROJECTION = {
                    ContactsContract.CommonDataKinds.Email.ADDRESS,
                    ContactsContract.CommonDataKinds.Email.IS_PRIMARY,
            };
    
            int ADDRESS = 0;
            int IS_PRIMARY = 1;
        }
    
        /**
         * Represents an asynchronous login/registration task used to authenticate
         * the user.
         */
        public class UserLoginTask extends AsyncTask<Void, Void, Boolean> {
    
            private final String mEmail;
            private final String mPassword;
    
            UserLoginTask(String email, String password) {
                mEmail = email;
                mPassword = password;
            }
    
            @Override
            protected Boolean doInBackground(Void... params) {
                // TODO: attempt authentication against a network service.
    
                try {
                    // Simulate network access.
                    Thread.sleep(2000);
                } catch (InterruptedException e) {
                    return false;
                }
    
                for (String credential : DUMMY_CREDENTIALS) {
                    String[] pieces = credential.split(":");
                    if (pieces[0].equals(mEmail)) {
                        // Account exists, return true if the password matches.
                        return pieces[1].equals(mPassword);
                    }
                }
    
                // TODO: register the new account here.
                return true;
            }
    
            @Override
            protected void onPostExecute(final Boolean success) {
                mAuthTask = null;
                showProgress(false);
    
                if (success) {
                  Intent i = new Intent(LoginActivity.this, ControlPanel.class);
                    startActivity(i); finish();
                } else {
                    mPasswordView.setError(getString(R.string.error_incorrect_password));
                    mPasswordView.requestFocus();
                }
            }
    
            @Override
            protected void onCancelled() {
                mAuthTask = null;
                showProgress(false);
            }
        }
    }

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254
    Quote Originariamente inviata da Landi Visualizza il messaggio
    l'activity LoginActivity si chiude con l'avviso che il programma è stato arrestato e mi riporta alla MainActivity.
    Dovresti almeno precisare se hai una eccezione, quale e dove.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

  3. #3
    Utente di HTML.it L'avatar di Landi
    Registrato dal
    Jun 2012
    residenza
    Torino
    Messaggi
    39
    Hai ragione, provvedo subito
    codice:
    E/AndroidRuntime: FATAL EXCEPTION: main
                      Process: loredana.bdefinitiva, PID: 11892
                       java.lang.RuntimeException: Unable to start activity  ComponentInfo{loredana.bdefinitiva/loredana.bdefinitiva.ControlPanel}:  java.lang.NullPointerException: Attempt to invoke virtual method  'java.lang.String android.os.Bundle.getString(java.lang.String)' on a  null object reference
                          at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2702)
                          at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2767)
                          at android.app.ActivityThread.access$900(ActivityThread.java:177)
                          at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1449)
                          at android.os.Handler.dispatchMessage(Handler.java:102)
                          at android.os.Looper.loop(Looper.java:145)
                          at android.app.ActivityThread.main(ActivityThread.java:5951)
                          at java.lang.reflect.Method.invoke(Native Method)
                          at java.lang.reflect.Method.invoke(Method.java:372)
                          at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1400)
                          at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1195)
                        Caused by: java.lang.NullPointerException: Attempt to invoke virtual  method 'java.lang.String android.os.Bundle.getString(java.lang.String)'  on a null object reference
                          at loredana.bdefinitiva.ControlPanel.onCreate(ControlPanel.java:24)
                          at android.app.Activity.performCreate(Activity.java:6289)
                          at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1119)
                          at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2655)
                          at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2767) 
                          at android.app.ActivityThread.access$900(ActivityThread.java:177) 
                          at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1449) 
                          at android.os.Handler.dispatchMessage(Handler.java:102) 
                          at android.os.Looper.loop(Looper.java:145) 
                          at android.app.ActivityThread.main(ActivityThread.java:5951) 
                          at java.lang.reflect.Method.invoke(Native Method) 
                          at java.lang.reflect.Method.invoke(Method.java:372) 
                          at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1400) 
                          at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1195)
    ]

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254
    Quote Originariamente inviata da Landi Visualizza il messaggio
    Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.os.Bundle.getString(java.lang.String)' on a null object reference
    at loredana.bdefinitiva.ControlPanel.onCreate(ControlPanel.java:24)
    Il problema è nel punto indicato in rosso. È lì che c'è un NullPointerException dovuto al fatto che hai un reference null.
    ControlPanel non l'hai postata ... non so che dirti, verifica.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

  5. #5
    Utente di HTML.it L'avatar di Landi
    Registrato dal
    Jun 2012
    residenza
    Torino
    Messaggi
    39
    Quote Originariamente inviata da andbin Visualizza il messaggio
    Il problema � nel punto indicato in rosso. � l� che c'� un NullPointerException dovuto al fatto che hai un reference null.
    ControlPanel non l'hai postata ... non so che dirti, verifica.
    Risolto non avevo commentato una riga di codice che faceva riferimento ad una cosa sopra che era gi� commentata e pensare che ci ho perso tutto il pomeriggio e non ho pensato di guardare ControlPanel
    Grazie per la dritta o sarei ancora qui a cercare il problema!

Tag per questa discussione

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.