studio programacion móviles libros libro desarrollo curso aplicaciones android google-play-services google-identity

móviles - manual de programacion android pdf



Nuevo inicio de sesión de Google en Android (30)

  1. Sigue el documento ambiguo de google.
  2. Ponga google-services.json en su directorio de proyectos
  3. Configure su gradle como https://stackoverflow.com/a/35216421/5886475

  4. Establezca server_client_id en string.xml. Es la identificación de su cliente web, no el cliente de Android

Estoy tratando de obtener una identificación de token de usuario utilizando los nuevos servicios de Google Play 8.3 y, como está documentado, paso la identificación del servidor:

GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN) .requestIdToken(getString(R.string.server_client_id)) .requestEmail() .build();

pero sigo obteniendo un resultado no exitoso como a continuación:

{statusCode=unknown status code: 12501, resolution=null}

y documentado aquí GoogleSignInStatusCodes

El inicio de sesión fue cancelado por el usuario. es decir, el usuario canceló algunas de las resoluciones de inicio de sesión, por ejemplo, selección de cuenta o consentimiento de OAuth.

Valor constante: 12501

Ese no es mi caso, ya que elegí una cuenta. ¿Alguna idea de cuál podría ser la razón?


¿Está tu apk en modo de depuración? Creo que solo funciona con un apk firmado.


Ahora lo tengo.

Entonces primero debes seguir las respuestas superiores diciendo:

  1. cree un ID de cliente OAuth para aplicaciones web en Google Developers Console y requestIdToken() en requestIdToken() (elimine el código de estado 12501)
  2. si creó una identificación de cliente OAuth de Android para su clave hash de producción, cree una nueva identificación de cliente OAuth de Android para su clave hash de depuración e integrela en su google-services.json. (deshacerse del código de estado 12500)

Ya no es válido Y aquí viene la última Parte: 3. no puede llamar a requestIdToken() y requestEmail() a la vez. Al menos en mi caso me Result: Status{statusCode=INTERNAL_ERROR, resolution=null} de Result: Status{statusCode=INTERNAL_ERROR, resolution=null} eliminando requestEmail() .

Buena suerte...


Aqui esta el nuevo. Estuve intentando durante 6 horas iniciar sesión en el emulador con la identificación de mi dominio corporativo de Google Apps, sin resultado, obteniendo 12501 errores. En una corazonada, probé mi identificación personal de gmail y funcionó. Lo mismo si lo intentara en mi teléfono con mi identificación corporativa. Resulta que el emulador no tenía la configuración adecuada de Administración de dispositivos móviles para permitir que mi ID corporativa inicie sesión.

Entonces, si quiero probar en el emulador con esta identificación corporativa, tengo que instalar Google Play Store, luego el software MDM y configurarlo.


Aunque ya existen muchas respuestas votadas en esta pregunta, luché por entender la lógica. Entonces, llego a mi investigación.

Para obtener SHA-1, ejecute esto en la terminal:

keytool -exportcert -keystore path-to-debug-or-production-keystore -list -v

Acerca de OAuth 2.0 client IDs

  • OAuth para la web (en la aplicación esto se usa como server_client_id )
  • OAuth para Android (Esto debe crearse utilizando el nombre correcto del paquete y la huella digital del certificado de firma SHA-1 ).

Si está utilizando el almacén de claves diferente para depurar y liberar, debe crear OAuth 2.0 client IDs separadas utilizando el nombre del paquete respectivo y SHA-1 .

Puede crear o editar sus OAuth 2.0 client IDs aquí https://console.developers.google.com/apis/credentials?project=

  1. Navegando a su aplicación.
  2. Si ya tiene un OAuth para Android, haga clic en su nombre y verifique el nombre del paquete y SHA-1 .

Podemos usar el mismo almacén de claves para la depuración y la liberación guardando los detalles del almacén de claves en gradle.properties global (local, no dentro del proyecto) y obteniéndolo en build.gradle como se muestra a continuación.

