Получение геолокации во вторичном изоляторе в качестве фоновой задачи в приложении Flutter - PullRequest
2 голосов
/ 20 апреля 2019

Я хочу получить географическое расположение устройства в фоновом режиме, даже когда приложение закрыто.Flutter предоставляет Isolates вместе с AlarmManager, как способ сделать это.

Моя конечная цель, опять же, состоит в том, чтобы получить геолокацию устройства, даже когда приложение было прекращено.

Iпрошли https://medium.com/flutter-io/executing-dart-in-the-background-with-flutter-plugins-and-geofencing-2b3e40a1a124, но не поняли это полностью, так как я новичок во флаттере.Если это единственный способ, пожалуйста, помогите мне понять это.

Я использую плагины: - https://pub.dartlang.org/packages/geolocator https://pub.dartlang.org/packages/flutter_isolate

Проблема возникает, как я вижу, когдаGeolocator пытается найти местоположение после внутренней проверки плагина GoogleApiAvailability с помощью Channel.invokeMethod внутри вторичного изолята.Выдает ошибку: -

[  +81 ms] E/GooglePlayServicesUtil(11608): The Google Play services resources were not found. Check your project configuration to ensure that the resources are included.
[        ] E/MethodChannel#flutter.baseflow.com/google_api_availability/methods(11608): Failed to handle method call
[        ] E/MethodChannel#flutter.baseflow.com/google_api_availability/methods(11608): java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.content.Context.getPackageName()' on a null object reference
[        ] E/MethodChannel#flutter.baseflow.com/google_api_availability/methods(11608):     at com.google.android.gms.common.GooglePlayServicesUtilLight.isGooglePlayServicesAvailable(Unknown Source:12)
[        ] E/MethodChannel#flutter.baseflow.com/google_api_availability/methods(11608):     at com.google.android.gms.common.GoogleApiAvailabilityLight.isGooglePlayServicesAvailable(Unknown Source:5)
[        ] E/MethodChannel#flutter.baseflow.com/google_api_availability/methods(11608):     at com.google.android.gms.common.GoogleApiAvailability.isGooglePlayServicesAvailable(Unknown Source:94)

Посмотрите на: - https://github.com/BaseflowIT/flutter-geolocator/blob/b869f3221c890c2ae87b22d0384577fd902d38ca/lib/geolocator.dart#L75

, который вызывает GoogleApiAvailability по адресу: - https://github.com/BaseflowIT/flutter-google-api-availability/blob/96ffe46a7cf8d81bfa107ca83ce2aaf8a5ff4847/lib/src/google_api_availability.dart#L23

Это строкаон падает на вторичном изоляторе.

Плагин геолокации имеет дополнительную конфигурацию, в которой я могу заставить LocationManager подключаться. Это не приводит к сбою, но зависает, как только приложение завершается.Ниже показано, как это принудительно устанавливается в плагине geolocator: - https://github.com/BaseflowIT/flutter-geolocator/blob/b869f3221c890c2ae87b22d0384577fd902d38ca/lib/geolocator.dart#L64

Этот флаг можно установить перед вызовом метода getLocation.

Если это не сработает, мне нужна помощь, чтобыкак достичь своей цели.

В идеале это должно дать мне местоположение на вторичном изоляте.Мне нужно понять правильные конфигурации, необходимые для того же.

1 Ответ

0 голосов
/ 16 мая 2019

Плагин GoogleApiAvailability использует текущую активность, чтобы проверить, доступен ли API, см. Здесь: https://github.com/BaseflowIT/flutter-google-api-availability/blob/96ffe46a7cf8d81bfa107ca83ce2aaf8a5ff4847/android/src/main/java/com/baseflow/googleapiavailability/GoogleApiAvailabilityPlugin.java#L50

Я полагаю, что это неправильно, поскольку методу isGooglePlayServicesAvailable () нужен контекст, а не активность (см .: https://developers.google.com/android/reference/com/google/android/gms/common/GoogleApiAvailability).

Активность требуется только для запроса API здесь: https://github.com/BaseflowIT/flutter-google-api-availability/blob/96ffe46a7cf8d81bfa107ca83ce2aaf8a5ff4847/android/src/main/java/com/baseflow/googleapiavailability/GoogleApiAvailabilityPlugin.java#L67

Это не будет работать для изолята (или сервиса), поэтому, если активность недоступна, плагин должен вместо этого использовать контекст приложения.

...