2015-11-16 25 views
6

Projemde bir sorunla karşılaştım. LoginActivity adresinde oturum açmak için "Google API" kullanmak istiyorum. Ve (WelcomeActivity adlandırılır) başka FaaliyetmGoogleApiClient başka bir etkinlikte gerçekleştirilemiyor

LoginActivity dan çıkış yapın: (kod here olan)

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; 
      …. 
     } 
    } 

} 

Ve ben Hoşgeldin aktivitesinde Sign_out Yöntemini kullanmak istiyorum

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

Bu sorunu çözmek için 2 yöntem deneyin:

  1. mGoogleApiClient'ı global bir değişken olarak yapın (Uygulama veya Tekil'i genişletir), onu deneyin, ancak Hoş Geldiniz sayfasında başarısız oldu, mGoogleApiClient boş değil, ancak hata: mGoogleApiClient henüz bağlı değil.

  2. i LoginActivity.getMGoogleApiClient (statik değişken) diyoruz, ama aynı zamanda başarısız oldu, aynı hata: mGoogleApiClient henüz bağlı değildir.

+0

Olası çoğaltılabilir [Birden çok etkinlikten google plus istemcisine erişin] (http://stackoverflow.com/questions/16827839/access-google-plus-client-from-multiple-activities) – V01D1

cevap

5

Eğer enableAutoManage ardından googleApiClient bağlı olur: kullanıcı giriş ekranına uygulamanızı açar ve google giriş vurur dahaki sefere, önce onları oturumu ardından

örneğin Google giriş yapmak onStart ve onStop bağlantısı kesilir ve kütüphane tarafından otomatik olarak ele alınır. Yapabildiğiniz şey, diğer etkinlikte kullanıcıyı çıkış yapmak, kodunuz ne olursa olsun kullanıcıyı arka uçtan çıkış yapmaktır, ancak henüz Google'dan çıkış yapma.

sözde kod:

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

    setCurrentUser(null); 
} 

Ve googleApiClient ile aktivitesinde

, kullanıcı giriş yapmadığı takdirde googleApiClient arasında onConnected geri aramasında kontrol edebilir. Mevcut kullanıcı giriş yapmadıysa, kullanıcıyı Google'dan çıkış yapın. Eğer enableAutoManage kullanmayan ve (önerilir mı onu da bilmiyorum olan) OnStop müşteriyi kesmek yoksa

@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. 
       } 
      }); 
} 

, size 2 yöntem kullanabilirsiniz ama ben statik alanları kullanarak tavsiye olmaz googleApiClient nesnesi için.

+0

Yazdıklarınız gerçekten çok iyi, autoManage, bunu anlamama yardımcı oluyorsunuz. Çok teşekkür ederim! –

+0

Size yardımcı olduğuna sevindim. Benzer bir sorunla kendime sıkışmıştım. –

+0

Hey, autoManagement, mgoogleApiClient bağlantıyı hangi işlevde kullanırsam, şüphem var mı? Bir sınama yapmaya çalışıyorum, ancak onDestory() veya onStop() içinde değil. –

1

bir çözüm normal çıkış akışı (mGoogleApiClient görmezden) yapmaktır .. Zaten günlerdir bu sorunu aramak, ancak bunu çözmek için yararlı bir şey, bana yardım edin.

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

Bunun bir çözüm olduğunu düşünüyorum. ama gerçekten bir sorun, teşekkürler –

+2

'mGoogleApiClient.isConnected()' her zaman false döndürür. connect() öğesini çağırmaya çalışırken, IllegalStateException atılır. – whoami

İlgili konular