2016-01-07 20 views
8

मैं अपने एंड्रॉइड ऐप में पृष्ठभूमि सेवा चला रहा हूं। मैं IdToken का उपयोग करता हूं जो मुझे बैकएंड सर्वर पर प्रमाणीकृत करने के लिए साइन इन गतिविधि से मिलता है। सेवा START_STICKY मोड में चल रही है, इसलिए जब ऐप बंद हो जाता है, तो बैकएंड सर्वर से कोई सूचना प्राप्त करने के लिए सेवा पृष्ठभूमि में चलती रहती है। जिस समस्या का सामना करना पड़ रहा है वह तब होता है जब आईडीटोकन समाप्त हो जाता है, मैं इसे सेवा में नवीनीकृत करने में सक्षम नहीं हूं। टोकन की अवधि समाप्त होने पर कॉलबैक फ़ंक्शन को कोई परिणाम नहीं मिलता है। यदि टोकन अभी तक समाप्त नहीं हुआ है, तो यह परिणाम तुरंत हो जाता है।एंड्रॉइड पृष्ठभूमि सेवा में मूक Google साइन इन

यहां साइनइन फ़ंक्शन और हैंडलइन फ़ंक्शन के लिए कोड है।

private void signIn() { 
     new Thread(new Runnable() { public void run() { 
     GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN) 
       .requestEmail() 
       .requestIdToken("<My server_client_id>") 
       .build(); 
     GoogleApiClient mGoogleApiClient = new GoogleApiClient.Builder(context) 
       .addApi(Auth.GOOGLE_SIGN_IN_API, gso) 
       .build(); 

     OptionalPendingResult<GoogleSignInResult> opr = Auth.GoogleSignInApi.silentSignIn 
       (mGoogleApiClient); 
     if (opr.isDone()) { 
      // If the user's cached credentials are valid, the OptionalPendingResult will be "done" 

      // and the GoogleSignInResult will be available instantly. 
      Log.d(TAG, "Got cached sign-in"); 
      GoogleSignInResult result = opr.get(); 
      handleSignInResult(result); 
     } else { 
      // If the user has not previously signed in on this device or the sign-in has 
      // expired, 
      // this asynchronous branch will attempt to sign in the user silently. Cross-device 
      // single sign-on will occur in this branch. 
      Log.d(TAG, "had to sign in again"); 
      opr.setResultCallback(new ResultCallback<GoogleSignInResult>() { 
       @Override 
       public void onResult(GoogleSignInResult googleSignInResult) { 
        Log.d(TAG, "got result"); 
        handleSignInResult(googleSignInResult); 
       } 
      }); 
     }}}).start(); 
    } 

उत्तर

0

इसके अगर बयान से पहले

opr.setResultCallback(new ResultCallback<GoogleSignInResult>() { 
      @Override 
      public void onResult(GoogleSignInResult googleSignInResult) { 
       Log.d(TAG, "got result"); 
       handleSignInResult(googleSignInResult); 
      } 
     }); 
को

ले जाने का प्रयास। मुझे पता है कि Google डॉक्स का कहना है कि यह आपके जैसा तरीका है और मैंने ऐसा तब तक किया जब तक मुझे एहसास नहीं हुआ कि परिणाम कॉलबैक कभी भी कॉल नहीं किया जाएगा अगर इसे केवल अन्य ब्लॉक में प्रारंभ किया जाता है, opr पहले ही चल चुका है।

आपका कोड मेरा सुझाव पालन करने के बाद इस तरह दिखना चाहिए:

private void signIn() { 
    new Thread(new Runnable() { public void run() { 
    GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN) 
      .requestEmail() 
      .requestIdToken("<My server_client_id>") 
      .build(); 
    GoogleApiClient mGoogleApiClient = new GoogleApiClient.Builder(context) 
      .addApi(Auth.GOOGLE_SIGN_IN_API, gso) 
      .build(); 

    OptionalPendingResult<GoogleSignInResult> opr = Auth.GoogleSignInApi.silentSignIn 
      (mGoogleApiClient); 
    opr.setResultCallback(new ResultCallback<GoogleSignInResult>() { 
      @Override 
      public void onResult(GoogleSignInResult googleSignInResult) { 
       Log.d(TAG, "got result"); 
       handleSignInResult(googleSignInResult); 
      } 
     });}}).start(); 
} 
0

एक ही मुद्दा मिल गया है, तो यहां अब तक मेरी जानकारी दी गई है।

टोकन की समयसीमा समाप्त होने से पहले, साइन-इन प्रक्रिया वास्तव में Google API क्लाइंट का उपयोग नहीं करती है।

यदि टोकन समाप्त हो गया है, तो Google API क्लाइंट का उपयोग किया जाता है और इसे silentSignIn() पर कॉल करते समय कनेक्ट होने की आवश्यकता होती है। आप इसे मैन्युअल रूप से blockingConnect(), या स्वचालित रूप से enableAutoManage() (यदि आप किसी गतिविधि में हैं) के साथ कनेक्ट कर सकते हैं।

तो आपके मामले में ऐसा लगता है कि आपको कम से कम क्लाइंट को कनेक्ट करना चाहिए।

लेकिन और भी है ... यदि आईडी टोकन समाप्त हो गया है, तो साइन-इन प्रक्रिया में गतिविधि परिणाम प्राप्त होता है, जिसे आप केवल एक गतिविधि में ही कर सकते हैं, सेवा नहीं।

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