我正在尝试从Android工具测试中的GPX文件中模拟一系列位置,以进行位置跟踪Service
,该跟踪监听FusedLocationProviderClient
的位置变化。
我遇到的问题是,在LocationManager
上调用addTestProvider()时,该方法将抛出SecurityException
,因为显然测试应用程序没有MOCK_LOCATION
权限。
val locationManager = context.getSystemService(Context.LOCATION_SERVICE) as LocationManager
locationManager.addTestProvider(TEST_PROVIDER, false, false, false, false, false, false, false, POWER_MEDIUM, ACCURACY_FINE) // SecurityException
我已经尝试通过ADB设置权限:
adb shell appops set com.app.debug.test android:mock_location allow
还要检查是否已正确设置:
adb shell appops get com.app.debug.test android:mock_location
MOCK_LOCATION: allow
通过ADB设置权限后,在“设置”->“开发人员选项”->“选择模拟位置应用”中,将显示测试应用程序包名称。因此,该权限似乎是系统允许的,但是由于SecurityException
,测试仍然崩溃。我不知道为什么和什么原因。我已经在Android 9.0的Pixel 2上进行了测试。
LE::在测试应用中检查 AppOpsManager 会显示未授予权限:
val opsManager = context.getSystemService(Context.APP_OPS_SERVICE) as AppOpsManager
val mockLocationAllowed = opsManager.checkOpNoThrow(
AppOpsManager.OPSTR_MOCK_LOCATION,
android.os.Process.myUid(),
context.packageName)
if (mockLocationAllowed == MODE_ERRORED)
Log.e(TAG, "Permission not granted")
LE:有趣的是,当检查调试版本中是否允许该权限时,按照上述相同的步骤操作后,AppOpsManager
会显示该权限已被授予。因此它适用于 debug ,但不适用于 debugAndroidTest 。