谷歌登录签名apk无法正常工作

时间:2016-03-16 19:51:17

标签: java android google-api google-signin

一切正常,直到我生成签名的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'


}
  1. 我的登录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();
            }
        }
    }
    
    1. 我的布局代码

          <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"
      
              />
      

6 个答案:

答案 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)

如果您选择了App Signing,则需要放置从开发人员控制台生成的SHA1

enter image description here

对于Firebase,在项目设置中放置相同的SHA1

enter image description here

相关问题