谷歌登录签名的apk不起作用
Posted
技术标签:
【中文标题】谷歌登录签名的apk不起作用【英文标题】:Google sign in signed apk not working 【发布时间】:2016-07-02 22:07:13 【问题描述】:在我生成签名的 apk 之前一切正常。我按照谷歌开发者页面上的说明完成了整个过程
1.我生成了 google-services.json 文件,其中包含 keyhash 和包名 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_
android:layout_
android:text="Check this out"
/>
【问题讨论】:
请在您的帖子中包含堆栈跟踪。 我不能有一个堆栈跟踪,我创建了它的签名 apk 应用程序确实崩溃了,它只是没有工作(当应用程序被签名时,result.isSuccess() 总是错误的 您是否在开发者控制台上注册了应用并提供了 SHA1 密钥? 是的,我这样做了,因此生成了 Google 服务 .json 文件 【参考方案1】:据我了解,您已在开发者控制台中提供了调试 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
Windows
cd C:\Program Files\Java\your_JDK_version\bin
2.使用keytool
获取release SHA1:
keytool -list -v -keystore <keystore_name> -alias <alias_name>
3. 转到您的 project's credentials page 并将 SHA1 替换为您的密钥库的版本 SHA1。
【讨论】:
很抱歉听到这个消息。您是否成功从密钥库中获取了 SHA1? 是的,在链接中使用了上面的命令,你能看到我的代码吗?如果那里有东西 谢谢你在获取 SHA1 时出错了 非常感谢......你拯救了我的一天。如果可以的话,我会再次投票。 精彩拯救了我的一天+1【参考方案2】:我遇到了同样的问题。我想我发现谷歌不允许你为你的应用程序的调试和发布 apk 获得一个认证。您需要选择仅获取其中一个的证书。如果我错了,请纠正我。
我所做的是在此链接here
上为我的 release 密钥而不是我的调试密钥输入 SHA1 指纹凭据之后,我发布的 apk 工作正常,而不是我的调试密钥。
【讨论】:
可以将您的 SHA-1 更改为您的调试。我之前保存了发布和调试 SHA-1。为了改变它:打开你的谷歌云控制台>打开API管理器点击凭证>点击OAuth2客户端ID下的Android客户端应用程序。现在您可以更改您的 SHA-1 类型并保存。如果您重新加载配置文件创建页面,您将看到 SHA-1 已更改。现在只需创建新的配置文件并将其粘贴到您的 app/ 目录中。 @ChadMx 你如何 chagne SHA-1 我能理解【参考方案3】:@-vj-@ ==> API 密钥基于应用的数字证书的简短形式,称为 SHA-1 指纹。要显示证书的 SHA-1 指纹,首先确保您使用的是正确的证书。您可能有两个证书:
-> 调试证书:Android SDK 工具会在您进行调试构建时自动生成此证书。仅将此证书用于您正在测试的应用程序。不要尝试发布使用调试证书签名的应用。调试证书在 Android 开发者文档中的 Signing in Debug Mode 中有更详细的描述。
-> 发布证书:Android SDK 工具会在您进行发布构建时生成此证书。您还可以使用 keytool 程序生成此证书。当您准备好向全世界发布您的应用时,请使用此证书。
==> 显示调试证书指纹
找到您的调试密钥库文件。文件名为 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
==> 显示发布证书指纹
找到您的发布证书密钥库文件。发布密钥库没有默认位置或名称。如果您在构建要发布的应用程序时未指定一个,则构建将保留您的 .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
替换为您在创建证书时为其分配的别名。
【讨论】:
这个命令救了我!!!! keytool -list -v -keystore "%USERPROFILE%\.android\debug.keystore" -alias androiddebugkey -storepass android -keypass android 经过几天的搜索......谢谢【参考方案4】:您必须在 Firebase 控制台 Project->Setting->Android 中放置两个 SHA-1 密钥
1 个密钥:您的密钥库的密钥,即 keytool -list -v -keystore -alias
2 密钥:您的 Play 商店的密钥,即发布管理->应用签名->应用签名证书->SHA 1 密钥指纹
【讨论】:
感谢您拯救了我的一天。 2. 对我来说是个问题【参考方案5】:在巨大的开发者控制台中找到激活的地方并不难。也许我将来会帮助别人。 您必须在此处注册您的 Android 应用程序 - 在此 page 中“启用登录”:
只需输入控制台开发人员常用的值,即您签名的 SHA-1。 就是这样!
【讨论】:
【参考方案6】:FWIW:
对我来说,我已经在 Google 开发控制台和项目上安装的 google-services.json 文件中设置了发布和调试配置(Oath 客户端 ID、SHA-1 等)。
因为我正在使用多种构建风格,所以我将各种配置文件放在各自的 ./app/<flavorN>/
目录中。
我的错误是未能在“生成签名的 APK”向导中使用正确的密钥库文件、别名和密码生成签名的 APK。该向导正在缓存来自先前构建风格 (tsk) 的密钥和凭据。但是在重置键以映射到目标风味之后,我现在可以使用 Google 登录。
【讨论】:
【参考方案7】:如果您选择了App Signing
,则需要将开发者控制台生成的SHA1放入
对于 Firebase,将相同的 SHA1 放入您的项目设置中
【讨论】:
以上是关于谷歌登录签名的apk不起作用的主要内容,如果未能解决你的问题,请参考以下文章
当我制作签名的 APK 时,我的 Android 本地数据库不起作用
admob广告在签名的apk中不起作用,它在调试版本中工作得很好