web-dev-qa-db-ja.com

Google SignIn API例外10

認証の最終段階に近づいていますが、handleSignInResultメソッドで問題が発生しています。例外コード10(開発者エラー)をログに返します。 Googleは包括的な説明を提供します:

アプリケーションが正しく構成されていません。このエラーは回復できず、致命的なエラーとして扱われます。開発者はばかです...

これを処理(アカウントを取得)し、最後にアカウントから値を取得するにはどうすればよいですか?
ご協力いただきありがとうございます!!!

主な活動:

package ru.podgorny.carcall;

import ...

public class MainActivity extends AppCompatActivity {

        SignInButton signInButton;
        public static final int RC_SIGN_IN = 07;
        public static final String TAG = "MainActivity";
        TextView tw1;
        TextView tw2;


        GoogleSignInOptions gso;
        GoogleSignInClient mGSC;


        @Override
        protected void onCreate (Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Log.d(TAG, "Activity Works");
        findViews();

            gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
                    .requestEmail()
                    //.requestProfile()
                    .build();

            mGSC = GoogleSignIn.getClient(this, gso); //smth with mGSC variable....

             View.OnClickListener onClickListener = new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    onClick2(v);
                }
            };
             signInButton.setOnClickListener(onClickListener);




    }

    private void findViews() {
            Log.d (TAG, "findViews started");
        signInButton = findViewById(R.id.idButtonGoogle);

        tw1 = findViewById(R.id.textView1);
        tw1 = findViewById(R.id.textView2);

        Log.d(TAG, "Views finded");


    }

    public void onClick2(View view) {
            Log.d(TAG, "onClick started");
        switch (view.getId()) {
            case R.id.idButtonGoogle:
                signIn();
                break;
        }
        Log.d(TAG, "OnClick Started");
    }

    public void signIn() {

        Intent signInIntent = mGSC.getSignInIntent();
        startActivityForResult(signInIntent, RC_SIGN_IN);
        Log.d(TAG, "startActivityForResult works");

    }

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        Log.d(TAG, "OnActivityResult started");
        // 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.
            Log.d(TAG, "TASK started");
            Task<GoogleSignInAccount> task = GoogleSignIn.getSignedInAccountFromIntent(data);
            handleSignInResult(task);
            Log.d(TAG, "OnActivityResult returned");
        }
    }

    private void handleSignInResult(Task<GoogleSignInAccount> completedTask) {
        try {
            GoogleSignInAccount account = completedTask.getResult(ApiException.class);//ERROR -- Code 10
            Log.d(TAG, "Account received");


            updateUI(account);
            Log.d(TAG, "updateUI Launched");
        } catch (ApiException e) {

            Log.w(TAG, "signInResult:failed code=" + e.getStatusCode());
            updateUI(null);
        }
    }

    private void updateUI(GoogleSignInAccount account) {
            if (account!=null) {
                tw1.setText("OK");
                tw2.setText("Name: " + account.getGivenName() + ", Family name: " + account.getFamilyName() + ", Email: " + account.getEmail() /*+ " image: " +
                        account.getPhotoUrl()*/);
            }else {
                tw1.setText("SMTH wrong");
            }

        }

}
9
max podgorny

このエラーは、console.developers.googleconsole.firebase.google.comで同じプロジェクトを使用していない場合に発生する可能性があります。両方のコンソールでプロジェクトが同じ場合は、SHA1キーを適切に追加していることを確認してください。 Get SHA1 from Android studio。

  1. 開くAndroid Studio
  2. プロジェクトを開く
  3. Gradleをクリックします(右側のパネルから、Gradle Barが表示されます)
  4. [更新]をクリックします(Gradleバーから[更新]をクリックすると、プロジェクトのリストGradleスクリプトが表示されます)
  5. プロジェクトをクリックします(プロジェクト名フォームリスト(ルート))
  6. タスクをクリックします
  7. Androidをクリックします
  8. SigningReportをダブルクリックします(実行バーにSHA1とMD5が表示されます(Gradleコンソールに表示される場合もあります))。
  9. アプリケーションを実行またはデバッグするには、モジュール選択ドロップダウンからアプリモジュールを選択します。また、firebaseコンソールからgoogle-services.jsonを取得してプロジェクトに配置する必要があります。
17
Patrick R

私は同じ問題に着陸し、時間を無駄にしました。 OAuthとOpenIdをさらに詳しく調べたところ、その理由がわかりました。ここでは概念的なエラーを行っています。

Androidまたはその他のプラットフォーム(Webを除く)の場合、Google APIコンソールの同じプロジェクトで少なくとも2種類のクライアントIDを作成する必要があります。これらのクライアントIDタイプは次のとおりです。

  1. ウェブアプリケーション
  2. Android

これらは任意の順序で作成できます。 Android type Client Idを作成するときは、パッケージ名とSHA1を指定する必要があります。WebアプリケーションIDを作成するときは、名前を指定するだけです。

バックエンドでユーザーを確認するまで、これらのIDをさらに操作する必要はありません。つまり、バックエンドサーバーでこのユーザーの情報をgoogleサーバーに問い合わせる場合、必要なのはWebアプリケーションIDだけです。概念的なフローは次のとおりです。

  1. 最初に、AndroidアプリからGoogleサインインサーバーに、リクエストIDトークン(your_web_app_client_id)を使用して追加オプションとして)からWebアプリケーションクライアントIDを送信します。
  2. ユーザーがログインすると、Androidアプリでトークンが返されます。
  3. このトークンをバックエンドに送信します。
  4. これで、バックエンドはこのトークンをGoogleサーバーと交換してユーザーの情報を取得できます

このWebアプリケーションクライアントIDをAndroidアプリからバックエンドサーバーに送信します。

バックエンドでユーザーを確認する場合は、このWebアプリケーションIDを使用します。

1
Shyam Swaroop

@Patrick Rが回答する理由(上記の作品/正しいとマークされている)に関する補足情報を追加したいと思います。プロジェクト/プラクティスを実行するには、Google Playマーケットでの配布時に、Google ConsoleがSHA-1キーを介してアプリにIDを付ける必要がありますただし、ログイン確認と概念実証を実験するだけの場合これは、デバッグSHA-1キー(アプリがこれを自動的に生成する)をこの正確な目的に関連付けて、テストと製品の変更をモジュール化します。

1