Сбой служб воспроизведения из-за запутанной трассировки

#android #location #google-play-services #android-pendingintent

#Android #Расположение #google-play-services #android-pendingintent

Вопрос:

В настоящее время я расследую сложную проблему, с которой я сталкиваюсь в своем приложении. Похоже, что мое приложение (сильно зависящее от местоположения, но также использующее Google Analytics и службу задач GCM) вызывает сбой служб Google Play. (Иногда всплывающее окно появляется довольно часто, но затем снова исчезает на часы — дни).

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

  1. Это мое приложение — его отключение исправит сбои
  2. Если я отключу часть определения местоположения в своем приложении, сбои прекратятся.

В какой-то момент мне удалось получить 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