Достаточно ли объявить <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
или мне также нужно объявить <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
? Javadocs опускает эту важную информацию.
Должен ли я объявлять как WRITE_EXTERNAL_STORAGE, так и READ_EXTERNAL_STORAGE?
Ответ 1
READ_EXTERNAL_STORAGE
существует только с желе Bean (уровень 16). Согласно документам, все приложения от Jelly Bean имеют это разрешение даже без объявления:
Обеспечивает защищенный доступ для чтения к внешнему хранилищу. В Android 4.1 по умолчанию все приложения по-прежнему имеют доступ на чтение. Это будет изменено в будущем выпуске, чтобы требовать, чтобы приложения явно запрашивали доступ для чтения с использованием этого разрешения. Если ваше приложение уже запрашивает доступ на запись, он автоматически получит доступ для чтения. Существует новая опция разработчика, чтобы включить ограничение доступа к чтению, для разработчиков, чтобы протестировать свои приложения против того, как Android будет вести себя в будущем.
Итак, вы должны объявить об этом для будущей совместимости, но это может быть не источником вашей проблемы, если вы не используете телефон Jelly Bean и установите опцию разработчика "Защитить USB-накопитель".
Ответ 2
Лучше быть явным и объявлять обе разрешения, но объявление только android.permission.WRITE_EXTERNAL_STORAGE
автоматически добавит android.permission.READ_EXTERNAL_STORAGE
к вашему APK во время сборки.
Вы можете использовать команду aapt dump badging
в APK, чтобы увидеть, что Android считает использование разрешения на запись подразумевающим, что вы также хотите получить разрешение на чтение.
Вот какой вывод от aapt для APK моего, где я объявил только WRITE_EXTERNAL_STORAGE
в моем манифесте:
uses-permission:'android.permission.WRITE_EXTERNAL_STORAGE'
uses-permission:'android.permission.READ_EXTERNAL_STORAGE'
uses-implied-permission:'android.permission.READ_EXTERNAL_STORAGE',
'requested WRITE_EXTERNAL_STORAGE'