【问题标题】:How can I make the mock location provider to work如何使模拟位置提供程序工作
【发布时间】:2019-04-28 08:45:27
【问题描述】:

我需要创建一个可以模拟该位置的测试应用程序。单击按钮时,需要将文本框中提供的纬度和经度值设置为模拟位置。我正在尝试使用融合位置提供程序 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:on点击 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(Native Method) 在 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(Native Method) 在 androidx.appcompat.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:385) ... 9 更多原因:java.lang.IllegalArgumentException: Provider 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)

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

谢谢, 拉吉

【问题讨论】:

  • 你把 OnClickListener 称为什么样的小部件?
  • @raj,您是否在活动类中声明了按钮视图?表示findViewById
  • public void onTestButtonClick(View v) { Toast.makeText(getApplicationContext(),"Hello", Toast.LENGTH_SHORT).show(); //createMockLocation(); } // 这是一个按钮点击监听器,它可以工作(Toast)
  • 在调用 setTestProviderLocation 之前您是否尝试过 locationManager.setTestProviderEnabled(getBestProvider(), true);
  • locationManager.getBestProvider 也可以返回“被动”,并以IllegalArgumentException: Cannot mock the passive location provider结束。

标签: android location mock-location


【解决方案1】:

由于 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())

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-26
    • 1970-01-01
    • 2011-01-26
    • 2013-06-07
    • 2011-12-12
    相关资源
    最近更新 更多