2016-09-08 18 views
7

Używam DetectedActivityFence z Google Awareness API. Działa to dobrze na moich urządzeniach, ale otrzymałem kilka awarii w Crashlytics o SecurityException.Wyjątek wyjątku bezpieczeństwa interfejsu Google API

Fatal Exception: java.lang.SecurityException: Invalid API Key for package = [package_name] .Status code received = -1 
    at android.os.Parcel.readException(Parcel.java:1540) 
    at android.os.Parcel.readException(Parcel.java:1493) 
    at com.google.android.gms.common.internal.zzu$zza$zza.zza(Unknown Source) 
    at com.google.android.gms.common.internal.zzd.zzqz(Unknown Source) 
    at com.google.android.gms.internal.zzpw$zzc.zzapl(Unknown Source) 
    at com.google.android.gms.internal.zzpw$zzf.run(Unknown Source) 
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:422) 
    at java.util.concurrent.FutureTask.run(FutureTask.java:237) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) 
    at com.google.android.gms.internal.zzrn.run(Unknown Source) 
    at java.lang.Thread.run(Thread.java:818) 

Stało się to bez żadnych związków między Androidzie, to znaczy wpływa na urządzenia od różnych producentów, i różnych Androidzie (5.x-6.x). Te urządzenia nie są zrootowane i wyglądają jak działające na Stock ROM. Ten problem występuje u 10% moich użytkowników.

Jestem pewien, że używam właściwego klawisza API, bo inaczej widzę awarię na moim własnym urządzeniu, czy mogę?

Czy ktoś miał ten sam problem?

+0

czy utworzyłeś klucz API w konsoli Google? – Amy

+0

@Amy tak, działa na moich urządzeniach i zakładam, że klucz jest właściwy. –

+0

@aeinsam Klucz interfejsu API * *, który został wygenerowany przy użyciu dowolnej * nazwy pakietu * nazwy * pakietu *, jest różny. Mam na myśli sprawdzanie nazwy pakietu twojej aplikacji i tego, który wpisałeś w konsoli programisty podczas generowania klucza * API *. –

Odpowiedz

5

Istnieje błąd, który błędnie pomyłki niektóre błędy z operacji sieciowych do uwierzytelniania aplikacji jako wskazujące, że klucz API nie został poprawnie skonfigurowany, mimo że rzeczywisty błąd był czymś innym. Zostało to naprawione wewnętrznie i zostanie wdrożone w następnej wersji usługi Google Play.

Na razie najlepszym rozwiązaniem jest dodanie wyjątku UncaughtExceptionHandler w wątku, który wywołuje GoogleApiClient.connect(). Jeśli wywołasz GoogleApiClient.connect() w głównym wątku, możesz pobrać instancję Thread przez Looper.myLooper(). GetThread().

+2

Fix zostanie wprowadzony na początku 2017 roku. – mochu

+1

Skąd to wiesz? – mklimek

+0

Wydaje się być sparafrazowane z raportu o błędzie. Utworzyłem nową odpowiedź, która jest właściwie przywoływana. Ważne jest, aby mieć oko na ten wątek i wprowadzać tam aktualizacje. Z tego, co czytam, nie ma zgody, czy to "najlepsze obejście" nawet działa. Zgłaszaj się, aby nie przypisywać swojego źródła. –

0

Od: https://code.google.com/p/android/issues/detail?id=223751#c2

Jest to błąd w naszych kontroli, które jest czasem rzucania tego SecurityException gdy jest błąd sieci w celu uwierzytelnienia. Poprawka zostanie wdrożona w następnej wersji usług Google Play.

Na razie najlepszym obejściem byłoby ustawienie UncaughtExceptionHandler w wątku, który nazywa się GoogleApiClient.connect(). Dla większości ludzi byłby to główny wątek , który można uzyskać za pomocą Looper.myLooper(). GetThread().

Ale zauważysz również, że odpowiedzi wskazują, że nie jest to porządna praca.

Możesz również zauważyć, że OP tego wątku odwołuje się do tego wpisu SO, ale zaakceptowana odpowiedź nie odwołuje się do wątku, nawet jeśli zostały skopiowane z niego dosłownie. Bardzo zła forma!

0

Natknąłem się na ten problem, ponieważ otrzymywałem ten sam błąd i pomyślałem, że może to być klucze interfejsu API Awareness nie synchronizujące się z konsolą programisty Google, po wielu poszukiwaniach i uzyskaniu tego samego błędu, wróciłem do Interfejs API Awareness w Google Developer Console i zrealizowany interfejs API Awareness nie został włączony, mimo że miałem zestaw pakietów i posiadałem prawidłowy klucz API. Upewnij się też, że klucz API jest ustawiony w twoim Manifeście. Mam nadzieję, że to pomaga komuś.

0

Walczyłem prawie dzień i znalazłem inną odpowiedź. Chociaż przyjęta odpowiedź była wtedy prawidłowa.

Jedyne, co mi pomogło, to generowanie klucza API w Google Developer Console przy użyciu pliku kluczy debugowania w celu testowania i zastępowanie go plikiem magazynu kluczy wydania podczas przechodzenia do produkcji.

Jak wygenerować klucz API?Sprawdź samo słowo Google'a: Here

Mam nadzieję, że pomoże komuś w przyszłości.

Powiązane problemy