def key_alias = "" def key_password = "" def store_file = "" def store_password = "" try { key_alias = YOUR_KEY_ALIAS key_password = YOUR_KEY_PASSWORD store_file = YOUR_KEYSTORE_PATH store_password = YOUR_KEYSTORE_PASSWORD } catch (Exception exception) { throw new IllegalStateException(''Failed to find key store details. Social Login is disabled''); } android { signingConfigs { config { keyAlias key_alias keyPassword key_password storeFile file(store_file) storePassword store_password } } buildTypes { debug { signingConfig signingConfigs.config // ... } release { signingConfig signingConfigs.config // ... } } }

Puedes usar el siguiente fragmento

@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == REQUEST_CODE_GOOGLE_SIGN_IN) { GoogleSignInResult result = Auth.GoogleSignInApi.getSignInResultFromIntent(data); if (result.isSuccess()) { // ... } else if (result.getStatus().getStatusCode() == CommonStatusCodes.NETWORK_ERROR) { // No internet connection } else if (result.getStatus().getStatusCode() == CommonStatusCodes.DEVELOPER_ERROR) { // Wrong server OAuth key(server_client_id) } else if (result.getStatus().getStatusCode() == 12501) { // Wrong app signing-certificate fingerprint SHA1 } else { Log.e("Google sign in error", result.getStatus().toString()); } } }

Nota: Si habilitó solo el inicio de sesión de Google cuando generó el archivo de configuración, no necesita agregar el archivo google-servies.json en su proyecto (la generación del archivo realiza los pasos de configuración necesarios).


Dado que la aplicación solicita el inicio de sesión de Google desde la vista web, necesitamos crear el ID de cliente de autenticación de la aplicación web v2.0

  1. Ir a las credenciales de la API de Google

    Elige tu proyecto de Android desde la esquina superior izquierda

    2

  2. Haga clic en Crear credenciales -> Id. De cliente OAuth -> Elegir aplicación web

  3. Haga clic en Aceptar

  4. Ahora, si ha sincronizado Android Studio con Firebase (conectado) simplemente reconstruya el proyecto. De lo contrario, descargue el archivo google-services.json actualizado y reemplace el existente.

    Debería funcionar bien.


Desde mi extraña experiencia con este error, puedo decir que también debe intentar reiniciar su teléfono para deshacerse de este error :) Fui implementado Google Sign In usando cuentas de G Suite que tienen una política de dispositivo asignada a través de Google Admin . Entonces, en el primer inicio de sesión, era necesario instalar la aplicación Política de dispositivos. Después de completar todos los pasos posteriores, solo arrojaba el error 12501. Al mismo tiempo, la misma aplicación funcionaba bien en otros teléfonos. Así que solo reiniciar ayudó. Pero ayudó


En lugar de R.string.server_client_id , simplemente use R.string.default_web_client_id .

Cuando copia el archivo google-services.json en la aplicación, crea este valor de cadena automáticamente. No necesita copiar la clave de google-services.json a string.xml Funcionó para mí.


En mi caso, mis Credenciales para Client ID for Android en la consola de API de Google solo contenían el SHA-1 para mi APK firmado de lanzamiento . Android Studio estaba usando el almacén de claves de depuración predeterminado para firmar mis compilaciones de depuración, y en ese caso el almacén de claves de depuración SHA-1 no coincidía con el cliente de Android SHA-1 en línea. Mi solución fue simplemente firmar las compilaciones de depuración con el almacén de claves de lanzamiento.

En Android Studio, Build/Edit Build Types... , luego seleccione su tipo de compilación de depuración y asegúrese de que la configuración de firma esté configurada en su certificado de lanzamiento.


En mi caso, también tuve que verificar que el SHA-1 de depuración se haya agregado como un cliente OAuth Android válido.


Estaba enfrentando el mismo error de 12501 status . Esto se debe a la falta de coincidencia SHA-1 de la versión APK y la depuración APK.

  1. Haz un APK firmado. Para firmar un APK, elija la ruta existente del almacén de claves que ha utilizado para crear SHA-1. por ejemplo /.android/debug.keystore
  2. Dar alias-nombre: androiddebugkey
  3. storepass y keypass: android.

Estaba luchando con esto y perdí casi una semana en ello.

Así es como lo hice funcionar.

  1. Importar proyecto en AndroidStudio
  2. Crear almacén de claves de depuración para el proyecto.
  3. Cree la firma SHA1 para el proyecto utilizando el almacén de claves de depuración.
  4. Con la firma SHA1, registre su aplicación para Google Signin en Google Developer Console.
  5. Genere un archivo de configuración de Google allí (colóquelo en la carpeta de la aplicación de Android Studio)
  6. Use el ID de cliente web de las credenciales de OAuth 2.0 en su proyecto de Android.
  7. Ahora, desde Android Studio, genere una compilación de depuración (APK) de su proyecto.
  8. Monte el dispositivo en su sistema -> copie esta versión de depuración firmada de APK e instálela.

Los últimos tres pasos 6, 7 y 8 , son lo que realmente necesita cuidar. Si ejecuta directamente el proyecto, el APK no está firmado con el almacén de claves de depuración y Google no lo reconoce en absoluto.


Estaba teniendo el mismo problema, fue porque creé el ID de cliente del tipo de aplicación Android

En cambio, lo eliminé y creé el ID de cliente de tipo aplicación web y me deshice de este problema.


Intenta seguir estos pasos:

  1. Clone el siguiente proyecto https://github.com/googlesamples/google-services

  2. Siga la guía en https://developers.google.com/identity/sign-in/android/start

  3. Utilice el cliente web (creado automáticamente por el servicio de Google) y agréguelo en requestIdToken (...)

    GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN) .requestEmail() .requestIdToken("YOUR_WEB_API_ID.apps.googleusercontent.com") .build();

  4. Asegúrese de estar utilizando el mismo almacén de claves que se agrega al proyecto de Google. Por ejemplo, si ha utilizado el siguiente comando para generar la clave SHA-1

    keytool -exportcert -list -v -alias androiddebugkey -keystore ~/.android/debug.keystore

  5. Luego agregue el siguiente código en el archivo app / build.gradle dentro de Android {...} [Solucionó mi problema]

    signingConfigs { debug { storeFile file("/home/ashwin/.android/debug.keystore") storePassword "android" keyAlias "androiddebugkey" keyPassword "android" } } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile(''proguard-android.txt''), ''proguard-rules.pro'' } debug { signingConfig signingConfigs.debug } }

