Próbuję zintegrować Google Sign In z moją aplikacją. Nie mam serwera zaplecza, po prostu pobieram dane zalogowanego konta Google do mojej aplikacji.
Po raz pierwszy wypróbowałem to za pomocą przykładu logowania Google, ale wystąpił błąd (nie wprowadzono żadnych zmian w kodzie z wyjątkiem wydrukowania poniższego śladu stosu). Właśnie użyłem przykładu SignInActivity, ponieważ nie mam serwera zaplecza.
Exception com.google.android.gms.common.api.ApiException: 12500:
at com.google.android.gms.common.internal.zzb.zzz(Unknown Source)
at com.google.android.gms.auth.api.signin.GoogleSignIn.getSignedInAccountFromIntent(Unknown Source)
at com.ewise.android.api.MainActivity.onActivityResult(SignInActivity.java:89) at android.app.Activity.dispatchActivityResult(Activity.java:7010)
at android.app.ActivityThread.deliverResults(ActivityThread.java:4187)
at android.app.ActivityThread.handleSendResult(ActivityThread.java:4234)
at android.app.ActivityThread.-wrap20(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1584)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6316)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:872)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:762)
Kod
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);
// 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());
e.printStackTrace();
updateUI(null);
}
}
// [END handleSignInResult]
// [START signIn]
private void signIn() {
Intent signInIntent = mGoogleSignInClient.getSignInIntent();
startActivityForResult(signInIntent, 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;
}
}
}
Z tego, co przeczytałem, przyczyną problemu może być generacja SHA1 .
Postępowałem zgodnie z kompletnym przewodnikiem, ale najwyraźniej nie działa.
Skopiowałem SHA1 z Gradle SigningReport
Variant: debug
Config: debug
Store: /Users/user/.android/debug.keystore
Alias: AndroidDebugKey
MD5: A3:16:3F:43:75:FE:07:62:6D:8D:CC:DD:21:9F:FA:1A
SHA1: 7B:21:26:7F:D8:18:BB:0E:36:1C:82:DD:B7:28:5F:C1:2F:5C:E4:EA
Valid until: Saturday, August 31, 2047
----------
Variant: release
Config: none
----------
Variant: debugAndroidTest
Config: debug
Store: /Users/user/.android/debug.keystore
Alias: AndroidDebugKey
MD5: A3:16:3F:43:75:FE:07:62:6D:8D:CC:DD:21:9F:FA:1A
SHA1: 7B:21:26:7F:D8:18:BB:0E:36:1C:82:DD:B7:28:5F:C1:2F:5C:E4:EA
Valid until: Saturday, August 31, 2047
----------
Variant: debugUnitTest
Config: debug
Store: /Users/user/.android/debug.keystore
Alias: AndroidDebugKey
MD5: A3:16:3F:43:75:FE:07:62:6D:8D:CC:DD:21:9F:FA:1A
SHA1: 7B:21:26:7F:D8:18:BB:0E:36:1C:82:DD:B7:28:5F:C1:2F:5C:E4:EA
Valid until: Saturday, August 31, 2047
jaka może być tego przyczyna?
Dzięki
PS Czy to możliwa przyczyna?
Google Play services out of date. Requires 11720000 but found 10932470
android
google-signin
Aaron
źródło
źródło
Odpowiedzi:
Po prostu zaktualizuj swoje usługi Google Play do najnowszej wersji (lub 11720000 w tym przypadku). Jeśli używasz formatu AVD, obrazy Nexusa 5 i 5X obsługują Google Play. Po uruchomieniu emulatora przejdź do menu Extended Controls> Google Play, a następnie zaktualizuj.
źródło
Błąd PlatformException (sign_in_failed, com.google.android.gms.common.api.ApiException: 12500:, null)
źródło
Sprawdź, czy odciski palców SHA-1 są dodawane do ustawień projektu Firebase. Jeśli nie, znajdź odcisk palca SHA-1 za pomocą
https://developers.google.com/android/guides/client-auth
Znajdź również odcisk palca SHA-1 klucza zwalniającego za pomocą
Usuń
<keystore path>
ze ścieżką magazynu kluczy.Następnie dodaj oba odciski cyfrowe SHA-1 do ustawień projektów Firebase.
Uwaga: nie zapomnij zastąpić google-services.json zaktualizowanym plikiem google-services.json nowymi odciskami palców. Straciłem na tym dwa dni.
Podczas debugowania
Studio Android automatycznie generuje się
~/.android/debug.keystore
przy pierwszej kompilacji do debugowania i używa go do podpisywania aplikacji.Aby uzyskać uruchomienie SHA-1 (hasło
android
) ( dokument ):To
SHA-1
powinien być dodany do ustawień aplikacji wfirebase
celu umożliwienia wykorzystania google znak w możliwościach podczas testowania debugowania.źródło
dla błędu 12500 Musisz dodać wsparcie gmail tylko w ustawieniach firebase, a dla błędu 10 dodać odcisk palca ssh w konsoli firebase, jak widać na obrazku
źródło
E-mail wsparcia, a także wszystkie linki do projektu i prywatności są niezbędne do działania Google SignIn, w przeciwnym razie wyrzuca 12500.
Ustaw go na https://console.developers.google.com/apis/credentials u dołu drugiej karty o nazwie „Ekran akceptacji OAuth” - znajdziesz tam trzy linki, które należy skonfigurować.
Nie jest to NIGDZIE wspomniane w przewodnikach po Firebase.
źródło
Spróbuj zaktualizować ekran akceptacji OAuth na https://console.developers.google.com/apis/credentials
źródło
Utknąłem z tym na chwilę.
Upewnij się, że wykonano te czynności-
źródło
Wygląda na to, że Twój SHA1 został nadpisany przez sklep Google Play. Sprawdź w swoim sklepie Google Play, panelu uruchamiania, pod podpisywaniem aplikacji, sprawdź, czy Google Play ma dodany dodatkowy SHA1.
I skopiuj ten SHA1, dodaj do odpowiedniego miejsca, zrobi to.
źródło
Jeśli nadal jest ktoś z podobnym problemem, jeśli dodajesz niestandardowe zakresy, upewnij się, że jest to prawidłowy zakres. W moim przypadku wymieszałem zakresy Facebooka z zakresami Google i zajęło mi trochę czasu, zanim to rozgryzłem!
źródło
Używam uwierzytelniania Firebase. Mój SHA-1 został wskazany poprawnie, identyfikator klienta również był poprawny, ale nadal otrzymywałem 12500.
Okazało się, że moim problemem było to, że nie wskazałem adresu e-mail pomocy technicznej w ustawieniach projektu. (Ustawienia -> zakładka Ogólne -> Twój projekt (Ustawienia publiczne)).
źródło
Myślę, że błąd pochodzi z niewłaściwego SHA1. Proszę nie zapominać, że SHA1 różni się między trybem wydania a trybem debugowania w Android Studio. Zamiast używać narzędzia keytool, aby uzyskać SHA1, możesz użyć projektu Gradle -> Zadanie -> android -> podpisywanieReport w studiu android (można go otworzyć za pomocą menu Widok -> Okno narzędzi -> gradle), aby uzyskać zwolnienie i debugowanie SHA1. Następnie, aby ułatwić pracę, musisz utworzyć 2 oddzielne poświadczenia z dwoma SHA1 w konsoli Google w chmurze (Google po prostu poinstruuje, aby utworzyć 1 za pomocą wersji SHA1, kiedy opracujemy, nie będzie działać, ponieważ używa debugowania SHA1).
źródło
Przejdź do swojego projektu w konsoli Firebase, otwórz Ustawienia projektu, dodaj tam swoje odciski cyfrowe certyfikatu SHA. Pobierz zaktualizowany plik google-services.json i dodaj go do folderu aplikacji Projekty.
To zadziałało dla mnie.
źródło
Najpierw upewnij się, że zarejestrowałeś swoją aplikację w konsoli programistów Google
Upewnij się, że zarówno
debug
irelease
klawiszy w aplikacji Firebase. Jeśli ten błąd pojawia się w środowisku produkcyjnym, dodaj swojąSHA-1 release key
aplikację do bazy ognia. Jeśli pojawi się w fazie rozwoju, dodaj swójSHA-1 debug key
.Pobieranie klucza debugowania / wydania:
Pamiętaj, aby pobrać zaktualizowaną
google-services.json
aplikację do swojej aplikacji.źródło
U mnie problem polegał na używaniu identyfikatora klienta „wydania” w mojej aplikacji skonfigurowanej do debugowania. Upewnij się, że masz klucz wydania i debugowania, używając odpowiednio każdego SHA-1.
źródło
Jeśli przyjeżdżasz tutaj z fluttera : jest to jeden z narożnych przypadków, które musimy naprawić zgodnie z dokumentacją tutaj: https://pub.dev/packages/google_sign_in
źródło
Gdy Twoja aplikacja uwierzytelnia się na serwerze zaplecza lub uzyskuje dostęp do interfejsów API Google z serwera zaplecza, musisz przekazać identyfikator klienta OAuth 2.0 utworzony dla Twojego serwera do metody requestIdToken podczas konstruowania obiektu GoogleSignInOptions, aby uzyskać dostęp do podstawowych informacji o profilu użytkownika . Nie zapomnij też przesłać e-maila do pomocy technicznej na ekranie akceptacji OAuth, który znajduje się na stronie Poświadczenia w konsoli API.
źródło
W moim przypadku ten błąd wystąpił, ponieważ uwierzytelnianie Androida zostało usunięte przez starszy zespół, ponieważ wydaje się, że nie ma potrzeby używania klucza Androida do uwierzytelniania zaplecza. Dlatego do logowania w Google potrzebne są zarówno klucze klienta Android, jak i klienta WWW.
źródło
Może się również zdarzyć, że kompilator Cordova nie może znaleźć odpowiedniego pliku kluczy.
Rozwiązanie: Przed wykonaniem
ionic cordova build android
określ właściwości podpisywaniaKrok 1 : Wygeneruj plik kluczy debugowania
Wykonaj polecenie
Użyj hasła:
android
Krok 2: Skopiuj plik kluczy (
debug.keystore
) z~/.android
doplatform/android
katalogu bieżącym projekcieKrok 3: utwórz plik o nazwie release-signing.properties w
platform/android
kataloguKrok 4: Dodaj zawartość do pliku
Krok 5: Teraz buduj
ionic cordova build android
źródło
Doświadczyłem tego samego problemu po otwarciu mojego projektu na innym komputerze (inny Android Studio). W moim przypadku rozwiązałem to za pomocą Asystenta Firebase, którego użyłem do początkowej konfiguracji Firebase. Otworzyłem Asystenta Firebase (Narzędzia> Firebase) i wybierz Uwierzytelnianie> Połącz. Spowodowało to ponowne połączenie projektu z Firebase i zaktualizowanie konfiguracji
źródło
Utknąłem w problemie z logowaniem Google od 2 tygodnia, w końcu dobrze to załatwiłem. Pozwól mi wyjaśnić powód. Problem był związany z firebase. W Firebase wspomnieli o polu „e-mail wsparcia” jako opcjonalnym. Ale po dodaniu go (dowolnego osobistego e-maila) problem został rozwiązany i otrzymałem odpowiedź. Jeśli otrzymujesz błąd jako 12501, jest to związane z ustawieniami na Twoim koncie Google.
źródło
Utknąłem z tym na chwilę.
Upewnij się, że wykonano te czynności-
źródło
W moim przypadku dzieje się tak z powodu niewłaściwego identyfikatora klienta Google. Zmieniam swój klucz na klucz wymieniony w
google-services.json
(podoauth_client
obiektem)źródło
Upewnij się, że poprawnie skonfigurowałeś następujące rzeczy:
strings.xml
,google-services.json
lubcredentials.json
pliku.źródło
https://developers.google.com/identity/sign-in/android/sign-in postępuj zgodnie z tą dokumentacją API, ale pamiętaj, że wewnątrz WEB_CLIENT_ID użyj wartości identyfikatora klienta, który jest generowany w pliku google-services.json.
źródło
W moim przypadku po dodaniu odcisku palca w konsoli Firebase został on automatycznie odebrany przez konsolę programisty Google i pokazany odciski palców. Ale logowanie nie działa. Po przejrzeniu każdego kroku doszedłem do wniosku, że Google odwrócił mój pakiet pliku manifestu w ten sposób
com.xxxxxxxx.app
. Ale tak naprawdę jestapp.xxxxxxxx.com
w konsoli programisty Google. Więc usunąłem auto utworzyło odcisk palca i dodałem odcisk palca z poprawną nazwą pakietu. BUM!!. Zadziałało.źródło
Błąd pojawił się, gdy opcja Google nie została włączona, jak pokazano na obrazku .
Stało się to, gdy zmieniłem konto Google i zapomniałem włączyć opcję łączenia się z Google.
źródło
Upewnij się, że projekt nie powinien zawierać żadnych znaków specjalnych, w tym liczb ani innych symboli (nazwa projektu powinna być prosta, jak com.google.testproject)
źródło
W moim przypadku pracowałem nad aplikacją nieprodukcyjną, problem polegał na tym, że podczas tworzenia projektu w konsoli Firebase występowały problemy z synchronizacją kluczy SHA-1 tam iz powrotem z konsol programistycznych Firebase i Google. Postanowiłem więc najpierw stworzyć projekt w konsoli Google Developer, a następnie wybrać go podczas tworzenia nowego projektu w konsoli Firebase.
Stworzyłem również poradnik , który może ci pomóc.
źródło
W moim przypadku problem polegał na tym, że mój emulator nie miał Sklepu Play. Emulator (o nazwie API 23) wykonałem za pośrednictwem Visual Studio, ponieważ programuję również przy użyciu Xamarin.Forms, aw programie Visual Studio Android Device Manager możesz wybrać, czy Twój emulator ma mieć Google Play Store.
Musiałem stworzyć emulator za pomocą AVD Android Studio i upewnić się, że ma Sklep Play:
źródło
Wypróbuj te opcje:
Pyta o hasło i po prostu wprowadź hasło. Możesz zobaczyć odciski palców SHA1, MD5.
źródło