Google+サインイン機能の統合中にいくつかの問題に直面しました。これまで、必要なすべてのG +サインインAPIモジュールとコードを統合し、debug.keystoreのkeytoolを使用してSHA1を生成した後、google-services.jsonを/ app内に生成および配置し、GoogleクラウドにSHA1を貼り付けました。開発者コンソールですが、デバイスデバッグを実行しようとするときや「G +サインイン」をクリックするたびにLogCatで次のエラーが発生します。
E/GMPM:getGoogleAppIdがステータス:10で失敗しました
E/GMPM:アップロードはできません。アプリ測定が無効です。
D/SignInActivity:handleSignInResult:false
このhandleSignInResultは常にFalseを返し、サインインしてデータをさらに取得することはできません。あなたが誰かがそのような状況に直面したことがあるなら、ここで私を助けてください。この小さな障害は非常に厄介です。
みんなありがとう。
Plus.APIまたはAuth.GOOGLE_SIGN_IN_APIを使用していますか?後者は最新の改良版です。こちらをご覧ください: https://developers.google.com/identity/sign-in/Android/sign-in
Auth.GOOGLE_SIGN_IN_APIを使用している場合:
OnActivityResultで、以下のようなコードを使用すると、GoogleSignInStatusCodesで定義されるステータスコードを取得できます。 https://developers.google.com/Android/reference/com/google/Android/gms/auth/ api/signin/GoogleSignInStatusCodes
@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);
int statusCode = result.getStatus().getStatusCode();
}
}
最も一般的な問題は、正しいOAuth2クライアント登録が欠落していることです。 (残念ながら、今のところ、ステータスコードはINTERNAL_ERROR 8です。これは役に立ちません。)このスレッドを見てください: GoogleSignInOptions AndroidからrequestEmailを送信したときにINTERNAL_ERRORが発生しました
申請したことを確認してくださいSHA-1
のデバッグキーgoogle-services.json
ファイルの作成。
Sudhanshu Gaurが this post で指摘したように、最初に json設定ファイルを作成する で使用したのと同じキーを使用して署名付きapkを生成してみてください。次に、デバイスにインストールして、機能するかどうかを確認します。理由はAndroid [実行]をクリックしたときにStudioがapkに署名しないためです。
まったく同じ問題に悩まされていましたが、この修正はうまくいきました。
すべてのSHA-1フィンガープリントをfirebaseに追加している場合、エラーが発生します(この問題に直面していました。この手順を実行すると解決します)。この手順を試してください。
1. Google Console API認証情報 ページに移動します。
2.(左)タブのcredentialsをクリックします。
3.すでに2つのデフォルトAndroidとWeb OAuthクライアントIDが存在します。作成する必要がありますOne Android ClientおよびOneWeb 2.0 Client。
4。Firebaseに移動します。プロジェクト設定でgoogle-services.jsonをダウンロードし、アプリフォルダーに貼り付けます。
(すべては問題ありませんが、Googleにサインインできない場合は、多分OAuth問題です。したがって、AndroidとWebクライアントIDを作成してください。 2 Android Client and Two Web client Id。)
アプリで署名証明書のSHA-1ハッシュを提供する必要があります
例:
登録済みのSHA-1:
CF:4A:A1:0A:BC:84:F2:31:28:C3:BA:A7:A3:A2:36:10:5F:1D:3E:CBそして作成した設定ファイルをダウンロードして、置き換えます* yourproject/app/google-service.jsonに
// google-service.jsonファイルのチュートリアルを取得 https://developers.google.com/identity/sign-in/Android/start-integrating
// SHA-1の取得方法 https://developers.google.com/Android/guides/client-auth
package com.google.samples.quickstart.signin;
import Android.content.Intent;
import Android.os.Bundle;
import Android.support.annotation.NonNull;
import Android.support.annotation.Nullable;
import Android.support.v7.app.AppCompatActivity;
import Android.util.Log;
import Android.view.View;
import Android.widget.TextView;
import com.google.Android.gms.auth.api.signin.GoogleSignIn;
import com.google.Android.gms.auth.api.signin.GoogleSignInAccount;
import com.google.Android.gms.auth.api.signin.GoogleSignInClient;
import com.google.Android.gms.auth.api.signin.GoogleSignInOptions;
import com.google.Android.gms.common.SignInButton;
import com.google.Android.gms.common.api.ApiException;
import com.google.Android.gms.tasks.OnCompleteListener;
import com.google.Android.gms.tasks.Task;
/**
* Activity to demonstrate basic retrieval of the Google user's ID, email address, and basic
* profile.
*/
public class SignInActivity extends AppCompatActivity implements
View.OnClickListener {
private static final String TAG = "SignInActivity";
private static final int RC_SIGN_IN = 9001;
private GoogleSignInClient mGoogleSignInClient;
private TextView mStatusTextView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main_DEMO);
// Views
mStatusTextView = findViewById(R.id.status);
// Button listeners
findViewById(R.id.sign_in_button).setOnClickListener(this);
findViewById(R.id.sign_out_button).setOnClickListener(this);
findViewById(R.id.disconnect_button).setOnClickListener(this);
// [START configure_signin]
// 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();
// [END configure_signin]
// [START build_client]
// Build a GoogleSignInClient with the options specified by gso.
mGoogleSignInClient = GoogleSignIn.getClient(this, gso);
// [END build_client]
// [START customize_button]
// Set the dimensions of the sign-in button.
SignInButton signInButton = findViewById(R.id.sign_in_button);
signInButton.setSize(SignInButton.SIZE_STANDARD);
signInButton.setColorScheme(SignInButton.COLOR_LIGHT);
// [END customize_button]
}
@Override
public void onStart() {
super.onStart();
// [START on_start_sign_in]
// Check for existing Google Sign In account, if the user is already signed in
// the GoogleSignInAccount will be non-null.
GoogleSignInAccount account = GoogleSignIn.getLastSignedInAccount(this);
updateUI(account);
// [END on_start_sign_in]
}
// [START onActivityResult]
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
// Result returned from launching the Intent from GoogleSignInClient.getSignInIntent(...);
if (requestCode == RC_SIGN_IN) {
// The Task returned from this call is always completed, no need to attach
// a listener.
Task<GoogleSignInAccount> task = GoogleSignIn.getSignedInAccountFromIntent(data);
handleSignInResult(task);
}
}
// [END onActivityResult]
// [START handleSignInResult]
private void handleSignInResult(Task<GoogleSignInAccount> completedTask) {
try {
GoogleSignInAccount account = completedTask.getResult(ApiException.class);
// Signed in successfully, show authenticated UI.
updateUI(account);
} catch (ApiException e) {
// The ApiException status code indicates the detailed failure reason.
// Please refer to the GoogleSignInStatusCodes class reference for more information.
Log.w(TAG, "signInResult:failed code=" + e.getStatusCode());
updateUI(null);
}
}
// [END handleSignInResult]
// [START signIn]
private void signIn() {
Intent signInIntent = mGoogleSignInClient.getSignInIntent();
startActivityForResult(signInIntent, RC_SIGN_IN);
/* Intent sign = mGoogleSignInClient.getSignInIntent ();
startActivityForResult ( sign, RC_SIGN_IN );*/
}
// [END signIn]
// [START signOut]
private void signOut() {
mGoogleSignInClient.signOut()
.addOnCompleteListener(this, new OnCompleteListener<Void>() {
@Override
public void onComplete(@NonNull Task<Void> task) {
// [START_EXCLUDE]
updateUI(null);
// [END_EXCLUDE]
}
});
}
// [END signOut]
// [START revokeAccess]
private void revokeAccess() {
mGoogleSignInClient.revokeAccess()
.addOnCompleteListener(this, new OnCompleteListener<Void>() {
@Override
public void onComplete(@NonNull Task<Void> task) {
// [START_EXCLUDE]
updateUI(null);
// [END_EXCLUDE]
}
});
}
// [END revokeAccess]
private void updateUI(@Nullable GoogleSignInAccount account) {
if (account != null) {
mStatusTextView.setText(getString(R.string.signed_in_fmt, account.getDisplayName()));
findViewById(R.id.sign_in_button).setVisibility(View.GONE);
findViewById(R.id.sign_out_and_disconnect).setVisibility(View.VISIBLE);
} else {
mStatusTextView.setText(R.string.signed_out);
findViewById(R.id.sign_in_button).setVisibility(View.VISIBLE);
findViewById(R.id.sign_out_and_disconnect).setVisibility(View.GONE);
}
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.sign_in_button:
signIn();
break;
case R.id.sign_out_button:
signOut();
break;
case R.id.disconnect_button:
revokeAccess();
break;
}
}
}
最初にデバッグキーを生成します。
keytool -exportcert -list -v \
-alias androiddebugkey -keystore ~/.Android/debug.keystore
次に、SHA1を指紋セクションのFirebaseまたはGoogleプロジェクトの設定に貼り付けます。
SHA-1に追加されたキーがデバッグまたはリリースされていることを確認してください。これは、キーに基づいて相対的に機能します。私は同じ問題を抱えていますが、リリースSHA-1を使用していることを理解していますが、デバッグでテストすると間違った結果が得られます。ありがとう