2013-01-17 11 views
27

Ho provato a seguire il tutorial: https://developers.google.com/android/guides/http-auth.UserRecoverableAuthException: NeedPermission

Codice:

token = GoogleAuthUtil.getToken(getApplicationContext(), 
         mEmail, mScope); 

Manifest:

<uses-permission android:name="android.permission.GET_ACCOUNTS"/> 
<uses-permission android:name="android.permission.NETWORK"/> 
<uses-permission android:name="android.permission.USE_CREDENTIALS"/> 
<uses-permission android:name="android.permission.INTERNET"/> 

Errori:

01-17 18:37:38.230: W/System.err(3689): com.google.android.gms.auth.UserRecoverableAuthException: NeedPermission 
01-17 18:37:38.230: W/System.err(3689):  at com.google.android.gms.auth.GoogleAuthUtil.getToken(Unknown Source) 
01-17 18:37:38.230: W/System.err(3689):  at com.google.android.gms.auth.GoogleAuthUtil.getToken(Unknown Source) 
01-17 18:37:38.230: W/System.err(3689):  at com.example.mgoogleauth.MainActivity$GetIOStreamTask.doInBackground(MainActivity.java:39) 
01-17 18:37:38.230: W/System.err(3689):  at com.example.mgoogleauth.MainActivity$GetIOStreamTask.doInBackground(MainActivity.java:1) 
01-17 18:37:38.230: W/System.err(3689):  at android.os.AsyncTask$2.call(AsyncTask.java:287) 
01-17 18:37:38.230: W/System.err(3689):  at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305) 
01-17 18:37:38.230: W/System.err(3689):  at java.util.concurrent.FutureTask.run(FutureTask.java:137) 
01-17 18:37:38.230: W/System.err(3689):  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076) 
01-17 18:37:38.230: W/System.err(3689):  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569) 
01-17 18:37:38.230: W/System.err(3689):  at java.lang.Thread.run(Thread.java:856) 

risposta

59

prova a seguire l'avvio rapido Drive per Android, è una guida passo-passo che mostra come per autorizzare e caricare un file su Drive: https://developers.google.com/drive/quickstart-android

Per essere più specifici, sembra che tu non stia rilevando l'eccezione UserRecoverableException e che si attivi l'intenzione di autorizzare l'utente a utilizzare l'app. questo è documentato nel Google Play Services Docs si Linked e manipolati nel campione quickstart come segue:

... 
} catch (UserRecoverableAuthIOException e) { 
    startActivityForResult(e.getIntent(), REQUEST_AUTHORIZATION); 
} 
... 
+0

Stesso problema anche se ho copiato il campione in quanto è –

+1

ho aggiornato la risposta con maggiori dettagli su come gestire la REQUEST_AUTHORIZATION eccezione –

+0

dovrebbe essere quello che? – user1400538

12

il metodo getAndUseAuthTokenBlocking() della official GoogleAuthUtil tutorial spiega abbastanza bene come gestire l'eccezione:

// Example of how to use the GoogleAuthUtil in a blocking, non-main thread context 
    void getAndUseAuthTokenBlocking() { 
     try { 
      // Retrieve a token for the given account and scope. It will always return either 
      // a non-empty String or throw an exception. 
      final String token = GoogleAuthUtil.getToken(Context, String, String)(context, email, scope); 
      // Do work with token. 
      ... 
      if (server indicates token is invalid) { 
       // invalidate the token that we found is bad so that GoogleAuthUtil won't 
       // return it next time (it may have cached it) 
       GoogleAuthUtil.invalidateToken(Context, String)(context, token); 
       // consider retrying getAndUseTokenBlocking() once more 
       return; 
      } 
      return; 
     } catch (GooglePlayServicesAvailabilityException playEx) { 
     Dialog alert = GooglePlayServicesUtil.getErrorDialog(
      playEx.getConnectionStatusCode(), 
      this, 
      MY_ACTIVITYS_AUTH_REQUEST_CODE); 
     ... 
     } catch (UserRecoverableAuthException userAuthEx) { 
      // Start the user recoverable action using the intent returned by 
      // getIntent() 
      myActivity.startActivityForResult(
        userAuthEx.getIntent(), 
        MY_ACTIVITYS_AUTH_REQUEST_CODE); 
      return; 
     } catch (IOException transientEx) { 
      // network or server error, the call is expected to succeed if you try again later. 
      // Don't attempt to call again immediately - the request is likely to 
      // fail, you'll hit quotas or back-off. 
      ... 
      return; 
     } catch (GoogleAuthException authEx) { 
      // Failure. The call is not expected to ever succeed so it should not be 
      // retried. 
      ... 
      return; 
     } 
    }
6

avevo lo stesso errore, nel mio caso ho usato un ambito sbagliato, ho appena cambiare

https://www.googleapis.com/auth/plus.login 

per

https://www.googleapis.com/auth/userinfo.profile 
+0

Dove devo cambiare questo @pablofcn – David

2

In questa pagina docs https://developers.google.com/+/mobile/android/sign-in l'esempio ha una buona spiegazione per questa eccezione.

In particolare, sembra che questa linea dovrebbe essere notato:

Richiesta di un codice di autorizzazione sarà sempre buttare UserRecoverableAuthException sulla prima chiamata a GoogleAuthUtil.getToken

catch (UserRecoverableAuthException e) { 
    // Requesting an authorization code will always throw 
    // UserRecoverableAuthException on the first call to GoogleAuthUtil.getToken 
    // because the user must consent to offline access to their data. After 
    // consent is granted control is returned to your activity in onActivityResult 
    // and the second call to GoogleAuthUtil.getToken will succeed. 
    startActivityForResult(e.getIntent(), AUTH_CODE_REQUEST_CODE); 
    return; 
} 
1

La documentazione hanno è stato aggiornato di recente e ora funziona per supportare l'SDK M (richiesta dell'autorizzazione) e mostra anche la finestra di dialogo OAuth.

Google Documenti spesso non sono aggiornati ma sembrano prestare attenzione quando si segnala un problema. L'esempio è stato aggiornato con una settimana di invio di un feedback. Quindi se vedi un esempio non funzionante, invia feedback!

https://developers.google.com/drive/v3/web/quickstart/android