2015-11-16 6 views
6

मुझे मेरी परियोजना में एक समस्या से मुलाकात हुई। मैं अपने लॉगिन एक्टिविटी में लॉग इन करने के लिए "Google API" का उपयोग करना चाहता हूं। और एक और गतिविधि (WelcomeActivity नाम)mGoogleApiClient किसी अन्य गतिविधि में प्राप्त नहीं किया जा सकता

LoginActivity से बाहर लॉग इन करें: (कोड 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; 
      …. 
     } 
    } 

} 

और मैं अपने में आपका स्वागत है गतिविधि में Sign_out विधि का उपयोग करना चाहते,

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

इस समस्या को हल करने के लिए, मैं 2 विधियों का प्रयास करता हूं:

  1. वैश्विक चर के रूप में mGoogleApiClient को बनाते हैं (एप्लिकेशन या सिंगलटन बढ़ाता है), मैं कोशिश करता हूं, लेकिन असफल रहा, स्वागत पृष्ठ में, mGoogleApiClient शून्य नहीं है, लेकिन त्रुटि है: mGoogleApiClient अभी तक कनेक्ट नहीं है।

  2. मैं LoginActivity.getMGoogleApiClient (स्थिर चर) कहते हैं, लेकिन यह भी विफल रहा है, एक ही त्रुटि: mGoogleApiClient अभी तक जुड़ा हुआ नहीं है

मैं पहले से ही दिनों के लिए इस समस्या को खोजते हैं, लेकिन इसे हल करने के लिए उपयोगी कुछ भी नहीं है, कृपया मेरी मदद करो ..

+0

[एकाधिक गतिविधियों से Google प्लस क्लाइंट तक पहुंच] के संभावित डुप्लिकेट (http://stackoverflow.com/questions/16827839/access-google-plus-client-from-multiple-activities) – V01D1

उत्तर

5

जब आप enableAutoManage, तो googleApiClient जुड़ा हो जाता है: अगली बार जब उपयोगकर्ता लॉगिन स्क्रीन पर आपका ऐप्लिकेशन खुलने और गूगल लॉगिन मारता है, आप उन्हें बाहर पहले प्रवेश करें, फिर गूगल लॉगिन

जैसे करना ऑनस्टार्ट और डिस्क पर डिस्कनेक्ट हो जाता है और लाइब्रेरी द्वारा स्वचालित रूप से संभाला जाता है। आप क्या कर सकते हैं, दूसरी गतिविधि में उपयोगकर्ता को लॉगआउट करें, जो भी आपका कोड उपयोगकर्ता को बैकएंड से लॉगआउट करना है, सिवाय इसके कि Google से अभी तक साइन आउट न करें।

छद्म कोड:

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

    setCurrentUser(null); 
} 

और googleApiClient साथ गतिविधि में, आप की जांच कर सकता है, तो उपयोगकर्ता googleApiClient की onConnected कॉलबैक में लॉग-इन कर रहा है। यदि वर्तमान उपयोगकर्ता लॉग इन नहीं है, तो Google से उपयोगकर्ता को साइन आउट करें।

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

आप enableAutoManage उपयोग नहीं करते हैं और onStop में ग्राहक डिस्कनेक्ट नहीं है (अगर यह अनुशंसा की जाती है जो मैं नहीं जानता), आप अपने 2 तरीकों का उपयोग कर सकता है, लेकिन मैं स्थिर फ़ील्ड का उपयोग का सुझाव नहीं देंगे googleApiClient ऑब्जेक्ट के लिए।

+0

आपने जो लिखा है वह वास्तव में अच्छा है, यह ऑटोमैनेज है, आप इसे समझने में मेरी सहायता करते हैं। आपका बहुत बहुत धन्यवाद! –

+0

खुशी है कि यह आपकी मदद की। मैं खुद को एक ही समस्या से फंस गया था। –

+0

अरे, मुझे संदेह है, अगर मैं ऑटोमैनेजमेंट का उपयोग करता हूं, तो mgoogleApiClient डिस्कनेक्ट किस फ़ंक्शन में है? मैं एक परीक्षण करने की कोशिश करता हूं, लेकिन यह ऑनस्टोरी() या ऑनस्टॉप() पर नहीं है .. –

1

एक समाधान अपने सामान्य लॉगआउट प्रवाह (उपेक्षा mGoogleApiClient) करना है।

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

मुझे लगता है कि यह एक समाधान है, लेकिन वास्तव में एक परेशानी है, धन्यवाद –

+2

'mGoogleApiClient.is कनेक्ट() 'हमेशा झूठी वापसी। कनेक्ट() को कॉल करने का प्रयास करते समय, IllegalStateException फेंक दिया जाता है। – whoami

संबंधित मुद्दे

 संबंधित मुद्दे