Исключение безопасности Google Awareness API выброшено

Я использую DetectedActivityFence от Google Awareness API. Он отлично работает на моих собственных устройствах, но я получил несколько сбоев в Crashlytics по поводу SecurityException.

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)

Это произошло без какой-либо корреляции между версиями Android, то есть это касается устройств разных производителей и разных версий Android (5.x-6.x). Эти устройства не рутированы и выглядят как работающие на Stock ROM. Эта проблема появляется у 10% моих пользователей.

Я уверен, что я использую правильный ключ API, иначе я могу увидеть сбой на своем собственном устройстве, могу ли я?

Кто-нибудь сталкивался с такой же проблемой?

4 ответа

Решение

Существует ошибка, которая ошибочно принимает некоторые ошибки сетевой операции, чтобы аутентифицировать приложение как указание на то, что ключ API был настроен неправильно, даже если фактическая ошибка была чем-то другим. Это было исправлено внутри и будет выпущено в следующем выпуске сервисов Google Play.

На данный момент лучший обходной путь - это добавить UncaughtExceptionHandler в поток, который вызывает GoogleApiClient.connect(). Если вы вызываете GoogleApiClient.connect () в главном потоке, вы можете получить экземпляр Thread через Looper.myLooper(). GetThread().

От: https://code.google.com/p/android/issues/detail?id=223751

В наших проверках есть ошибка, которая иногда выдает это исключение SecurityException при сетевой ошибке аутентификации. Исправление будет выпущено в следующей версии сервисов Google Play.

На данный момент лучшим обходным путем будет установка UncaughtExceptionHandler в потоке, который вы вызываете GoogleApiClient.connect(). Для большинства людей это будет в основном потоке, который вы можете получить через Looper.myLooper(). GetThread().

Но вы также заметите, что ответы показывают, что это не сплошная работа вокруг.

Вы также можете заметить, что OP этого потока ссылается на этот пост SO, но принятый ответ не ссылается на поток, даже если они дословно скопированы из него. Очень плохая форма!

Я боролся почти день и нашел другой ответ. Хотя принятый ответ был верным в то время.

Единственное, что мне помогло, так это генерация API-ключа на консоли разработчика Google с использованием отладочного хранилища ключей для целей тестирования и его замена на релизное хранилище ключей при запуске в производство.

Как сгенерировать ключ API? Пожалуйста, проверьте само слово Google здесь

Надеюсь, это поможет кому-то в будущем.

Я столкнулся с этой проблемой, когда получал ту же ошибку, и подумал, что это могут быть ключи API Awareness, которые не синхронизируются с Google Developer Console. После долгих поисков и получения той же ошибки я вернулся к API Awareness в Google. Разработчик консоли и понял, что мой Awareness API не был включен, хотя у меня был установлен пакет и действительный ключ API. Также убедитесь, что ключ API установлен в вашем манифесте. Надеюсь, это кому-нибудь поможет.

Другие вопросы по тегам