Проблема с доступом к скрытому методу. Android, Flutter, Geolocator - PullRequest
0 голосов
/ 09 июля 2020

Я беру этот курс Flutter / Dart на Udemy, и в начале нового проекта я застрял, пытаясь использовать Geolocater Package . Первоначальный проект github для этого расположен здесь .

Первым шагом в курсе является импорт пакета Geolocator, добавление его в pubspe c .yml, а затем в _LoadingScreenState в screen / loading_screen.dart файл, вы должны добавить функцию:

void getLocation() async {
  Position position = await Geolocator()
      .getCurrentPosition(desiredAccuracy: LocationAccuracy.low);
  print(position);
}

И, наконец, вы просто добавляете getLocation (); к onPressed на той же странице. В руководстве это работает нормально, так как они используют API 26 и версию 3.0.1 Geolocator. Однако я использую API 29 или 30 (ни один из них не работает) и получаю следующую ошибку:

W / ppbrewery.clim (25370): доступ к скрытому методу Landroid / content / Context; -> getFeatureId () Ljava / lang / String; (серый список, отражение, разрешено)

Я немного изучил проблему и, похоже, делает это, потому что я использую API 30. Однако я понятия не имею, что с этим делать или как заставить его распечатать мое местоположение.

См. некоторую документацию:

https://developer.android.com/distribute/best-practices/develop/restrictions-non-sdk-interfaces

Внизу написано: Как я могу разрешить доступ к не-SDK интерфейсам?

Но в настройках оболочки adb поставить глобальную команду hidden_api_policy 1 ничего не делает для меня. Это могло быть потому, что я использую API 30, но я просто не знаю. Кроме того, похоже, что он ничего не делает с API 29.

Кроме того, вышеупомянутое решение, похоже, направлено только на исправление его на устройстве / эмуляторе разработчика, если я не понимаю его. Как исправить как для эмулятора, так и в будущем для фактического развертывания?

Ответы [ 3 ]

1 голос
/ 13 июля 2020

Попробуйте это.

Geolocator geolocator = Geolocator()..forceAndroidLocationManager = true;
Position position = await Geolocator().getCurrentPosition(desiredAccuracy: LocationAccuracy.low);

вы можете открыть этот параметр, нажав на три точки в конце эмулятора

И не забудьте указать местоположение на эмуляторе, как это, и указать местоположение.

введите описание изображения здесь

0 голосов
/ 21 августа 2020

Получить экземпляр Geolocator, заставляющий Android Location Manager, и после этого вызвать getCurrentPosition. Таким образом, вы можете использовать плагин LocationManager вместо плагина FusedLocationProviderClient по умолчанию для получения позиции.

Geolocator geolocator = Geolocator()..forceAndroidLocationManager = true;
Position position = await geolocator.getCurrentPosition( desiredAccuracy: LocationAccuracy.low);
0 голосов
/ 10 августа 2020

У меня была такая же проблема в эмуляторе android. В настройках местоположения эмулятора вы должны указать местоположение, затем открыть карты Google в эмуляторе и найти себя. После этого перезапустите приложение, и все будет в порядке.

...