#android #location #google-play-services #android-pendingintent
#Android #Расположение #google-play-services #android-pendingintent
Вопрос:
В настоящее время я расследую сложную проблему, с которой я сталкиваюсь в своем приложении. Похоже, что мое приложение (сильно зависящее от местоположения, но также использующее Google Analytics и службу задач GCM) вызывает сбой служб Google Play. (Иногда всплывающее окно появляется довольно часто, но затем снова исчезает на часы — дни).
Я действительно не могу отследить, откуда возникает проблема, и не знаю, как ее воспроизвести, две вещи, которые я знаю:
- Это мое приложение — его отключение исправит сбои
- Если я отключу часть определения местоположения в своем приложении, сбои прекратятся.
В какой-то момент мне удалось получить stacktrace:
/? E/AndroidRuntime: FATAL EXCEPTION: lowpool[0]
Process: com.google.android.gms.persistent, PID: 29021
java.lang.NullPointerException: Attempt to invoke virtual method 'int java.lang.Integer.intValue()' on a null object reference
at aipa.a(:com.google.android.gms:1053)
at ailk.c(:com.google.android.gms:252)
at aill.run(:com.google.android.gms:1047)
at kmo.run(:com.google.android.gms:450)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
at kqt.run(:com.google.android.gms:17)
at java.lang.Thread.run(Thread.java:818)
Я запрашиваю обновления местоположения в отдельном процессе, используя для этого способ PendingIntent:
if (mTrackIntent == null) {
Intent trackIntent = LocationHandlerReceiver.create(getApplicationContext());
mTrackIntent = PendingIntent.getBroadcast(getApplicationContext(), REQUEST_CODE_TRACK, trackIntent, PendingIntent.FLAG_CANCEL_CURRENT);
}
PendingResult<Status> statusPendingResult = LocationServices.FusedLocationApi.flushLocations(mGoogleApiClient);
statusPendingResult.setResultCallback(result -> {
if (result.isSuccess()) {
LocationServices.FusedLocationApi.removeLocationUpdates(mGoogleApiClient, mTrackIntent);
//noinspection MissingPermission
LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, mTrackIntent);
} else {
if (BuildConfig.DEBUG) {
DebugUtils.showDebugToastOnUiThread(getApplicationContext(), "DEV: Requesting location updates.. failed: " result.getStatusMessage());
}
}
});
Эти обновления я получаю здесь довольно успешно:
public static class LocationHandlerReceiver extends BroadcastReceiver {
public static Intent create(Context context) {
Intent trackIntent = new Intent(context, LocationHandlerReceiver.class);
trackIntent.setAction(ACTION_TRACK);
return trackIntent;
}
@Override
public void onReceive(Context context, Intent intent) {
if (intent != null) {
Log.d(TAG, "Received location intent: n" IntentUtil.dumpIntent(intent));
try {
if (LocationAvailability.hasLocationAvailability(intent)) {
LocationAvailability locationAvailability = LocationAvailability.extractLocationAvailability(intent);
Crashlytics.log(Log.INFO, TAG, "Could not process location result, Location unavailable: " locationAvailability.isLocationAvailable());
} else if (LocationResult.hasResult(intent)) {
// process results
} else {
Crashlytics.logException(new Exception("Could not log location because of null Location"));
}
} catch (Throwable throwable) {
Log.e(TAG, "Could not process location result", throwable);
Crashlytics.logException(new IllegalStateException("Could not process location result", throwable));
}
}
}
Некоторый фон (app — build.gradle):
defaultConfig {
minSdkVersion 16
targetSdkVersion 25 //24
compileSdkVersion 25 //24
}
compile 'com.google.android.gms:play-services-location:9.6.1'
compile 'com.google.android.gms:play-services-analytics:9.6.1'
compile 'com.google.android.gms:play-services-maps:9.6.1'
compile 'com.google.android.gms:play-services-places:9.6.1'
compile 'com.google.android.gms:play-services-gcm:9.6.1'
Я попытался просмотреть трассировку стека и не смог найти ничего подходящего. Кто-нибудь когда-нибудь сталкивался с подобной проблемой? Есть идеи о том, как я мог бы отследить причину, возможно?
Спасибо!
Комментарии:
1. Вы пробовали использовать другие версии служб Play и все еще сталкивались с той же ошибкой
2. У меня была одна и та же ошибка, по крайней мере, в течение нескольких недель, вероятно, с 3-4 добавочными версиями служб play. Сложность воспроизведения этого делает практически невозможным исключить это.
3. Просто к вашему сведению. Проблема больше не наблюдалась с 10.x выпусков Google Play