UserRecoverableAuthException: NeedPermission

J'ai essayé de suivre le tutoriel: https://developers.google.com/android/guides/http-auth.

Code:

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

Manifeste:

<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"/>

Erreurs:

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)
29
demandé sur Claudio Cherubino 2013-01-17 20:47:04

5 réponses

Essayez de suivre le lecteur quickstart pour Android, il est un guide étape par étape montrant comment autoriser et télécharger un fichier sur le lecteur: https://developers.google.com/drive/quickstart-android

Pour être plus précis, il semble que vous n'attrapiez pas L'Exception UserRecoverableException et que vous déclenchiez l'intention d'autoriser l'utilisateur à autoriser l'application. Ceci est documenté dans les documents Google Play Services que vous avez liés et traités dans l'exemple de démarrage rapide comme suit:

...
} catch (UserRecoverableAuthIOException e) {
  startActivityForResult(e.getIntent(), REQUEST_AUTHORIZATION);
}
... 
63
répondu Claudio Cherubino 2013-01-31 02:32:50

La méthode getAndUseAuthTokenBlocking () du tutoriel officiel de GoogleAuthUtil explique assez bien comment gérer l'exception:

// 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;
       }
   }
12
répondu Giorgio 2013-04-29 19:41:25

J'ai eu la même erreur, dans mon cas j'utilisais une mauvaise portée, je change juste

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

Pour

https://www.googleapis.com/auth/userinfo.profile
6
répondu pablofcn 2014-11-10 20:27:36

Sur cette page docs https://developers.google.com/+/mobile/android/connexion l'exemple a une bonne explication pour cette exception.

En particulier, il semble que cette ligne devrait être notée:

Demander un code d'autorisation lancera toujours UserRecoverableAuthException lors du premier appel à 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;
}
2
répondu gnB 2015-04-22 18:13:46

Les documents ont été récemment mis à jour et fonctionnent maintenant pour prendre en charge SDK M(demander l'autorisation) et afficher également la boîte de dialogue OAuth.

NOTE Google Docs ne sont souvent pas à jour, mais ils semblent faire attention lorsque vous signalez un problème. L'exemple a été mis à jour avec une semaine d'envoi d'un feedback. Donc, si vous voyez un exemple qui ne fonctionne pas, envoyez des commentaires!

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

1
répondu toidiu 2016-04-06 19:22:26