注销 Google 帐户时出现 NullPointer 异常
NullPointer Exception when logging out of Google Account
已创建 Google 帐户 login/logout 方法。主要思想是当用户点击
"Sign in with Google",它会将用户导航到用户配置文件页面,当用户决定注销时,将调用 Google 注销方法并将用户重定向回主页。但是,问题是当用户点击注销按钮时,会出现以下错误,这是怎么回事?请帮助
我已附上以下代码和错误日志
错误日志:
01-12 11:38:29.492: E/AndroidRuntime(20881): FATAL EXCEPTION: main
01-12 11:38:29.492: E/AndroidRuntime(20881): java.lang.IllegalStateException: GoogleApiClient must be connected.
01-12 11:38:29.492: E/AndroidRuntime(20881): at com.google.android.gms.common.internal.n.a(Unknown Source)
01-12 11:38:29.492: E/AndroidRuntime(20881): at com.google.android.gms.internal.no.a(Unknown Source)
01-12 11:38:29.492: E/AndroidRuntime(20881): at com.google.android.gms.internal.no.clearDefaultAccount(Unknown Source)
01-12 11:38:29.492: E/AndroidRuntime(20881): at com.dapoaugury.channelappdemo.ChannelAppMainActivity$DrawerItemClickListener.onItemClick(ChannelAppMainActivity.java:409)
01-12 11:38:29.492: E/AndroidRuntime(20881): at android.widget.AdapterView.performItemClick(AdapterView.java:298)
01-12 11:38:29.492: E/AndroidRuntime(20881): at android.widget.AbsListView.performItemClick(AbsListView.java:1107)
01-12 11:38:29.492: E/AndroidRuntime(20881): at android.widget.AbsListView$PerformClick.run(AbsListView.java:2756)
01-12 11:38:29.492: E/AndroidRuntime(20881): at android.widget.AbsListView.run(AbsListView.java:3430)
01-12 11:38:29.492: E/AndroidRuntime(20881): at android.os.Handler.handleCallback(Handler.java:725)
01-12 11:38:29.492: E/AndroidRuntime(20881): at android.os.Handler.dispatchMessage(Handler.java:92)
01-12 11:38:29.492: E/AndroidRuntime(20881): at android.os.Looper.loop(Looper.java:137)
01-12 11:38:29.492: E/AndroidRuntime(20881): at android.app.ActivityThread.main(ActivityThread.java:5039)
01-12 11:38:29.492: E/AndroidRuntime(20881): at java.lang.reflect.Method.invokeNative(Native Method)
01-12 11:38:29.492: E/AndroidRuntime(20881): at java.lang.reflect.Method.invoke(Method.java:511)
01-12 11:38:29.492: E/AndroidRuntime(20881): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
01-12 11:38:29.492: E/AndroidRuntime(20881): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
01-12 11:38:29.492: E/AndroidRuntime(20881): at dalvik.system.NativeStart.main(Native Method)
代码:
//注销:
案例 2:
//DAPO:DEV02-20141231: login/logout 选项的交替,当用户登录时登录更改为注销,反之亦然
if (isLogin.equals("Login")){
//If tab is login, user has not logged in, will navigate user to the login page and allow user to do a Google Login
Intent intent = new Intent(getApplicationContext(),
ChannelAppLoginInfoMainActivity.class);
startActivity(intent);
}if (isLogin.equals("Logout")){
//DAPO:DEV02:20150107:if tab is logout, will navigate user back to home page after user has logged out of Google account.
Toast.makeText(getApplicationContext(), "Logging out of ChannelApp!", Toast.LENGTH_LONG).show();
Plus.AccountApi.clearDefaultAccount(mGoogleApiClient);
mGoogleApiClient.disconnect();
mGoogleApiClient.connect();
Intent intent= new Intent(getApplicationContext(),
ChannelAppMainActivity.class);
startActivity(intent);
}
break;
编辑代码:
//DAPO:DEV02-20150108: Declare Google variable:Google+client
private GoogleApiClient mGoogleApiClient;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//DAPO:DEV02-20150107: Initialize GoogleApiClient variable
mGoogleApiClient= new GoogleApiClient.Builder(this).addApi(Plus.API).
addScope(Plus.SCOPE_PLUS_LOGIN).build();
}
//DAPO:DEV02-20150110: Invoking of GoogleApiClient and connecting GoogleApiClient
@Override
protected void onStart() {
super.onStart();
// Connect To Drive and Google+
mGoogleApiClient.connect();
}
@Override
protected void onStop(){
super.onStop();
// Disconnect from Drive and Google+
mGoogleApiClient.disconnect();
}
protected void onConnected(Bundle ConnectionHint){
//All Clients are connected
Intent intent = new Intent(getApplicationContext(),
ChannelAppAbstractGetNameTask.class);
startActivity(intent);
}
//DAPO:DEV02-20150110: End of Edited Version of Invoking of GoogleApiClient and connecting GoogleApiClient
else{
mPlusClient.clearDefaultAccount();
mPlusClient.disconnect();
mPlusClient.connect();
Intent intent= new Intent(getApplicationContext(),
ChannelAppMainActivity.class);
startActivity(intent);
}
改变它
else{
mPlusClient.clearDefaultAccount();
mPlusClient.disconnect();
mPlusClient.connect();
Intent intent = getIntent();
finish();
startActivity(intent);
}
设法解决并发现了一直困扰项目的问题:
初刊:
- GoogleApiClient 一直提示连接
- Activity 一直将用户导航到没有用户 Google 凭据的空用户配置文件页面
解法:
- 声明 GoogleApiClient 的参数(下面列出的代码)
- 从注销方法中删除了
Plus.AccountApi.clearDefaultAccount(mGoogleApiClient);
,因为当用户首次访问应用程序时没有默认帐户。
更新代码:
mGoogleApiClient= new GoogleApiClient.Builder(this).addApi(Plus.API).
addScope(Plus.SCOPE_PLUS_LOGIN).build();
//DAPO:DEV02-20150110: Invoking of GoogleApiClient and connecting GoogleApiClient
@Override
protected void onStart() {
super.onStart();
// Connect To Drive and Google+
mGoogleApiClient.connect();
}
@Override
protected void onStop(){
super.onStop();
// Disconnect from Drive and Google+
if(mGoogleApiClient.isConnected()){
mGoogleApiClient.disconnect();
}
}
protected void onConnected(Bundle ConnectionHint){
//All Clients are connected
mSignInClicked=false;
Toast.makeText(this, "User is connected!", Toast.LENGTH_LONG).show();
}
/* A helper method to resolve the current ConnectionResult error. */
private void resolveSignInError() {
if (mConnectionResult.hasResolution()) {
try {
mIntentInProgress = true;
startIntentSenderForResult(mConnectionResult.getResolution().getIntentSender(),
RC_SIGN_IN, null, 0, 0, 0);
} catch (SendIntentException e) {
// The intent was canceled before it was sent. Return to the default
// state and attempt to connect to get an updated ConnectionResult.
mIntentInProgress = false;
mGoogleApiClient.connect();
}
}
}
protected void onActivityResult(int requestCode, int responseCode, Intent intent) {
if (requestCode == RC_SIGN_IN) {
if (responseCode != RESULT_OK) {
mSignInClicked = false;
}
mIntentInProgress = false;
if (!mGoogleApiClient.isConnecting()) {
mGoogleApiClient.connect();
}
}
}
//DAPO:DEV02-20150110: End of Edited Version of Invoking of GoogleApiClient and connecting GoogleApiClient
//Logout:
case 2:
//DAPO:DEV02-20141231: alternation of login/logout options, login to change to logout when user is login and vice versa
if (isLogin.equals("Login")){
//If tab is login, user has not logged in, will navigate user to the login page and allow user to do a Google Login
Intent intent = new Intent(getApplicationContext(),
ChannelAppLoginInfoMainActivity.class);
startActivity(intent);
}if (isLogin.equals("Logout")){
//DAPO:DEV02:20150107:if tab is logout, will navigate user back to home page after user has logged out of Google account.
Toast.makeText(getApplicationContext(), "Logging out of ChannelApp!", Toast.LENGTH_LONG).show();
//To disconnect user from GoogleApiClient server, remove all Google login credentials.
mGoogleApiClient.disconnect();
mGoogleApiClient.connect();
//Return user to Main HomePage
startActivity(new Intent(getApplicationContext(), ChannelAppMainActivity.class));
// make sure the user can not access the page after he/she is logged out
// clear the activity stack
finish();
}
break;
//DAPO:DEV02-20141231: End of Edited Version to implement GoogleApiClient logout method and implementation for login/logout method.
已创建 Google 帐户 login/logout 方法。主要思想是当用户点击
"Sign in with Google",它会将用户导航到用户配置文件页面,当用户决定注销时,将调用 Google 注销方法并将用户重定向回主页。但是,问题是当用户点击注销按钮时,会出现以下错误,这是怎么回事?请帮助
我已附上以下代码和错误日志
错误日志:
01-12 11:38:29.492: E/AndroidRuntime(20881): FATAL EXCEPTION: main
01-12 11:38:29.492: E/AndroidRuntime(20881): java.lang.IllegalStateException: GoogleApiClient must be connected.
01-12 11:38:29.492: E/AndroidRuntime(20881): at com.google.android.gms.common.internal.n.a(Unknown Source)
01-12 11:38:29.492: E/AndroidRuntime(20881): at com.google.android.gms.internal.no.a(Unknown Source)
01-12 11:38:29.492: E/AndroidRuntime(20881): at com.google.android.gms.internal.no.clearDefaultAccount(Unknown Source)
01-12 11:38:29.492: E/AndroidRuntime(20881): at com.dapoaugury.channelappdemo.ChannelAppMainActivity$DrawerItemClickListener.onItemClick(ChannelAppMainActivity.java:409)
01-12 11:38:29.492: E/AndroidRuntime(20881): at android.widget.AdapterView.performItemClick(AdapterView.java:298)
01-12 11:38:29.492: E/AndroidRuntime(20881): at android.widget.AbsListView.performItemClick(AbsListView.java:1107)
01-12 11:38:29.492: E/AndroidRuntime(20881): at android.widget.AbsListView$PerformClick.run(AbsListView.java:2756)
01-12 11:38:29.492: E/AndroidRuntime(20881): at android.widget.AbsListView.run(AbsListView.java:3430)
01-12 11:38:29.492: E/AndroidRuntime(20881): at android.os.Handler.handleCallback(Handler.java:725)
01-12 11:38:29.492: E/AndroidRuntime(20881): at android.os.Handler.dispatchMessage(Handler.java:92)
01-12 11:38:29.492: E/AndroidRuntime(20881): at android.os.Looper.loop(Looper.java:137)
01-12 11:38:29.492: E/AndroidRuntime(20881): at android.app.ActivityThread.main(ActivityThread.java:5039)
01-12 11:38:29.492: E/AndroidRuntime(20881): at java.lang.reflect.Method.invokeNative(Native Method)
01-12 11:38:29.492: E/AndroidRuntime(20881): at java.lang.reflect.Method.invoke(Method.java:511)
01-12 11:38:29.492: E/AndroidRuntime(20881): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
01-12 11:38:29.492: E/AndroidRuntime(20881): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
01-12 11:38:29.492: E/AndroidRuntime(20881): at dalvik.system.NativeStart.main(Native Method)
代码:
//注销:
案例 2:
//DAPO:DEV02-20141231: login/logout 选项的交替,当用户登录时登录更改为注销,反之亦然
if (isLogin.equals("Login")){
//If tab is login, user has not logged in, will navigate user to the login page and allow user to do a Google Login
Intent intent = new Intent(getApplicationContext(),
ChannelAppLoginInfoMainActivity.class);
startActivity(intent);
}if (isLogin.equals("Logout")){
//DAPO:DEV02:20150107:if tab is logout, will navigate user back to home page after user has logged out of Google account.
Toast.makeText(getApplicationContext(), "Logging out of ChannelApp!", Toast.LENGTH_LONG).show();
Plus.AccountApi.clearDefaultAccount(mGoogleApiClient);
mGoogleApiClient.disconnect();
mGoogleApiClient.connect();
Intent intent= new Intent(getApplicationContext(),
ChannelAppMainActivity.class);
startActivity(intent);
}
break;
编辑代码:
//DAPO:DEV02-20150108: Declare Google variable:Google+client
private GoogleApiClient mGoogleApiClient;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//DAPO:DEV02-20150107: Initialize GoogleApiClient variable
mGoogleApiClient= new GoogleApiClient.Builder(this).addApi(Plus.API).
addScope(Plus.SCOPE_PLUS_LOGIN).build();
}
//DAPO:DEV02-20150110: Invoking of GoogleApiClient and connecting GoogleApiClient
@Override
protected void onStart() {
super.onStart();
// Connect To Drive and Google+
mGoogleApiClient.connect();
}
@Override
protected void onStop(){
super.onStop();
// Disconnect from Drive and Google+
mGoogleApiClient.disconnect();
}
protected void onConnected(Bundle ConnectionHint){
//All Clients are connected
Intent intent = new Intent(getApplicationContext(),
ChannelAppAbstractGetNameTask.class);
startActivity(intent);
}
//DAPO:DEV02-20150110: End of Edited Version of Invoking of GoogleApiClient and connecting GoogleApiClient
else{
mPlusClient.clearDefaultAccount();
mPlusClient.disconnect();
mPlusClient.connect();
Intent intent= new Intent(getApplicationContext(),
ChannelAppMainActivity.class);
startActivity(intent);
}
改变它
else{
mPlusClient.clearDefaultAccount();
mPlusClient.disconnect();
mPlusClient.connect();
Intent intent = getIntent();
finish();
startActivity(intent);
}
设法解决并发现了一直困扰项目的问题:
初刊:
- GoogleApiClient 一直提示连接
- Activity 一直将用户导航到没有用户 Google 凭据的空用户配置文件页面
解法:
- 声明 GoogleApiClient 的参数(下面列出的代码)
- 从注销方法中删除了
Plus.AccountApi.clearDefaultAccount(mGoogleApiClient);
,因为当用户首次访问应用程序时没有默认帐户。
更新代码:
mGoogleApiClient= new GoogleApiClient.Builder(this).addApi(Plus.API).
addScope(Plus.SCOPE_PLUS_LOGIN).build();
//DAPO:DEV02-20150110: Invoking of GoogleApiClient and connecting GoogleApiClient
@Override
protected void onStart() {
super.onStart();
// Connect To Drive and Google+
mGoogleApiClient.connect();
}
@Override
protected void onStop(){
super.onStop();
// Disconnect from Drive and Google+
if(mGoogleApiClient.isConnected()){
mGoogleApiClient.disconnect();
}
}
protected void onConnected(Bundle ConnectionHint){
//All Clients are connected
mSignInClicked=false;
Toast.makeText(this, "User is connected!", Toast.LENGTH_LONG).show();
}
/* A helper method to resolve the current ConnectionResult error. */
private void resolveSignInError() {
if (mConnectionResult.hasResolution()) {
try {
mIntentInProgress = true;
startIntentSenderForResult(mConnectionResult.getResolution().getIntentSender(),
RC_SIGN_IN, null, 0, 0, 0);
} catch (SendIntentException e) {
// The intent was canceled before it was sent. Return to the default
// state and attempt to connect to get an updated ConnectionResult.
mIntentInProgress = false;
mGoogleApiClient.connect();
}
}
}
protected void onActivityResult(int requestCode, int responseCode, Intent intent) {
if (requestCode == RC_SIGN_IN) {
if (responseCode != RESULT_OK) {
mSignInClicked = false;
}
mIntentInProgress = false;
if (!mGoogleApiClient.isConnecting()) {
mGoogleApiClient.connect();
}
}
}
//DAPO:DEV02-20150110: End of Edited Version of Invoking of GoogleApiClient and connecting GoogleApiClient
//Logout:
case 2:
//DAPO:DEV02-20141231: alternation of login/logout options, login to change to logout when user is login and vice versa
if (isLogin.equals("Login")){
//If tab is login, user has not logged in, will navigate user to the login page and allow user to do a Google Login
Intent intent = new Intent(getApplicationContext(),
ChannelAppLoginInfoMainActivity.class);
startActivity(intent);
}if (isLogin.equals("Logout")){
//DAPO:DEV02:20150107:if tab is logout, will navigate user back to home page after user has logged out of Google account.
Toast.makeText(getApplicationContext(), "Logging out of ChannelApp!", Toast.LENGTH_LONG).show();
//To disconnect user from GoogleApiClient server, remove all Google login credentials.
mGoogleApiClient.disconnect();
mGoogleApiClient.connect();
//Return user to Main HomePage
startActivity(new Intent(getApplicationContext(), ChannelAppMainActivity.class));
// make sure the user can not access the page after he/she is logged out
// clear the activity stack
finish();
}
break;
//DAPO:DEV02-20141231: End of Edited Version to implement GoogleApiClient logout method and implementation for login/logout method.