一切正常,直到我生成签名的apk。我按照谷歌开发者页面上的说明跟踪了整个过程
1.我生成了带有keyhash和包名的google-services.json文件 2.包括所有类级别和应用程序级别的依赖关系,如此
// 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()
}
}
应用程序gradle文件
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'
}
我的登录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();
}
}
}
我的布局代码
<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"
/>
答案 0 :(得分:15)
据我了解,您已在开发者控制台中提供了调试SHA1, 然后你签了apk并更改了SHA1。 如果是这种情况,请尝试以下obtain the release SHA1 from the keystore并将旧的SHA替换为。
1。打开终端并将目录更改为JDK bin目录。在路径中包含已安装的JDK版本,对我来说是jdk1.8.0_101
(类型javac -version
以获取Java版本):
<强>苹果强>
cd /Library/Java/JavaVirtualMachines/<your_JDK_version>.jdk/Contents/Home/bin
<强>窗强>
cd C:\Program Files\Java\your_JDK_version\bin
2。使用keytool
获取版本SHA1:
keytool -list -v -keystore <keystore_name> -alias <alias_name>
3。转到project's credentials page并将SHA1替换为密钥库的发布版SHA1。
答案 1 :(得分:3)
我遇到了同样的问题。我想我发现Google不允许你为你的应用程序的调试和发布apk获得一个认证。您需要选择仅为其中一个获取证书。如果我错了,请纠正我。
我所做的是输入发布键的SHA1指纹凭据,而不是我的调试密钥here
之后,我发布的apk工作,而不是我的调试密钥。
答案 2 :(得分:1)
@ - vj- @ ==&gt; API密钥基于应用程序数字证书的简短形式,称为SHA-1指纹。要显示证书的SHA-1指纹,请首先确保使用正确的证书。您可能有两个证书:
- &GT;调试证书:Android SDK工具在您进行调试构建时自动生成此证书。仅将此证书与您正在测试的应用程序一起使用。请勿尝试发布使用调试证书签名的应用程序。调试证书在Android Developer Documentation中的Signing in Debug Mode中有更详细的描述。
- &GT;发布证书:Android SDK工具在您执行发布版本时生成此证书。您还可以使用keytool程序生成此证书。当您准备将应用程序发布到全世界时,请使用此证书。
==&GT;显示调试证书指纹
找到您的调试密钥库文件。文件名是debug.keystore,并在第一次构建项目时创建。默认情况下,它存储在与Android虚拟设备(AVD)文件相同的目录中:
macOS和Linux:~/.android/
Windows Vista和Windows 7:C:\Users\your_user_name\.android\
列出SHA-1指纹:
对于Linux或macOS,打开终端窗口并输入以下内容:
keytool -list -v -keystore ~/.android/debug.keystore -alias androiddebugkey -storepass android -keypass android
对于Windows Vista和Windows 7,请运行:
keytool -list -v -keystore "%USERPROFILE%\.android\debug.keystore" -alias androiddebugkey -storepass android -keypass android
==&GT;显示发布证书指纹
找到您的发布证书密钥库文件。发行密钥库没有默认位置或名称。如果您在构建应用程序以进行发布时未指定一个,则构建将使.apk保持未签名状态,并且您必须在发布之前对其进行签名。对于发行证书,您还需要证书的别名以及密钥库和证书的密码。您可以通过输入以下内容列出密钥库中所有密钥的别名:
keytool -list -keystore your_keystore_name
将your_keystore_name
替换为密钥库的完全限定路径和名称,包括.keystore扩展名。系统将提示您输入密钥库的密码。然后keytool显示密钥库中的所有别名。
在终端或命令提示符处输入以下内容:
keytool -list -v -keystore your_keystore_name -alias your_alias_name
将your_keystore_name
替换为密钥库的完全限定路径和名称,包括.keystore扩展名。将your_alias_name
替换为您在创建证书时分配给该证书的别名。
答案 3 :(得分:0)
在巨大的开发者控制台中找到要激活的地方并不困难。可能是我将来会帮助别人。 您必须在此处注册您的Android应用程序 - &#34;启用登录&#34;在此page:
只需输入常用的控制台开发人员值,这就是您签名的SHA-1。 那就是它!
答案 4 :(得分:0)
您必须在Firebase控制台的Project-> Setting-> Android
中放置两个SHA-1键1个密钥:密钥库的密钥,即keytool -list -v -keystore -alias
2密钥:您的Play商店的密钥,即发布管理->应用签名->应用签名证书-> SHA 1密钥指纹
答案 5 :(得分:0)