2013-07-09 6 views
14

मेरी एंड्रॉयड आवेदन में से, मैं नीचे के रूप में GoogleAuthUtil से AccessToken पाने के लिए कोशिश कर रहा हूँ:"अपने मुख्य थ्रेड से इस कॉलिंग accesToken हो रही है, जबकि गतिरोध और/या ANR की बढ़ सकता है" GoogleAuthUtil (एंड्रॉयड में गूगल प्लस एकीकरण)

accessToken = GoogleAuthUtil.getToken (यह, mPlusClient.getAccountName(), "oauth2:" + SCOPES);

लेकिन इस लाइन में मैं नीचे के रूप में त्रुटि gettting हूँ:

ई/GoogleAuthUtil (4696): अपने मुख्य थ्रेड से इस कॉलिंग गतिरोध और/या ANR की ई/GoogleAuthUtil को जन्म दे सकता (46 9 6): java.lang.IllegalStateException: इसे अपने मुख्य थ्रेड से कॉल करने से डेडलॉक ई/GoogleAuthUtil (4696): com.google.android.gms.auth.GoogleAuthUtil.b (अज्ञात स्रोत) ई/GoogleAuthUtil पर जा सकता है (46 9 6): com.google.android.gms.auth.GoogleAuthUtil.getToken (अज्ञात स्रोत) ई/GoogleAut पर hUtil (4696): com.google.android.gms.auth.GoogleAuthUtil.getToken पर (अज्ञात स्रोत)

इस समस्या का कोई भी समाधान? किसी भी तरह की सहायता को आभार समझेंगे।

+0

अरे @Ponting, यह मेरे लिए काम करता था, लेकिन केवल कुछ दिन पहले यह काम करना बंद कर और अब यह इस त्रुटि कॉम फेंकता है।google.android.gms.auth.GoogleAuthException: अज्ञात। कोई विचार क्यों? क्या मेरे क्षेत्रों में कुछ गड़बड़ है? https://gist.github.com/lawloretienne/7351151 – toobsco42

उत्तर

33

इस तरह एक AsyncTask साथ यह प्रयास करें:

 AsyncTask<Void, Void, String> task = new AsyncTask<Void, Void, String>() { 
      @Override 
      protected String doInBackground(Void... params) { 
       String token = null; 

       try { 
        token = GoogleAuthUtil.getToken(
          MainActivity.this, 
          mGoogleApiClient.getAccountName(), 
          "oauth2:" + SCOPES); 
       } catch (IOException transientEx) { 
        // Network or server error, try later 
        Log.e(TAG, transientEx.toString()); 
       } catch (UserRecoverableAuthException e) { 
        // Recover (with e.getIntent()) 
        Log.e(TAG, e.toString()); 
        Intent recover = e.getIntent(); 
        startActivityForResult(recover, REQUEST_CODE_TOKEN_AUTH); 
       } catch (GoogleAuthException authEx) { 
        // The call is not ever expected to succeed 
        // assuming you have already verified that 
        // Google Play services is installed. 
        Log.e(TAG, authEx.toString()); 
       } 

       return token; 
      } 

      @Override 
      protected void onPostExecute(String token) { 
       Log.i(TAG, "Access token retrieved:" + token); 
      } 

     }; 
     task.execute(); 

SCOPES OAuth 2.0 गुंजाइश तार के एक अंतरिक्ष पृथक सूची है।

public static final String SCOPES = "https://www.googleapis.com/auth/plus.login " 
    + "https://www.googleapis.com/auth/drive.file"; 

इन अनुमतियों है कि आपके एप्लिकेशन को उपयोगकर्ता से अनुरोध कर रहा है प्रतिनिधित्व करते हैं: उदाहरण के लिए SCOPES रूप में परिभाषित किया जा सकता है। स्कोप इस उदाहरण में अनुरोध यहाँ प्रलेखित रहे हैं:

+0

यहां SCOPES क्या है? –

+0

SCOPES को समझाने के लिए मेरा उत्तर संपादित किया गया। – Lee

+0

यदि आपको ड्राइव तक पहुंचने की आवश्यकता नहीं है, तो आप 'https://developers.google को हटा दें। कॉम/ड्राइव/एंड्रॉइड/फाइल 'स्कॉप्स से – KAPLANDROID

0

ई/GoogleAuthUtil (4696): java.lang.IllegalStateException: अपने मुख्य धागे से इस बुला गतिरोध को पसंद करते हैं कि ऐसा करने के लिए एक अलग थ्रेड पर की जरूरत है

ध्वनि नेतृत्व कर सकते हैं, आपके पास कोशिश की?

Here आप एंड्रॉइड में धागे के बारे में जानकारी पा सकते हैं।

+0

मैंने नए थ्रेड के तहत उपरोक्त कोड चलाने की कोशिश की: नया थ्रेड (नया रननेबल() { सार्वजनिक शून्य रन() {}} .start(); .. लेकिन यह त्रुटि देता है कि GoogleAuthUtil.getToken रननेबल विधि पर नहीं चल सकता है। – Ponting

4

अपने इंटरनेट कोड के लिए अलग थ्रेड का उपयोग करें। त्रुटि यह बता रही है कि ऐप में अधिक समय लेने वाली प्रक्रिया चल रही है और यहां इंटरनेट है। तो अलग थ्रेड या Async कार्य का उपयोग करें।

इस लिंक NetworkOnMainThreadException

चेक बाहर आशा है कि यह आप में मदद मिलेगी।

0
  Thread CrearEventoHilo = new Thread(){ 
       public void run(){ 
        //do something that retrun "Calling this from your main thread can lead to deadlock" 
       } 
      }; 
      CrearEventoHilo.start(); 
      CrearEventoHilo.interrupt(); 
+2

आपका यदि आप यह कैसे काम करते हैं, इस बारे में कोई स्पष्टीकरण जोड़ते हैं तो उत्तर अधिक मूल्यवान होगा। –

+0

कॉल को बाधित क्यों करें()? –

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