jav.nullPointer。使用Intent的putExtra()方法时出现异常

时间:2014-06-30 12:22:33

标签: android

当我使用Intent的putExtras()方法时,我不断得到NulPpointerException,如下所示。它在onClick方法中,我创建一个intent并调用register活动类。我使用android的帐户认证机制。每当点击signUpTxt Textview时,应用程序就会崩溃,下面的错误日志跟踪显示。我缺少什么?

这是我的源代码

public class LoginActivity extends AccountAuthenticatorActivity {

    //.......................................
    //..........................................
    @Override
    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);

        actionBar = getSupportActionBar();
        actionBar.hide();

        mAccountManager = AccountManager.get(getBaseContext());

        String accountName = getIntent().getStringExtra(ARG_ACCOUNT_NAME);
        mAuthTokenType = getIntent().getStringExtra(ARG_AUTH_TYPE);

        if (mAuthTokenType == null)
            mAuthTokenType = AccountInfo.AUTHTOKEN_TYPE_FULL_ACCESS;

        if (accountName != null) {
            accountname = ((EditText) findViewById(R.id.txtAccountPhone));
            accountname.setText(accountName);
        }
        btnLogin = (Button) findViewById(R.id.btnLogin);

        btnLogin.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                login();
            }
        });

        signUpTxt = (TextView) findViewById(R.id.txtSignUp);
        signUpTxt.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // Since there can only be one AuthenticatorActivity, we call the sign up activity, get his results,
                // and return them in setAccountAuthenticatorResult(). See finishLogin().
                Intent signup = new Intent(getBaseContext(), RegisterActivity.class);
                signup.putExtras(getIntent().getExtras());
                startActivityForResult(signup, REQ_SIGNUP);
            }
        });
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {

        // The sign up activity returned that the user has successfully created an account
        if (requestCode == REQ_SIGNUP && resultCode == RESULT_OK) {
            finishLogin(data);
        } else
            super.onActivityResult(requestCode, resultCode, data);
    }

    public void login() {

        final String userName = ((TextView) findViewById(R.id.txtAccountPhone)).getText().toString();
        final String userPass = ((TextView) findViewById(R.id.txtAccountPassword)).getText().toString();

        final String accountType = getIntent().getStringExtra(ARG_ACCOUNT_TYPE);

        new AsyncTask<String, Void, Intent>() {

            @Override
            protected Intent doInBackground(String... params) {

                Log.d("Slime", TAG + "> Started authenticating");

                String authtoken = null;
                Bundle data = new Bundle();
                try {
                    authtoken = AccountInfo.sServerAuthenticate.userSignIn(userName, userPass, mAuthTokenType);

                    data.putString(AccountManager.KEY_ACCOUNT_NAME, userName);
                    data.putString(AccountManager.KEY_ACCOUNT_TYPE, accountType);
                    data.putString(AccountManager.KEY_AUTHTOKEN, authtoken);
                    data.putString(PARAM_USER_PASS, userPass);

                } catch (Exception e) {
                    data.putString(KEY_ERROR_MESSAGE, e.getMessage());
                }

                final Intent res = new Intent();
                res.putExtras(data);
                return res;
            }

            @Override
            protected void onPostExecute(Intent intent) {
                if (intent.hasExtra(KEY_ERROR_MESSAGE)) {
                    Toast.makeText(getBaseContext(), intent.getStringExtra(KEY_ERROR_MESSAGE), Toast.LENGTH_SHORT).show();
                } else {
                    finishLogin(intent);
                }
            }
        }.execute();
    }

    private void finishLogin(Intent intent) {
        Log.d("Slime", TAG + "> finishLogin");

        String accountName = intent.getStringExtra(AccountManager.KEY_ACCOUNT_NAME);
        String accountPassword = intent.getStringExtra(PARAM_USER_PASS);
        final Account account = new Account(accountName, intent.getStringExtra(AccountManager.KEY_ACCOUNT_TYPE));

        if (getIntent().getBooleanExtra(ARG_IS_ADDING_NEW_ACCOUNT, false)) {
            Log.d("Slime", TAG + "> finishLogin > addAccountExplicitly");
            String authtoken = intent.getStringExtra(AccountManager.KEY_AUTHTOKEN);
            String authtokenType = mAuthTokenType;

            // Creating the account on the device and setting the auth token we got
            // (Not setting the auth token will cause another call to the server to authenticate the user)
            mAccountManager.addAccountExplicitly(account, accountPassword, null);
            mAccountManager.setAuthToken(account, authtokenType, authtoken);
        } else {
            Log.d("Slime", TAG + "> finishLogin > setPassword");
            mAccountManager.setPassword(account, accountPassword);
        }

        setAccountAuthenticatorResult(intent.getExtras());
        setResult(RESULT_OK, intent);
        finish();
    }

}

