如何使模拟位置提供程序工作



我需要创建一个可以模拟位置的测试应用程序。单击按钮时,需要将文本框中提供的纬度和经度值设置为模拟位置。我正在尝试使用融合位置提供程序 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

还在设置中手动启用开发人员选项、应用程序权限和模拟位置提供程序应用。

我得到的,除了在set测试提供程序位置:

java.lang.IllegalStateException: 无法执行方法 安卓:点击 androidx.appcompat.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:390) at android.view.View.performClick(View.java:6266) at android.view.View$PerformClick.run(View.java:24730) at android.os.Handler.handleCallback(Handler.java:793) at android.os.Handler.dispatchMessage(Handler.java:98) at android.os.Looper.loop(Looper.java:173) at android.app.ActivityThread.main(ActivityThread.java:6698) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:782) 作者: java.lang.reflect.InvocationTargetException at java.lang.reflect.Method.invoke(Native Method) at androidx.appcompat.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:385) ...9 更多 原因: java.lang.IllegalArgumentException: Provider "gps" 未知在 android.os.Parcel.readException(Parcel.java:1955) at android.os.Parcel.readException(Parcel.java:1897) at android.location.ILocationManager$Stub$Proxy.setTestProviderLocation(ILocationManager.java:1340) 在 android.location.LocationManager.setTestProviderLocation(LocationManager.java:1305)

有什么方法可以解决这个问题吗?

谢谢 拉吉

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()
}

Druing 调试我可以在位置管理器列表中看到提供者 gps,例如

mLocationManager.getProvider(getBestProvider())

相关内容

最新更新