谷歌登录签名的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/&lt;flavorN&gt;/ 目录中。

我的错误是未能在“生成签名的 APK”向导中使用正确的密钥库文件、别名和密码生成签名的 APK。该向导正在缓存来自先前构建风格 (tsk) 的密钥和凭据。但是在重置键以映射到目标风味之后,我现在可以使用 Google 登录。

【讨论】:

【参考方案7】:

如果您选择了App Signing,则需要将开发者控制台生成的SHA1放入

对于 Firebase,将相同的 SHA1 放入您的项目设置中

【讨论】:

以上是关于谷歌登录签名的apk不起作用的主要内容,如果未能解决你的问题,请参考以下文章

Android:谷歌登录在发布模式下不起作用[关闭]

Rxjava 在签名的 apk 中不起作用

当我制作签名的 APK 时,我的 Android 本地数据库不起作用

admob广告在签名的apk中不起作用,它在调试版本中工作得很好

带有新发件人 ID 和现有密钥库的推送通知在签名的 apk 中不起作用

启用 Google Play 应用签名后 Gmail 登录不起作用