Nota: Su clave de acceso y clave de acceso deben ser los mismos utilizados durante la generación del certificado SHA-1.


No sé por qué, pero SHA1 en Android Studio se cambia automáticamente y es por eso que recibo este error. Para resolver esto, actualicé el SHA1 de la configuración de mi proyecto Firebase con el nuevo SHA1 de mi estudio de Android y comenzó a funcionar nuevamente.


Obviamente, primero verifique que su clave sha1 de liberación sea correcta o no. Pero si todavía no funciona y está utilizando los servicios de Google Play 8.4.0 (es decir, compile ''com.google.android.gms: play-services: 8.4.0''), el problema podría resolverse modificando el objeto GoogleSignInOption. En lugar de:

GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN) .requestEmail() .requestIdToken("YOUR_WEB_API_ID.apps.googleusercontent.com") .build();

Tienes que usar:

GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN) .requestScopes(new Scope(Scopes.PLUS_LOGIN)) .requestScopes(new Scope(Scopes.PLUS_ME)) .requestEmail() .build();

Esto resuelve el error que devuelve statusCode = INTERNAL_ERROR OR statusCode = Error 12501 OR statusCode = Error 12500. Entonces este objeto gso podría usarse para crear GoogleApiClient como se muestra a continuación:

mGoogleApiClient = new GoogleApiClient.Builder(this) .enableAutoManage(this, this) .addApi(Auth.GOOGLE_SIGN_IN_API,gso) // .addApi(Plus.API, null) .addConnectionCallbacks(this) .addOnConnectionFailedListener(this) // .addScope(Plus.SCOPE_PLUS_LOGIN) .build();


Resolví este problema haciendo clic en Soporte de Firebase en Android Studio, que puede no ser relevante para usuarios que no son de Firebase.

  1. Vaya al menú Herramientas-> Firebase
  2. Haga clic en Conectar su aplicación a Firebase, se mostrará como Conectado en verde una vez que la conexión sea exitosa
  3. Haga clic en Agregar autenticación de Firebase al botón de su aplicación, también se volverá verde.

NOTA: Tener una gran lista de respuestas en esto definitivamente confirma una cosa. Google necesita actualizar y mantener la documentación a prueba de tontos.


Si está utilizando el almacén de claves de depuración para construir el proyecto, debe agregar la huella digital SHA-1 de debug.keystore en Firebase Console .

  1. En tu consola Firebase , abre tu proyecto
  2. Ir a los parámetros. Pestaña General
  3. Al final de esta página, hay un campo para agregar una huella digital SHA-1
  4. Pegue el SHA-1 en el campo de la consola.

Para obtener SHA-1 de debug.keystore:

Mac / Linux:

keytool -exportcert -list -v -alias androiddebugkey -keystore ~/.android/debug.keystore

Ventanas:

keytool -exportcert -list -v -alias androiddebugkey -keystore %USERPROFILE%/.android/debug.keystore

