google plus login 出现空指针异常
Null pointer exception in google plus login
我是 android 的新手。我在我的应用程序中集成 google 加登录。但它在 mConnectionResult.hasResolution 处显示空指针异常
这是我的代码
btnSignIn = (SignInButton) findViewById(R.id.btn_sign_in);
btnSignIn.setOnClickListener(this);
mGoogleApiClient = new GoogleApiClient.Builder(this)
.addConnectionCallbacks(this)
.addOnConnectionFailedListener(this).addApi(Plus.API)
.addScope(Plus.SCOPE_PLUS_LOGIN).build();
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
callbackManager.onActivityResult(requestCode, resultCode, data);
if (requestCode == RC_SIGN_IN) {
if (resultCode != RESULT_OK) {
mSignInClicked = false;
}
mIntentInProgress = false;
if (!mGoogleApiClient.isConnecting()) {
mGoogleApiClient.connect();
}
}
}
protected void onStart() {
super.onStart();
mGoogleApiClient.connect();
}
protected void onStop() {
super.onStop();
if (mGoogleApiClient.isConnected()) {
mGoogleApiClient.disconnect();
}
}
/**
* Method to resolve any signin errors
*/
private void resolveSignInError() {
if (mConnectionResult.hasResolution()) {
try {
mIntentInProgress = true;
mConnectionResult.startResolutionForResult(this, RC_SIGN_IN);
} catch (IntentSender.SendIntentException e) {
mIntentInProgress = false;
mGoogleApiClient.connect();
}
}
}
@Override
public void onConnectionFailed(ConnectionResult result) {
if (!result.hasResolution()) {
GooglePlayServicesUtil.getErrorDialog(result.getErrorCode(), this,
0).show();
return;
}
if (!mIntentInProgress) {
// Store the ConnectionResult for later usage
mConnectionResult = result;
if (mSignInClicked) {
// The user has already clicked 'sign-in' so we attempt to
// resolve all
// errors until the user is signed in, or they cancel.
resolveSignInError();
}
}
}
@Override
public void onConnected(Bundle arg0) {
mSignInClicked = false;
if (temp == true) {
type = "2";
Toast.makeText(this, "User is connected!", Toast.LENGTH_LONG).show();
Intent i = new Intent(RegisterSkipActivity.this, MainActivity.class);
i.putExtra("Login", type);
startActivity(i);
temp = false;
}
}
@Override
public void onConnectionSuspended(int arg0) {
mGoogleApiClient.connect();
//updateUI(false);
}
@Override
public void onClick(View v) {
// Signin button clicked
signInWithGplus();
temp = true;
}
/**
* Sign-in into google
*/
private void signInWithGplus() {
if (!mGoogleApiClient.isConnecting()) {
mSignInClicked = true;
resolveSignInError();
}
}
resolveSignInError() 中这一行的空指针异常
if (mConnectionResult.hasResolution())
请帮助我。这是Logcat
java.lang.NullPointerException
at com.techieweb.solutions.pickeronline.RegisterSkipActivity.resolveSignInError(RegisterSkipActivity.java:214)
at com.techieweb.solutions.pickeronline.RegisterSkipActivity.signInWithGplus(RegisterSkipActivity.java:284)
at com.techieweb.solutions.pickeronline.RegisterSkipActivity.onClick(RegisterSkipActivity.java:273)
at com.google.android.gms.common.SignInButton.onClick(Unknown Source)
at android.view.View.performClick(View.java:4439)
at android.widget.Button.performClick(Button.java:139)
at android.view.View$PerformClick.run(View.java:18395)
at android.os.Handler.handleCallback(Handler.java:725)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:176)
at android.app.ActivityThread.main(ActivityThread.java:5317)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1102)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:869)
at dalvik.system.NativeStart.main(Native Method)
您正在使用旧的 Google-Sign 方法(在播放服务 8.3 之前)。如果您构建的应用程序使用旧的 Google 登录,您将构建一个尝试连接到 GoogleApiClient 的应用程序。此时,用户会看到一个帐户选择器 and/or 一个权限对话框,这两个对话框都会触发连接失败。
您必须处理这些连接失败才能登录。一旦 GoogleApiClient 连接,则认为用户已登录并可以授予权限。
参考此 codelab by google 来处理此类故障并使用该方法实现登录。
现在最好的选择是试用新的 Google-Sign In with play services 8.3。它更顺畅,并自动为您处理此类连接失败。
另请查看官方 android 开发者博客以获取更多信息。
您仅在 OnConnectionFailed
回调中初始化 mConnectionResult
。 resolveSignInError()
方法甚至在此回调之前被调用,因此 mConnectionResult
为空。
您可以进行 null 检查,或者确保您的回调方法已被触发。要确认只需在 onConnectionFailed()
和 resolveSignInError()
中添加日志。你会注意到哪个先被调用。
我是 android 的新手。我在我的应用程序中集成 google 加登录。但它在 mConnectionResult.hasResolution 处显示空指针异常 这是我的代码
btnSignIn = (SignInButton) findViewById(R.id.btn_sign_in);
btnSignIn.setOnClickListener(this);
mGoogleApiClient = new GoogleApiClient.Builder(this)
.addConnectionCallbacks(this)
.addOnConnectionFailedListener(this).addApi(Plus.API)
.addScope(Plus.SCOPE_PLUS_LOGIN).build();
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
callbackManager.onActivityResult(requestCode, resultCode, data);
if (requestCode == RC_SIGN_IN) {
if (resultCode != RESULT_OK) {
mSignInClicked = false;
}
mIntentInProgress = false;
if (!mGoogleApiClient.isConnecting()) {
mGoogleApiClient.connect();
}
}
}
protected void onStart() {
super.onStart();
mGoogleApiClient.connect();
}
protected void onStop() {
super.onStop();
if (mGoogleApiClient.isConnected()) {
mGoogleApiClient.disconnect();
}
}
/**
* Method to resolve any signin errors
*/
private void resolveSignInError() {
if (mConnectionResult.hasResolution()) {
try {
mIntentInProgress = true;
mConnectionResult.startResolutionForResult(this, RC_SIGN_IN);
} catch (IntentSender.SendIntentException e) {
mIntentInProgress = false;
mGoogleApiClient.connect();
}
}
}
@Override
public void onConnectionFailed(ConnectionResult result) {
if (!result.hasResolution()) {
GooglePlayServicesUtil.getErrorDialog(result.getErrorCode(), this,
0).show();
return;
}
if (!mIntentInProgress) {
// Store the ConnectionResult for later usage
mConnectionResult = result;
if (mSignInClicked) {
// The user has already clicked 'sign-in' so we attempt to
// resolve all
// errors until the user is signed in, or they cancel.
resolveSignInError();
}
}
}
@Override
public void onConnected(Bundle arg0) {
mSignInClicked = false;
if (temp == true) {
type = "2";
Toast.makeText(this, "User is connected!", Toast.LENGTH_LONG).show();
Intent i = new Intent(RegisterSkipActivity.this, MainActivity.class);
i.putExtra("Login", type);
startActivity(i);
temp = false;
}
}
@Override
public void onConnectionSuspended(int arg0) {
mGoogleApiClient.connect();
//updateUI(false);
}
@Override
public void onClick(View v) {
// Signin button clicked
signInWithGplus();
temp = true;
}
/**
* Sign-in into google
*/
private void signInWithGplus() {
if (!mGoogleApiClient.isConnecting()) {
mSignInClicked = true;
resolveSignInError();
}
}
resolveSignInError() 中这一行的空指针异常
if (mConnectionResult.hasResolution())
请帮助我。这是Logcat
java.lang.NullPointerException
at com.techieweb.solutions.pickeronline.RegisterSkipActivity.resolveSignInError(RegisterSkipActivity.java:214)
at com.techieweb.solutions.pickeronline.RegisterSkipActivity.signInWithGplus(RegisterSkipActivity.java:284)
at com.techieweb.solutions.pickeronline.RegisterSkipActivity.onClick(RegisterSkipActivity.java:273)
at com.google.android.gms.common.SignInButton.onClick(Unknown Source)
at android.view.View.performClick(View.java:4439)
at android.widget.Button.performClick(Button.java:139)
at android.view.View$PerformClick.run(View.java:18395)
at android.os.Handler.handleCallback(Handler.java:725)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:176)
at android.app.ActivityThread.main(ActivityThread.java:5317)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1102)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:869)
at dalvik.system.NativeStart.main(Native Method)
您正在使用旧的 Google-Sign 方法(在播放服务 8.3 之前)。如果您构建的应用程序使用旧的 Google 登录,您将构建一个尝试连接到 GoogleApiClient 的应用程序。此时,用户会看到一个帐户选择器 and/or 一个权限对话框,这两个对话框都会触发连接失败。
您必须处理这些连接失败才能登录。一旦 GoogleApiClient 连接,则认为用户已登录并可以授予权限。
参考此 codelab by google 来处理此类故障并使用该方法实现登录。
现在最好的选择是试用新的 Google-Sign In with play services 8.3。它更顺畅,并自动为您处理此类连接失败。
另请查看官方 android 开发者博客以获取更多信息。
您仅在 OnConnectionFailed
回调中初始化 mConnectionResult
。 resolveSignInError()
方法甚至在此回调之前被调用,因此 mConnectionResult
为空。
您可以进行 null 检查,或者确保您的回调方法已被触发。要确认只需在 onConnectionFailed()
和 resolveSignInError()
中添加日志。你会注意到哪个先被调用。