Reputation: 79
Have created a Google Account login/logout method. Main idea is that when user clicks on
"Sign in with Google", it will navigate the user to the User Profile page and when user decides to logou, the Google logout method will be called and re-direct user back to the HomePage. However, the issue is that when user clicks on the logout button, the following error occurs, what has happened? Please help
I have attached the following code and error log
error log:
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$1.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)
Code:
//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();
Plus.AccountApi.clearDefaultAccount(mGoogleApiClient);
mGoogleApiClient.disconnect();
mGoogleApiClient.connect();
Intent intent= new Intent(getApplicationContext(),
ChannelAppMainActivity.class);
startActivity(intent);
}
break;
EDITED CODE:
//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
Upvotes: 1
Views: 809
Reputation: 79
Managed to troubleshoot and found the issue that has been plaguing the project:
Initial issue:
Solutions:
Plus.AccountApi.clearDefaultAccount(mGoogleApiClient);
from the logout method as there is no default account to begin with when user first access the app.Updated code:
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.
Upvotes: -1
Reputation: 2289
else{
mPlusClient.clearDefaultAccount();
mPlusClient.disconnect();
mPlusClient.connect();
Intent intent= new Intent(getApplicationContext(),
ChannelAppMainActivity.class);
startActivity(intent);
}
chnge it
else{
mPlusClient.clearDefaultAccount();
mPlusClient.disconnect();
mPlusClient.connect();
Intent intent = getIntent();
finish();
startActivity(intent);
}
Upvotes: 2