Как смоделировать местоположения без GPS_PROVIDER и оставить включенным слушатель измерений GNSS в Android - PullRequest
0 голосов
/ 25 января 2019

Я написал приложение, которое может получать необработанные данные измерений GNSS, используя

LocationManager.registerGnssMeasurementsCallback(...)

Приложение может обрабатывать эти данные и вычислять новые позиции.Теперь я хотел бы смоделировать эти рассчитанные позиции в ОС Android, чтобы другие приложения могли работать с этой позицией. Чтобы понять это, я могу дать разрешения на имитацию местоположения приложения, добавить его в список приложений для определения местоположения в параметрах разработчика.и работать с такими методами, как

LocationManager.addTestProvider(...)
LocationManager.setTestProviderEnabled(...)
LocationManager.setTestProvderLocation(...)

Во-первых, мне нужно решить, какого поставщика местоположения я хочу смоделировать.PASSIVE_PROVIDER не допускается для насмешек.NETWORK_PROVIDER может быть поддельным, но пользователь должен будет выбрать этот метод определения местоположения в настройках системы.Если он делает это, система прекращает отправку обратных вызовов измерений GNSS любому приложению, которое зарегистрировало эти обратные вызовы, поэтому никакая позиция больше не может быть рассчитана.В этом случае вызывается обратный вызов с изменением состояния «слушатель измерений GNSS отключен».То же самое происходит, когда я пытаюсь смоделировать GPS_PROVIDER (как только вызывается setTestProviderEnabled ()).Поэтому я подумал о том, чтобы издеваться над проваленным провайдером локаций.Так как мой компоновщик Android Studio не может разрешить LocationManager.FUSED_PROVIDER (не знаю почему), я напрямую использовал String "fused" и пытался смоделировать местоположения.Не возникает никаких исключений, и все еще можно получить необработанные измерения gnss.Тем не менее, в GoogleMaps я вижу только родные места, предоставляемые внутренним чипом.Это происходит независимо от того, выбран ли в системе метод определения местоположения «Только GPS» или «Наилучший».

Итак, как я могу решить эту проблему?Можно ли каким-то образом смоделировать GPS_PROVIDER, не прерывая необработанные измерения gnss и не предотвращая применение местоположения чипа gnss к слитному провайдеру, пока я его высмеиваю?

Кстати, мой код выглядит так:

locationManager.addTestProvider("fused" , false, false, false, false, false, false, false, Criteria.POWER_LOW, Criteria.ACCURACY_FINE);
locationManager.setTestProviderEnabled("fused", true);
Location location = new Location("fused");
location.setLatitude(lat);
location.setLongitude(lon);
location.setAltitude(alt);
location.setAccuracy(1.0f);
location.setTime(System.currentTimeMillis());
location.setElapsedRealtimeNanos(System.nanoTime());
locationManager.setTestProviderLocation("fused", location);
...