Intereting Posts
Цвет фона Android ImageButton Детектор жестов не работает Я хочу показать пользовательский диалог, как iphone HUD Progress Bar Возможно ли получить данные из форм HTML в андроид при использовании webView? Резервное копирование Android-устройства с использованием adb Как я могу наложить CordovaWebView PhoneGap поверх собственного вида на Android? Программно повторно запускать / воссоздавать деятельность? Android studio 2.0 logcat spammed by deconnection Почему я не должен использовать значки меню, предоставляемые ОС? Android – обнаружение Bluetooth не находит никакого устройства Как мы можем получить токен устройства для Android для push-уведомления? Можно ли получить доступ к текущему фрагменту, просматриваемому ViewPager? Android Studio, Locat отображает бесконечное «I / art: Enter while loop». Даже при запуске Empty Activity Android: относительная компоновка Две кнопки занимают все доступные горизонтальные пространства Как установить максимальную высоту макета в android?

Как я могу добавить дополнительные разрешения для Android для моего тестового проекта UI?

Я пытаюсь записать файлы на внешнюю SD-карту в тестовом случае, полученном от InstrumentationTestCase2 для целей чистого тестирования. Это хорошо работает, когда android.permission.WRITE_EXTERNAL_STORAGE настроен в файле AndroidManifest.xml тестируемого приложения, но не работает, если этот параметр присутствует только в файле AndroidManifest.xml тестового проекта.

Естественно, я не хочу добавлять это разрешение в основной манифест, так как мне нужна эта возможность только во время моих функциональных тестов. Как я могу это достичь?

Solutions Collecting From Web of "Как я могу добавить дополнительные разрешения для Android для моего тестового проекта UI?"

Короче говоря, вы должны добавить тот же android:sharedUserId для манифеста манифеста приложения и тестового проекта и объявить необходимое разрешение для тестового проекта.

Это обходное решение исходит из того факта, что Android фактически назначает разрешения для учетных записей linux (uids), но не для самих приложений (по умолчанию каждое приложение получает свой собственный uid, поэтому похоже, что разрешения назначаются для приложения).

Однако заявки, подписанные с одним и тем же сертификатом, могут иметь один и тот же uid. Как следствие, у них есть общий набор разрешений. Например, у меня может быть приложение A, которое запрашивает разрешение WRITE_EXTERNAL_STORAGE и приложение B, которое запрашивает разрешение INTERNET. Оба A и B подписываются одним и тем же сертификатом (скажем, отлаживаем один). В файлах AndroidManifest.xml для A and B android:sharedUserId="test.shared.id" объявлен в <manifest> . Затем оба A и B могут получить доступ к сети и записать на SD-карту, даже если они объявляют только часть необходимых разрешений, потому что разрешения назначаются за uid. Конечно, это работает только в том случае, если фактически установлены A и B.

Вот пример того, как настроить в случае тестового проекта. AndroidManifest.xml для приложения:

 <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.testproject" android:versionCode="1" android:versionName="1.0" android:sharedUserId="com.example.testproject.uid"> <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="16" /> <application android:icon="@drawable/ic_launcher" android:label="@string/app_name"> <activity android:name="com.example.testproject.MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest> 

И AndroidManifest.xml для тестового проекта

 <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.testproject.test" android:sharedUserId="com.example.testproject.uid" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="8" /> <instrumentation android:name="android.test.InstrumentationTestRunner" android:targetPackage="com.example.testproject" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <application android:icon="@drawable/ic_launcher" android:label="@string/app_name" > <uses-library android:name="android.test.runner" /> </application> </manifest> 

Недостатком этого решения является то, что приложение также может записывать на внешнее хранилище, когда установлен тестовый пакет. Если он случайно что-то пишет в хранилище, он может остаться незамеченным до выпуска, когда пакет будет подписан другим ключом.

Некоторую дополнительную информацию об общих UID можно найти по адресу http://developer.android.com/guide/topics/security/permissions.html#userid .

Есть еще один простой ответ.

Установите разрешение src / debug / AndroidManifest.xml (если его не существует, создайте его)

По умолчанию AndroidTest использует debug как BuildType. Почему вы определяете эти разрешения там в debug buildType. Спасибо. Процесс объединения, который добавит эти разрешения в вашу тестовую сборку. Вот манифест с новыми разрешениями (обратите внимание, что я не включил атрибут пакета, потому что он будет унаследован от манифеста уровня более низкого уровня)

 <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools"> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> </manifest> 

Сделайте это программно, как режим Debug сгенерированного класса Debug, который будет отлаживаться в этих условиях.