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

时间:2019-04-28 08:45:27

标签: android location mock-location

我需要创建一个可以模拟位置的测试应用程序。单击按钮时,需要将文本框中提供的纬度和经度值设置为模拟位置。我正在尝试使用融合的位置提供程序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 at   androidx.appcompat.app.AppCompatViewInflater $ DeclaredOnClickListener.onClick(AppCompatViewInflater.java:390)   在android.view.View.performClick(View.java:6266)处   android.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.Method.invoke(本机方法)位于   androidx.appcompat.app.AppCompatViewInflater $ DeclaredOnClickListener.onClick(AppCompatViewInflater.java:385)   ... 9更多原因:java.lang.IllegalArgumentException:提供者   android.os.Parcel.readException(Parcel.java:1955)处的“ gps”未知   android.os.Parcel.readException(Parcel.java:1897)在   android.location.ILocationManager $ Stub $ Proxy.setTestProviderLocation(ILocationManager.java:1340)   在   android.location.LocationManager.setTestProviderLocation(LocationManager.java:1305)

有什么办法解决这个问题?

谢谢, 拉吉

1 个答案:

答案 0 :(得分:0)

由于 Android 10 ,我的fake location应用存在相同的问题,并且该应用崩溃了:

java.lang.IllegalArgumentException: Provider "gps" unknown

但是在较旧的Android版本上,相同的代码可以正常工作。我在6,7,8和9上进行了测试。我的临时解决方案是捕获异常(直到找到更好的方法)。该模拟仍然可以正常工作。

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

进行调试时,我可以在locationManager列表中看到提供者gps,例如

mLocationManager.getProvider(getBestProvider())