当我使用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;
}
答案 0 :(得分:1)
基于API:
Intent.getExtras()返回: 以前使用putExtra()添加的所有额外内容的地图,如果没有添加,则为null
我的猜测是你没有传递任何额外内容,因此将null传递给 Intent.putExtras()方法...或者如果你认为你是你可能会这样做不正确。
答案 1 :(得分:1)
从 。getIntent()getStringExtra(ARG_ACCOUNT_NAME);
我可以说你使用了putStringExtra方法,而不是putExtras。
因此,当您尝试getIntent()。getExtras时,它为null。