Как я могу заставить провайдера фиктивного местоположения работать

У меня есть необходимость создать тестовое приложение, которое может смоделировать местоположение. При нажатии кнопки значения широты и долготы, представленные в текстовом поле, должны быть установлены в качестве фиктивного местоположения. Я пытаюсь построить это, используя простой способ, используя API-интерфейсы провайдера

Location mockLocation = new Location("flp");
mockLocation.setLatitude(12);
mockLocation.setLongitude(82);
mockLocation.setAccuracy(1.0f);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
    mockLocation.setElapsedRealtimeNanos(SystemClock.elapsedRealtimeNanos());
}
mockLocation.setTime(new Date().getTime());


Criteria criteria = new Criteria();
criteria.setAccuracy( Criteria.ACCURACY_FINE );
String provider = locationManager.getBestProvider( criteria, true );

if ( provider == null ) {
   Log.e( "", "No location provider found!" );
   return;
}

// provider and LocationManager.GPS_PROVIDER are same - "gps"

locationManager.setTestProviderLocation(LocationManager.GPS_PROVIDER, mockLocation); // --> I am getting exception here

Я дал все возможные разрешения в файле манифеста:

ACCESS_COARSE_LOCATION
ACCESS_FINE_LOCATION
ALLOW_MOCK_LOCATIONS
ACCESS_MOCK_LOCATION

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

Я получаю, кроме как на setTestProviderLocation:

java.lang.IllegalStateException: Не удалось выполнить метод для android: onClick в androidx.appcompat.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:390) в android.view.View.performClick(View.java:66).view.View$PerformClick.run(View.java:24730) на android.os.Handler.handleCallback(Handler.java:793) на android.os.Handler.dispatchMessage(Handler.java:98) на android.os.Looper.loop(Looper.java:173) на android.app.ActivityThread.main(ActivityThread.java:6698) на java.lang.reflect.Method.invoke(собственный метод) на com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240) в com.android.internal.os.ZygoteInit.main(ZygoteInit.java:782) Вызывается: java.lang.reflect.InvocationTargetException в java.lang.reflect.Methodin Собственный метод) в androidx.appcompat.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:385) ... еще 9 Причины: java.lang.IllegalArgumentException: поставщик "gps" неизвестен в ndroid.os.Parcel.readException(Parcel.java:1955) на android.os.Parcel.readException(Parcel.java:1897) на android.location.ILocationManager$Stub$Proxy.setTestProviderLocation(ILocationManager.java:1340) на андроиде.location.LocationManager.setTestProviderLocation(LocationManager.java:1305)

Есть ли способ это исправить?

Спасибо, Радж

0 ответов

Начиная с Android 10, у моего приложения с фальшивым местоположением такая же проблема, и приложение вылетает из-за:

java.lang.IllegalArgumentException: Provider "gps" unknown

Но на более старых версиях Android работает тот же код. Я тестировал его на 6,7,8 и 9. Мое временное решение - перехватить исключение (пока я не найду лучший способ). Макет должен работать.

try {
   mLocationManager.removeTestProvider(getBestProvider());
} catch (IllegalArgumentException e) {
   // handle the error e.getMessage()
}

Во время отладки я вижу gps провайдера внутри списка locationManager, например

mLocationManager.getProvider(getBestProvider())
Другие вопросы по тегам