móviles - manual de programacion android pdf
Nuevo inicio de sesión de Google en Android (30)
- Sigue el documento ambiguo de google.
- Ponga google-services.json en su directorio de proyectos
-
Configure su gradle como https://stackoverflow.com/a/35216421/5886475
-
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:
-
cree un ID de cliente OAuth para aplicaciones web en Google Developers Console y
requestIdToken()
enrequestIdToken()
(elimine el código de estado 12501) - 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.
- Cree una aplicación con el nombre correcto del paquete y la huella digital del certificado de firma SHA-1 https://developers.google.com/mobile/add?platform=android&cntapi=signin
- Habilitar el inicio de sesión de google
- Genere el archivo de configuració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=
- Navegando a su aplicación.
- 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
-
Ir a las credenciales de la API de Google
Elige tu proyecto de Android desde la esquina superior izquierda
-
Haga clic en Crear credenciales -> Id. De cliente OAuth -> Elegir aplicación web
-
Haga clic en Aceptar
-
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.
-
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
- Dar alias-nombre: androiddebugkey
- storepass y keypass: android.
Estaba luchando con esto y perdí casi una semana en ello.
Así es como lo hice funcionar.
- Importar proyecto en AndroidStudio
- Crear almacén de claves de depuración para el proyecto.
- Cree la firma SHA1 para el proyecto utilizando el almacén de claves de depuración.
- Con la firma SHA1, registre su aplicación para Google Signin en Google Developer Console.
- Genere un archivo de configuración de Google allí (colóquelo en la carpeta de la aplicación de Android Studio)
- Use el ID de cliente web de las credenciales de OAuth 2.0 en su proyecto de Android.
- Ahora, desde Android Studio, genere una compilación de depuración (APK) de su proyecto.
- 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:
-
Clone el siguiente proyecto https://github.com/googlesamples/google-services
-
Siga la guía en https://developers.google.com/identity/sign-in/android/start
-
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();
-
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
-
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.
- Vaya al menú Herramientas-> Firebase
- Haga clic en Conectar su aplicación a Firebase, se mostrará como Conectado en verde una vez que la conexión sea exitosa
- 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 .
- En tu consola Firebase , abre tu proyecto
- Ir a los parámetros. Pestaña General
- Al final de esta página, hay un campo para agregar una huella digital SHA-1
- 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
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:
Fui hecho para eliminar el SHA1 previamente pensado y crear y configurar un nuevo SHA1.
generar nuevos
google-services.json
y configurarlos en mi directorio de aplicacionesEstaba usando exactamente https://developers.google.com/identity/sign-in/android/start-integrating
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:
- Primero creé la clave de depuración SHA1 y la agregué a la consola de Firebase . creando SHA1 desde here .
- cree una API web y una ID de cliente Android OAuth 2.0 desde here
-
se genera
google-service.json
desde la consola de Firebase y se coloca en la carpeta de la aplicación. -
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 comoserver_client_id
Tuve el mismo problema y resolví con la siguiente solución:
- Cree el archivo de configuración (google-services.json) como se describe here y colóquelo en su directorio de proyecto / app
-
(Como se menciona en otras respuestas) Uso de la aplicación web ID del cliente para el método
requestIdToken
. - [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.
- Construya un apk firmado (con recordar contraseña marcada).
- 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).
- Instala el apk firmado en tu dispositivo.
- Espera cinco minutos.
- Intenta cantar en google. Si todavía viene 12501, espere cinco minutos más. Al hacer ese golpe gradle sync.
- Inténtalo de nuevo. Deberia de funcionar.