Intereting Posts
Настроить флажок Существуют ли общие конфигурации AVD где-нибудь, которые можно загрузить / просмотреть? Создайте новый Android-проект на базе Gradle в IntelliJ IDEA Что делает Eclipse, когда говорится, что он обновляет индексы? Как изменить состояние переключателя мобильных jquery мобильных устройств из кода DDMS показывает пустой файловый проводник для онлайн-эмулятора В чем смысл этого в Eclipse: «Путь к проекту должен иметь только один сегмент». Как заменить значок гамбургера, который используется для ActionBarToggle на панели инструментов Android, с пользовательской возможностью рисования? Android: Вертикальный ListView с перекрывающимися рядами Как узнать, когда заполняется Android ListView EditText задает начало текста 10dp с левой границы Лучший способ сравнить даты в Android Как сделать андроид мм чистым? Android: Хорошо ли хранить токен аутентификации в общих предпочтениях? Android Не разрешено загружать локальный ресурс: file: /// android_asset

Как я могу добавить дополнительные разрешения для 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, который будет отлаживаться в этих условиях.