android - descargar - google+ web
Inicio de sesión en Google+ para Android-Códigos de resultados de actividad de permisos de Google (1)
Bueno, después de luchar un rato con esto creo que encontré una solución. No sé si es la manera correcta de hacerlo, pero pensé que debería compartirlo, así que aquí va.
tenemos el método onActivityresult
que la actividad que realiza el inicio de sesión / inicio de sesión debe implementar.
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
(...)
}
Lo que pensé (después de pensar un rato, y luego confirmé) fue que el parámetro de Intent data
debería tener algún tipo de pista o información sobre qué tipo de error o resultado se está devolviendo. Después de inspeccionarlo un poco encontré que en el caso de que el usuario niegue los permisos para la aplicación, esta intención tenía una Cadena Extra con la clave Error
y valoró UserCancel
. Así que eso es lo que terminé usando para distinguir un caso del otro. ¡Espero eso ayude!
data.getExtraString("Error"); // This should have the value "UserCancel" when the user
// refused to give the permissions required by the app.
Tenga en cuenta que el intento de data
no siempre ofrece este ExtraString, y de hecho puede ser null
para algunas llamadas de onActityResult
, por lo que debe verificar if (data != null)
antes de usar esto.
He descubierto un pequeño problema al trabajar con Google+ Sign para Android y después de buscar en la web (y obviamente SO). Hago mi pregunta en voz alta para ver si alguien ha notado lo mismo.
Estoy habilitando el acceso a la API del lado del servidor para mi aplicación como se describe aquí. Déjame ser detallado sobre lo que está pasando. Toma este fragmento:
Bundle appActivities = new Bundle();
appActivities.putString(GoogleAuthUtil.KEY_REQUEST_VISIBLE_ACTIVITIES,
"<APP-ACTIVITY1> <APP-ACTIVITY2>");
String scopes = "oauth2:server:client_id:<SERVER-CLIENT-ID>:api_scope:<SCOPE1> <SCOPE2>";
String code = null;
try {
code = GoogleAuthUtil.getToken(
this, // Context context
Plus.AccountApi.getAccountName(mGoogleApiClient), // String accountName
scopes, // String scope
appActivities // Bundle bundle
);
} 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 (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;
} catch (GoogleAuthException authEx) {
// Failure. The call is not expected to ever succeed so it should not be
// retried.
...
return;
} catch (Exception e) {
throw new RuntimeException(e);
}
Ver UserRecoverableAuthException
y su comentario? Bueno, de eso es de lo que quiero hablarte. En ese caso, como puede ver, se inicia otra actividad y comienza un flujo en el que debe aceptar los permisos que solicita la aplicación. Como puede ver, se está utilizando el método startActivityForResult
. Lo que observé es que Activity.RESULT_OK
se devuelve cuando los usuarios aceptan dar los permisos, pero Activity.RESULT_CANCELED
se devuelve cuando ocurre un error / bloqueo o cuando el usuario simplemente se niega a dar permiso y cancela el flujo.
Así que aquí está (SÍ, ¡FINALMENTE!) Mi pregunta ... ¿Cómo puedo diferenciar un caso (error / bloqueo) del otro (posible flujo de usuario)?