java.lang.SecurityException:来自uid 10278的com.app.debug.test不允许执行MOCK_LOCATION

时间:2018-10-24 08:04:35

标签: android android-permissions android-testing locationmanager android-app-ops

我正在尝试从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

0 个答案:

没有答案