2015-11-16 5 views
6

Ich habe ein Problem in meinem Projekt gefunden. Ich möchte "Google API" verwenden, um mich in meinem LoginActivity anzumelden. Und Melden Sie sich von einer anderen Aktivität aus (benannt WelcomeActivity)mGoogleApiClient kann nicht in einer anderen Aktivität erreicht werden

LoginActivity: (Code ist here)

public class LoginActivity extends AppCompatActivity implements 
     GoogleApiClient.OnConnectionFailedListener, 
     View.OnClickListener { 

    // Configuration of Google API - Step 1/3 
    private static final String TAG = "LoginActivity"; 
    private static final int RC_SIGN_IN = 9001; 
    public static GoogleApiClient mGoogleApiClient; 
    private ProgressDialog mProgressDialog; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     GoogleAPI(); 

    } 
    public void GoogleAPI(){ 

     // Button listeners 
     findViewById(R.id.sign_in_button).setOnClickListener(this); 

     GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN) 
       .requestEmail() 
       .build(); 

     mGoogleApiClient = new GoogleApiClient.Builder(this) 
       .enableAutoManage(this /* FragmentActivity */, this /* OnConnectionFailedListener */) 
       .addApi(Auth.GOOGLE_SIGN_IN_API, gso) 
       .build(); 
    } 

    @Override 
    public void onStart() { 
     super.onStart(); 
     .... 
    } 

    // [START onActivityResult] 
    @Override 
    public void onActivityResult(int requestCode, int resultCode, Intent data) { 
     super.onActivityResult(requestCode, resultCode, data); 
     // Result returned from launching the Intent from GoogleSignInApi.getSignInIntent(...); 
     if (requestCode == RC_SIGN_IN) { 
      GoogleSignInResult result = Auth.GoogleSignInApi.getSignInResultFromIntent(data); 
      handleSignInResult(result); 
     } 
    } 
    // [END onActivityResult] 

    // [START handleSignInResult] 
    private void handleSignInResult(GoogleSignInResult result) { 

     if (result.isSuccess()) { 
      // Signed in successfully, show authenticated UI. 
      CustomApplication app = (CustomApplication)getApplication(); 
      GoogleSignInAccount acct = result.getSignInAccount(); 
      Intent i = new Intent(LoginActivity.this, WelcomePage.class); 
      i.putExtra("Username", acct.getDisplayName()); 
      startActivity(i); 
     } 
    } 
    // [END handleSignInResult] 

    // [START signIn] 
    private void signIn() { 
     Intent signInIntent = Auth.GoogleSignInApi.getSignInIntent(mGoogleApiClient); 
     startActivityForResult(signInIntent, RC_SIGN_IN); 
    } 
    // [END signIn] 

    @Override 
    public void onConnectionFailed(ConnectionResult connectionResult) { 
     ... 
    } 

    private void showProgressDialog() { 
     ... 
    } 

    private void hideProgressDialog() { 
     ... 
    } 

    @Override 
    public void onClick(View v) { 
     switch (v.getId()) { 
      case R.id.sign_in_button: 
       signIn(); 
       break; 
      …. 
     } 
    } 

} 

Und ich will Sign_out Methode in meiner Willkommen Aktivität verwenden,

private void signOut() { 
//  Auth.GoogleSignInApi.signOut(mGoogleApiClient).setResultCallback(
//    new ResultCallback<Status>() { 
//     @Override 
//     public void onResult(Status status) { 
//      // [START_EXCLUDE] 
////      updateUI(false); 
//      // [END_EXCLUDE] 
//     } 
//    }); 
// } 

Um dieses Problem zu lösen, versuche ich 2 Methoden:

  1. machen mGoogleApiClient als eine globale Variable (erweitert Application oder Singleton), ich versuche es, aber fehlgeschlagen, in der Begrüßungsseite, mGoogleApiClient ist nicht null, aber Fehler ist: mGoogleApiClient ist noch nicht verbunden.

  2. i nennen LoginActivity.getMGoogleApiClient (statische Variable), aber auch ausgefallen ist, derselbe Fehler: mGoogleApiClient ist noch nicht verbunden.

Ich suche dieses Problem bereits seit einigen Tagen, aber nichts nützlich, es zu lösen, bitte helfen Sie mir ..

+0

Mögliches Duplikat von [Zugriff google plus client von mehreren Aktivitäten] (http://stackoverflow.com/questions/16827839/access-google-plus-client-from-multiple-activities) – V01D1

Antwort

5

Wenn Sie enableAutoManage, dann ist die googleApiClient verbunden wird onStart und trennt onStop und wird automatisch von der Bibliothek behandelt. Was Sie können, ist, den Benutzer in der anderen Aktivität abzumelden, wie auch immer Ihr Code ist, um den Benutzer von Ihrem Backend abzumelden, außer sich noch nicht von Google abzumelden.

Pseudo-Code:

private void logOut(){ 
    //your logout code in the log out activity 

    setCurrentUser(null); 
} 

Und in der Tätigkeit mit dem googleApiClient, können Sie überprüfen, ob der Benutzer in onConnected Rückruf von googleApiClient-angemeldet ist. Wenn der aktuelle Benutzer nicht angemeldet ist, melden Sie den Nutzer bei Google ab.

@Override 
public void onConnected(Bundle connectionHint) { 

    if (getCurrentUser() == null){ 
     signOut(); 
    } 

} 

private void signOut() { 
    Auth.GoogleSignInApi.signOut(mGoogleApiClientPlus).setResultCallback(
      new ResultCallback<Status>() { 
       @Override 
       public void onResult(Status status) { 
        //signed out. 
       } 
      }); 
} 

Wenn Sie nicht enableAutoManage verwenden und trennen Sie die Kunden nicht in OnStop (was ich weiß nicht, ob es empfehlenswert ist), könnten Sie Ihre 2-Methoden verwenden, aber ich werde mit statischen Feldern nicht empfehlen für das googleApiClient-Objekt.

+0

Was Sie geschrieben haben, ist wirklich gut, es ist das AutoManage, Sie helfen mir, es zu verstehen. Vielen Dank! –

+0

Ich bin froh, dass es dir geholfen hat. Ich hatte selbst ein ähnliches Problem. –

+0

Hey, ich habe Zweifel, wenn ich die AutoManagement, mgoogleApiClient trennen in welcher Funktion? Ich versuche, einen Test zu machen, aber es ist nicht in onDestory() oder onStop() .. –

1

Eine Lösung ist Ihre normale Abmelde Flow (ignorieren mGoogleApiClient) zu tun. Das nächste Mal, wenn der Benutzer die App zum Login-Bildschirm öffnet sich und schlägt Google Login, können Sie sie zuerst ausloggen, dann tun Sie das Google-Login

zB:

private void googleLogin() { 
    googleLogout(); 
    Intent signInIntent = Auth.GoogleSignInApi.getSignInIntent(mGoogleApiClient); 
    startActivityForResult(signInIntent, RC_SIGN_IN); 
} 

private void googleLogout() { 
    if (mGoogleApiClient.isConnected()) { 
    Auth.GoogleSignInApi.signOut(mGoogleApiClient); 
    } 
} 
+0

ich denke, es ist eine Lösung, aber ist wirklich ein Problem, danke –

+2

'mGoogleApiClient.isConnected()' immer falsch zurückgeben. Beim Versuch, connect() aufzurufen, wird IllegalStateException ausgelöst. – whoami