Я пытаюсь смоделировать серию местоположений из файла GPX в тесте инструментов Android для отслеживания местоположения Service
, который прослушивает изменения местоположения с FusedLocationProviderClient
.
Проблема в том, чтоЯ сталкивался с тем, что при вызове addTestProvider () для LocationManager
, метод выдает 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
.Я понятия не имею, почему и что может быть причиной этого.Я провел тест на Pixel 2, Android 9.0.
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 .