java - El inicio de sesión de Google apk firmado no funciona
android google-api (6)
Bueno, todo funciona hasta que genere el apk firmado. Seguí todo el proceso según lo dicho en la página de desarrolladores de Google
Genere el archivo google-services.json con keyhash y el nombre del paquete
2.Incluyó todas las dependencias de nivel de clase y nivel de aplicación como esta
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
repositories {
jcenter()
}
dependencies {
classpath ''com.android.tools.build:gradle:1.3.0''
classpath ''com.google.gms:google-services:2.0.0-alpha6''
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
allprojects {
repositories {
jcenter()
}
}
Archivo gradle de aplicaciones
apply plugin: ''com.android.application''
apply plugin: ''com.google.gms.google-services''
android {
compileSdkVersion 23
buildToolsVersion "23.0.0"
defaultConfig {
applicationId "com.example.skmishra.finalgooglesignin"
minSdkVersion 14
targetSdkVersion 23
versionCode 1
versionName "1.0"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile(''proguard-android.txt''), ''proguard-rules.pro''
}
}
}
dependencies {
compile fileTree(dir: ''libs'', include: [''*.jar''])
compile ''com.android.support:appcompat-v7:23.1.1''
compile ''com.google.android.gms:play-services:8.3.0''
}
-
Mi código de inicio de sesión Java
package com.example.skmishra.finalgooglesignin; import android.content.Intent; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.widget.Button; import android.widget.Toast; import com.google.android.gms.auth.api.Auth; import com.google.android.gms.auth.api.signin.GoogleSignInAccount; import com.google.android.gms.auth.api.signin.GoogleSignInOptions; import com.google.android.gms.auth.api.signin.GoogleSignInResult; import com.google.android.gms.common.ConnectionResult; import com.google.android.gms.common.SignInButton; import com.google.android.gms.common.api.GoogleApiClient; public class MainActivity extends AppCompatActivity implements GoogleApiClient.OnConnectionFailedListener, View.OnClickListener { private static final int RC_SIGN_IN = 200 ; private static final String TAG = "Sign In" ; private GoogleApiClient mGoogleApiClient; SignInButton google; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // Configure sign-in to request the user''s ID, email address, and basic // profile. ID and basic profile are included in DEFAULT_SIGN_IN. GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN) .requestEmail() .build(); mGoogleApiClient = new GoogleApiClient.Builder(this) .enableAutoManage(this /* FragmentActivity */, this /* OnConnectionFailedListener */) .addApi(Auth.GOOGLE_SIGN_IN_API, gso) .build(); SignInButton signInButton = (SignInButton) findViewById(R.id.sign_in_button); signInButton.setSize(SignInButton.SIZE_STANDARD); signInButton.setScopes(gso.getScopeArray()); google=(SignInButton)findViewById(R.id.sign_in_button); google.setOnClickListener(this); } @Override public void onConnectionFailed(ConnectionResult connectionResult) { Toast.makeText(this,"Failed to connect",Toast.LENGTH_LONG).show(); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.sign_in_button: signIn(); break; // ... } } private void signIn() { Intent signInIntent = Auth.GoogleSignInApi.getSignInIntent(mGoogleApiClient); startActivityForResult(signInIntent, RC_SIGN_IN); } @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); // Result returned from launching the Intent from GoogleSignInApi.getSignInIntent(...); if (requestCode == RC_SIGN_IN) { GoogleSignInResult result = Auth.GoogleSignInApi.getSignInResultFromIntent(data); handleSignInResult(result); } } private void handleSignInResult(GoogleSignInResult result) { Log.d(TAG, "handleSignInResult:" + result.isSuccess()); if (result.isSuccess()) { // Signed in successfully, show authenticated UI. GoogleSignInAccount acct = result.getSignInAccount(); Toast.makeText(this,"Name :"+acct.getDisplayName()+" Email :"+acct.getEmail(),Toast.LENGTH_LONG).show(); } else { // Signed out, show unauthenticated UI. Toast.makeText(this,"Signed out ",Toast.LENGTH_LONG).show(); } } }
-
Mi código de diseño
<com.google.android.gms.common.SignInButton android:id="@+id/sign_in_button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Check this out" />
-
@ -vj- @ ==> La clave API se basa en una forma abreviada del certificado digital de su aplicación, conocida como su huella digital SHA-1. Para mostrar la huella digital SHA-1 para su certificado, primero asegúrese de estar utilizando el certificado correcto. Puede tener dos certificados:
-> Un certificado de depuración: las herramientas del SDK de Android generan este certificado automáticamente cuando realiza una compilación de depuración. Solo use este certificado con las aplicaciones que está probando. No intente publicar una aplicación que esté firmada con un certificado de depuración. El certificado de depuración se describe con más detalle en Iniciar sesión en modo de depuración en la Documentación del desarrollador de Android.
-> Un certificado de lanzamiento: las herramientas del SDK de Android generan este certificado cuando haces una compilación de lanzamiento. También puede generar este certificado utilizando el programa keytool. Use este certificado cuando esté listo para lanzar su aplicación al mundo.
==> Mostrar la huella digital del certificado de depuración
Localice su archivo de almacén de claves de depuración. El nombre del archivo es debug.keystore, y se crea la primera vez que crea su proyecto. De forma predeterminada, se almacena en el mismo directorio que los archivos de su dispositivo virtual Android (AVD):
macOS y Linux:
~/.android/
Windows Vista y Windows 7:
C:/Users/your_user_name/.android/
Enumere la huella digital SHA-1:
Para Linux o macOS, abra una ventana de terminal e ingrese lo siguiente:
keytool -list -v -keystore ~/.android/debug.keystore -alias androiddebugkey -storepass android -keypass android
Para Windows Vista y Windows 7, ejecute:
keytool -list -v -keystore "%USERPROFILE%/.android/debug.keystore" -alias androiddebugkey -storepass android -keypass android
==> Mostrar la huella digital del certificado de lanzamiento
Localice su archivo de almacén de claves de certificado de versión. No hay una ubicación o nombre predeterminados para el almacén de claves de lanzamiento. Si no especifica uno cuando compila su aplicación para su lanzamiento, la compilación dejará su .apk sin firmar, y tendrá que firmarlo antes de poder publicarlo. Para el certificado de lanzamiento, también necesita el alias del certificado y las contraseñas para el almacén de claves y el certificado. Puede enumerar los alias de todas las claves en un almacén de claves ingresando:
keytool -list -keystore your_keystore_name
Reemplace
your_keystore_name
con la ruta completa y el nombre del almacén de claves, incluida la extensión .keystore.
Se le pedirá la contraseña del almacén de claves.
Luego, keytool muestra todos los alias en el almacén de claves.
Ingrese lo siguiente en un terminal o símbolo del sistema:
keytool -list -v -keystore your_keystore_name -alias your_alias_name
Reemplace
your_keystore_name
con la ruta completa y el nombre del almacén de claves, incluida la extensión .keystore.
Reemplace
your_alias_name
con el alias que asignó al certificado cuando lo creó.
FWIW:
Para mí, tenía la configuración de lanzamiento y depuración (ID de cliente Oath, SHA-1, etc.) todo configurado en la consola de desarrollo de Google y el archivo google-services.json instalado en el proyecto.
Como estoy trabajando con múltiples
./app/<flavorN>/
compilación, coloco los diversos archivos de configuración en sus respectivos directorios
./app/<flavorN>/
.
Mi error fue no generar el APK firmado con el archivo de almacén de claves, el alias y la contraseña correctos en el asistente Generar APK firmado. El asistente almacenaba en caché las claves y las credenciales de una versión anterior (tsk). Pero después de restablecer las teclas para asignar al sabor objetivo, ahora tengo un inicio de sesión de Google en funcionamiento.
No es difícil encontrar el lugar para activar dentro de la enorme consola de desarrollador. Quizás pueda ayudar a alguien en el futuro. Debe registrar su aplicación de Android aquí: "habilitar el here sesión" en esta here :
Solo ingrese lo habitual para los valores de desarrollador de consola, este es su SHA-1 firmado. ¡Eso es!
Según tengo entendido, proporcionó el SHA1 de depuración en la consola del desarrollador, luego firmó el apk y el SHA1 cambió. Si este es el caso, intente lo siguiente, debe obtener la versión SHA1 del almacén de claves y reemplazar la antigua SHA con eso.
1.
Abra la terminal y cambie el directorio al directorio bin JDK.
Incluya su versión JDK instalada dentro de la ruta, para mí fue -
jdk1.8.0_101
(escriba
javac -version
para obtener la versión Java):
Mac
cd /Library/Java/JavaVirtualMachines/<your_JDK_version>.jdk/Contents/Home/bin
Ventanas
cd C:/Program Files/Java/your_JDK_version/bin
2.
Use
keytool
para obtener la versión SHA1:
keytool -list -v -keystore <keystore_name> -alias <alias_name>
3. Vaya a la página de credenciales de su proyecto y reemplace el SHA1 por la versión SHA1 de su almacén de claves.
Tienes que poner dos teclas SHA-1 en la consola de Firebase Proyecto-> Configuración-> Android
1 clave: la clave de su almacén de claves, es decir, keytool -list -v -keystore -alias
Clave 2: la clave de su Play Store, es decir, Gestión de lanzamientos-> Firma de la aplicación-> Certificado de firma de la aplicación-> Huella digital clave SHA 1
Yo tuve el mismo problema. Creo que descubrí que Google no le permite tener una certificación tanto para la depuración como para la versión apk de su aplicación. Debe elegir obtener el certificado solo para uno de ellos. Por favor, corríjame si estoy equivocado.
Lo que hice fue ingresar las credenciales de huella digital SHA1 para mi clave de lanzamiento y no mi clave de depuración en este enlace here
Después, mi apk lanzado funcionó y no mi clave de depuración.