这是logcat的错误日志

06-30 14:53:46.109: E/AndroidRuntime(6015): FATAL EXCEPTION: main
06-30 14:53:46.109: E/AndroidRuntime(6015): java.lang.NullPointerException
06-30 14:53:46.109: E/AndroidRuntime(6015):     at android.os.Bundle.putAll(Bundle.java:281)
06-30 14:53:46.109: E/AndroidRuntime(6015):     at android.content.Intent.putExtras(Intent.java:4828)
06-30 14:53:46.109: E/AndroidRuntime(6015):     at com.rowland.slumber.LoginActivity$2.onClick(LoginActivity.java:86)
06-30 14:53:46.109: E/AndroidRuntime(6015):     at android.view.View.performClick(View.java:2485)
06-30 14:53:46.109: E/AndroidRuntime(6015):     at android.view.View$PerformClick.run(View.java:9080)
06-30 14:53:46.109: E/AndroidRuntime(6015):     at android.os.Handler.handleCallback(Handler.java:587)

编辑,这是第86行

public void onClick(View v) {
                // Since there can only be one AuthenticatorActivity, we call the sign up activity, get his results,
                // and return them in setAccountAuthenticatorResult(). See finishLogin().
                Intent signup = new Intent(getBaseContext(), RegisterActivity.class);
               signup.putExtras(getIntent().getExtras()); //LINE 86 
                startActivityForResult(signup, REQ_SIGNUP);
            }
        });
    }

Iam传递来自Authenticator.java的额外内容,它在addAccount()方法中扩展了AbstractAccountAuthenticator

@Override
    public Bundle addAccount(AccountAuthenticatorResponse response,
            String accountType, String authTokenType,
            String[] requiredFeatures, Bundle options)
            throws NetworkErrorException {
        Bundle result;

        if (hasAccount(mContext)) {
            result = new Bundle();
            Intent i = new Intent(mContext, LoginActivity.class);
            i.putExtra(LoginActivity.ARG_ACCOUNT_TYPE, accountType);
            i.putExtra(LoginActivity.ARG_AUTH_TYPE, authTokenType);
            i.putExtra(LoginActivity.ARG_IS_ADDING_NEW_ACCOUNT, true);
            i.putExtra(AccountManager.KEY_ACCOUNT_AUTHENTICATOR_RESPONSE,response);
            result.putParcelable(AccountManager.KEY_INTENT, i);

            return result;

        }

2 个答案:

答案 0 :(得分:1)

基于API:

Intent.getExtras()返回: 以前使用putExtra()添加的所有额外内容的地图,如果没有添加,则为null

我的猜测是你没有传递任何额外内容,因此将null传递给 Intent.putExtras()方法...或者如果你认为你是你可能会这样做不正确。

答案 1 :(得分:1)

从     。getIntent()getStringExtra(ARG_ACCOUNT_NAME);

我可以说你使用了putStringExtra方法,而不是putExtras。

因此,当您尝试getIntent()。getExtras时,它为null。