here

Eso es todo !


Si ninguna de las opciones anteriores funciona, verifique si su ID de aplicación en la aplicación build.gradle es el mismo que el nombre de su paquete.


Solo descubra cómo resolver esto ... Recibí este error al intentar ejecutar la versión de depuración de mi aplicación ... Para solucionarlo, agregue una credencial para su aplicación de depuración en la consola del desarrollador y también en los servicios de Google .json.

¡Esto me lo arregló!


También tengo el mismo problema, se resolvió de la siguiente manera:

  1. Fui hecho para eliminar el SHA1 previamente pensado y crear y configurar un nuevo SHA1.

  2. generar nuevos google-services.json y configurarlos en mi directorio de aplicaciones

  3. Estaba usando exactamente https://developers.google.com/identity/sign-in/android/start-integrating

  4. my result.isSucces() volvió verdadero después de ejecutar el proyecto

como resumen, elimine sha1 antiguo y cree nuevo sha1 y descargue nuevos google-services.json


También tuve este problema, después de seguir las instrucciones de Google para firmar automáticamente su aplicación . Si está utilizando este método para firmar sus aplicaciones, deberá incluir la huella digital del almacén de claves generada en sus credenciales de API.

En el navegador del proyecto, haga clic con el botón derecho en su aplicación y seleccione Abrir configuración del módulo.

Me pareció menos confuso poner el archivo .jks en el directorio /app mi proyecto. En cualquier caso, ejecute esta línea en él.

keytool -list -v -keystore /home/user/keystores/android.jks

Se te solicitará una contraseña. No estoy seguro de si es la Key Password o la Store Password porque las mías son las mismas. : |

La consola escupirá un montón de huellas digitales de certificados. Tome el SHA1 e introdúzcalo en sus credenciales de API en la Consola de desarrollador de API de Google . Deberá ingresarlo para las OAuth 2.0 client IDs cliente OAuth 2.0 client IDs Android, aunque en realidad no use ese client_id en su aplicación. Si está utilizando otras API para Android, coloque el mismo SHA1 en las credenciales de clave apropiadas en API keys también.


Tuve el mismo problema y el error 12501 y ninguno de los anteriores no funcionan para mí.

Mi problema fue que estaba usando la API web predeterminada de Google que me generó. después de crear mi propio error de API web desapareció y funcionó bien.

Estos son pasos de trabajo:

  1. Primero creé la clave de depuración SHA1 y la agregué a la consola de Firebase . creando SHA1 desde here .
  2. cree una API web y una ID de cliente Android OAuth 2.0 desde here
  3. se genera google-service.json desde la consola de Firebase y se coloca en la carpeta de la aplicación.
  4. pon este código para GoogleSignnOption

Me gusta esto:

gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN).requestIdToken ("put the web app client Id that get from the link in developer console ") .requestEmail().build();

Consejo 1: descubrí que debes crear el ID de cliente de Android y de la aplicación web para que funcione.

consejo 2: si eres de Irán como yo, puedes obtener el usuario de google pero no puedes AuthWithGoogle y el resultado fail en auth.signInWithCredential(credential) y tuviste que usar algún proxy para devolver true.

esta es la fuente completa de trabajo de FireBaseAuthDemo en github:

espero ayuda completa


Tuve el mismo problema y noté que el código 12501 fue devuelto cuando mi server_client_id contenía algún valor incorrecto.

Como no hay un mensaje detallado y la documentación de este código de error es bastante pobre, no sé si su problema tiene la misma causa que el mío.

Mi aplicación se basa en el código de Android de este ejemplo (clase IdTokenActivity). Para que funcione, también necesitaba https://developers.google.com/identity/sign-in/android/start-integrating en mi aplicación:

  • archivo de configuración json generado con inicio de sesión de Google habilitado
  • Agregué el complemento y la dependencia de Google a mi archivo gradle
  • creé el ID de cliente de OAuth para esta aplicación y lo server_client_id en mi proyecto como server_client_id

Tuve el mismo problema y resolví con la siguiente solución:

  1. Cree el archivo de configuración (google-services.json) como se describe here y colóquelo en su directorio de proyecto / app
  2. (Como se menciona en otras respuestas) Uso de la aplicación web ID del cliente para el método requestIdToken .
  3. [Mi problema principal] Firme su aplicación si trabaja en modo de depuración como a continuación:

