Я пытаюсь заставить Google войти в приложение для работы с моим приложением. Пока что я думаю, что все сделал правильно. Я следовал документации Google о настройке GoogleSigninclient и могу заставить приложение попасть на кнопку входа, но когда кто-то пытается войти в приложение, оно возвращает ошибку 12500 (SIGN_IN_FAILED). У меня правильно настроены учетные данные Google API и правильно настроены в моем debug.keystore, а у меня скачан файл credentials.json и в папке моего приложения. Я опубликую свой код, кто-нибудь знает, почему он не работает?
Спасибо!
P.S. Просто чтобы отвлечь людей на проходе, я тестировал его на своем телефоне, который определенно имеет последнюю версию сервисов Google Play, поэтому я не думаю, что это проблема
import android.content.Intent; import android.support.v4.app.FragmentManager; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; import android.view.Menu; import android.view.MenuInflater; import android.view.View; import android.widget.LinearLayout; import android.widget.TextView; import com.google.android.gms.auth.api.Auth; 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.auth.api.signin.GoogleSignInResult; import com.google.android.gms.common.SignInButton; import com.google.android.gms.common.api.ApiException; import com.google.android.gms.common.api.Scope; import com.google.android.gms.tasks.Task; public class MainActivity extends AppCompatActivity { GoogleSignInClient mGoogleSignInClient; private static int RC_SIGN_IN = 100; private static final String TAG = "MainActivity"; private SignInButton signInButton = null; private LinearLayout calendarLayout; private TextView email; private TextView name; private TextView getId; private TextView scopes; //private Scope scope = new Scope("https://www.googleapis.com/auth/calendar.events.readonly"); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN) .requestEmail() .build(); mGoogleSignInClient = GoogleSignIn.getClient(this, gso); signInButton = findViewById(R.id.sign_in_button); signInButton.setSize(SignInButton.SIZE_STANDARD); signInButton.setColorScheme(SignInButton.COLOR_LIGHT); } @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] } @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); } } 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); } } public void updateUI(GoogleSignInAccount account) { if(account == null) { loadLogin(); } else { loadCalendar(account); } } public void loadCalendar(GoogleSignInAccount account) { if(signInButton != null) { signInButton.setVisibility(View.INVISIBLE); } calendarLayout = findViewById(R.id.calendarLinearLayout); calendarLayout.setVisibility(View.VISIBLE); name = findViewById(R.id.name); name.setText(account.getDisplayName()); email = findViewById(R.id.email); email.setText(account.getEmail()); getId = findViewById(R.id.getId); getId.setText(account.getId()); scopes = findViewById(R.id.scopes); scopes.setText(account.getRequestedScopes().toString()); } private void loadLogin() { signInButton.setVisibility(View.VISIBLE); signInButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { onSignInClicked(); } }); } private void onSignInClicked() { Intent signInIntent = mGoogleSignInClient.getSignInIntent(); startActivityForResult(signInIntent, RC_SIGN_IN); } }
Вот некоторые из логов, которые он добавил в logcat:
10-30 07:19:09.987 1832-1832/com.example.aydus.cs356app D/dalvikvm: GC_FOR_ALLOC freed 275K, 11% free 3222K/3584K, paused 2ms, total 2ms 10-30 07:22:50.604 1832-1838/com.example.aydus.cs356app E/jdwp: REQ: UNSUPPORTED (cmd=6/3 dataLen=12 id=0x005baf) 10-30 07:22:57.934 1832-1832/com.example.aydus.cs356app W/EGL_emulation: eglSurfaceAttrib not implemented 3093 12436 10-30 07:26:50.601 1832-1832/com.example.aydus.cs356app W/MainActivity: signInResult:failed code=12500
Для меня это было потому, что я включил подпись Google Play App, поэтому вам нужно получить SHA1 из раздела Управление выпуском -> Подпись приложения -> "Сертификат подписи приложения"
Это может быть поздний ответ, но полезен для некоторых. Включите Firebase для вашего проекта. Следуйте инструкциям по настройке приложения для Android. Убедитесь, что вы предоставили поддерживаемое электронное письмо. В моем случае проблема была в этом, и предоставление действительного электронного письма решило проблему.
Код ошибки 10 - DEVELOPER_ERROR: https://developers.google.com/android/reference/com/google/android/gms/common/api/CommonStatusCodes.html#DEVELOPER_ERROR
Это почти наверняка означает, что вы не правильно зарегистрировали свой SHA1 и Имя пакета в консоли Google API: https://developers.google.com/identity/sign-in/android/start
Если вы на 100% уверены, что сделали это правильно, убедитесь, что ваши GoogleSignInOptions правильные. В частности, убедитесь, что идентификатор веб-клиента (если вы его используете) принадлежит тому же проекту, где вы зарегистрировали свое имя пакета и SHA1.
Просто обновите ваши сервисы Google Play до последней версии. Если вы используете изображения AVD, Nexus 5 и 5X, поддерживающие Google Play. Как только эмулятор будет запущен, перейдите в меню Расширенные элементы управления > Google Play, затем обновите.