signingConfigs { release { storeFile file("myreleasekey.keystore") storePassword "password" keyAlias "MyReleaseKey" keyPassword "password" } } buildTypes { release { ... } debug { ... signingConfig signingConfigs.release } }


Tuve el mismo problema, después de investigar la solución, se reanudó que server_client_id contenía algún valor incorrecto o que google_services.json no incluía oauth_client con client_id que se registró en su almacén de claves.

requestIdToken(getString(R.string.server_client_id))

R.string.server_client_id usa el ID de cliente OAuth 2.0 para la aplicación web . Y OAuth Client ID para uso de Android en google_services.json

Usualmente usamos 2 keytore, 1 usando debug keystore y 1 usando el almacén de claves firmado para publicado. Entonces, si queremos necesitar en modo de depuración y publicación, registre su ID de cliente OAuth para Android dos veces, 1 usando SHA1 del almacén de claves de depuración y 1 del almacén de claves firmado para publicado.

pequeño ejemplo en mi google_services.json

"oauth_client": [ { "client_id": "xxx-client-id.com", "client_type": 1, "android_info": { "package_name": "com.app.android", "certificate_hash": "xxxhash" } }, { "client_id": "yyy.client-id.com", "client_type": 1, "android_info": { "package_name": "com.app.android", "certificate_hash": "yyyhash" } } ],


Tuve exactamente el mismo problema y encontré la solución.

Si sigue la documentación que se encuentra aquí: https://developers.google.com/identity/sign-in/android/start-integrating

El primer paso le indica que cree el archivo de configuración (que crea un ID de cliente OAuth 2.0 para usted y lo inserta en google-services.json)

Luego, más tarde, vuelve a decir sobre la creación de una ID de cliente OAuth 2.0, pero esta vez dice que debe hacerlo para la aplicación web

¡Y esta es la parte confusa! (al menos para mí) porque solo estaba tomando la identificación del cliente creada para el Android OAuth y no estaba creando una nueva para la aplicación web (pensé que la documentación era redundante o algo así)

Como dice, es este, y solo este es el que debe usar como parámetro de los métodos requestIdToken o requestServerAuthCode .

Olvídate de usar el ID de Android OAuth en estos métodos porque entonces obtendrás todo el tiempo la respuesta del código de estado feo 12501.

Creo que el problema principal es que la documentación es un poco confusa al respecto. O tal vez porque es un poco extraño el hecho de que tienes que crear dos ID de OAuth.

Como resumen, necesita DOS ID de OAuth, una para Android y otra para la aplicación web, y debe configurar cada una en el lugar correcto.


Un problema que tuve es que el SHA-1 que generé como con el alias incorrecto. El alias DEBE SER androiddebugkey . Así que puse el ID de Android OAuth en mi archivo google-service.json . Puse el ID del cliente web para requestIdToken () . Y en mi caso específico, generé el SHA-1 con alias androiddebugkey .

google-services.json :

"oauth_client": [ { "client_id": "ANDROID OAUTH ID-.....apps.googleusercontent.com", "client_type": 1, "android_info": { "package_name": "br.com.packagename", "certificate_hash": "SHA-1 HASH" } },{ "client_id": "WEB CLIEND ID......apps.googleusercontent.com", "client_type": 3 } ]

Parte de firma:

GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN) .requestIdToken("WEB CLIEND ID......apps.googleusercontent.com") .requestEmail() .build();


Use la aplicación web como server_client_id, no la aplicación de Android


1.Especifique signConfigs en su archivo gradle

signingConfigs { config { keyAlias ''appalias'' keyPassword ''hunter123'' storePassword ''hunter123'' storeFile file(''path/to/keystore.jks'') } }

2. Vaya a Tipos de compilación en la Estructura del proyecto (en Android Studio) y especifique signConfigs en "config"

Ahora limpia tu proyecto y construye de nuevo. Deberia de funcionar.

Si lo anterior no funciona, entonces a continuación es su último recurso.
Prueba el primer paso, compila y comprueba. Si no funciona, vaya al siguiente paso e intente construir de nuevo.

  1. Construya un apk firmado (con recordar contraseña marcada).
  2. Antes de firmar, verifique el nombre de archivo del archivo de almacén de claves y el que entregó al firmar el apk (en el estudio de Android).
  3. Instala el apk firmado en tu dispositivo.
  4. Espera cinco minutos.
  5. Intenta cantar en google. Si todavía viene 12501, espere cinco minutos más. Al hacer ese golpe gradle sync.
  6. Inténtalo de nuevo. Deberia de funcionar.