- Русские Блоги
- Вопрос разрешения записи на внешнюю SD-карту Android
- Затронуто приложение подписи платформы
- DocumentFile адаптационное решение
- 1. Запросить разрешение на запись на внешнюю SD-карту
- 2. Пакет операций с файлами DocumentFile
- Android runtime permissions. Почему, зачем и как
- Общая информация
- Взаимодействие с пользователем
Русские Блоги
Вопрос разрешения записи на внешнюю SD-карту Android
После недавнего обновления до Android 9.0 я обнаружил, что файловому менеджеру не удалось записать данные на внешнюю SD-карту. File.canWrite() Метод, найденный для возврата false , Обсудив отслеживание и позиционирование, я обнаружил, что это было связано с GoogleизменениеВызванный:
Изменения здесь были удалены WRITE_MEDIA_STORAGE Разрешения, связанные с разрешениями, привели к тому, что внешнее хранилище на SD-карте недоступно для записи.
Затронуто приложение подписи платформы
Эта модификация больше влияет на системные приложения. Для платформ до 9.0 я применил WRITE_MEDIA_STORAGE После разрешения платформы приложение, подписанное платформой, может быть передано java.io.File Интерфейс записан на внешнюю SD-карту. Но после этой модификации, если вы хотите записать на внешнюю SD-карту, вам нужно использовать ее как стороннее приложение. DocumentFile Интерфейс, вы можете прочитать документацию APIСтруктура доступа к хранилищу с участием Использовать доступ к каталогу 。
Порекомендуйте это из Googlebug Приложения платформы, такие как файловый менеджер, камера, галерея и даже MediaProvider, будут иметь внешнюю SD-карту, которую можно только читать и не записывать, то есть проблема сбоя записи, поскольку эти системные приложения не адаптированы. DocumentProvider Способ написания.
DocumentFile адаптационное решение
1. Запросить разрешение на запись на внешнюю SD-карту
Еще в Android 4.4 Android присоединился к структуре доступа к хранилищу. Доступ к внешней SD-карте поддерживается DocumentsUI (com.android.documentsui). После улучшения версии 5.0 и 7.0 в настоящее время существует два вида запросов на внешнюю SD Интерактивный метод разрешения на запись карты:
- До Android 7.0 используйте ACTION_OPEN_DOCUMENT_TREE, чтобы перейти к интерфейсу выбора хранилища DocumentsUI, а затем пользователь вручную открыл внешнее хранилище и выбрал
- Android 7.0 и выше, используйтеStorageVolume.createAccessIntent(null) Перейти к окну приглашения на написание разрешения. (Это окно приглашения также предоставляется DocumentsUI, но оно улучшило предыдущее взаимодействие, чтобы избежать громоздких пользовательских операций)
Проверьте свойства интерфейса разрешений, вы увидите, что окно запроса разрешений на самом деле com.android.documentsui/com.android.documentsui.ScopedAccessActivity
Другими словами, DocumentsUI специально сделал окно запроса разрешения, чтобы упростить процесс запроса разрешения.
ПокаStorageVolume.createAccessIntent(String directoryName) Может передаваться во многих типах медиа, включая музыку, изображения, фильмы, документы и т. Д., Если входящий параметр null , Это означает весь внешний раздел хранения.
Parameters | |
---|---|
directoryName | String : must be one of Environment.DIRECTORY_MUSIC , Environment.DIRECTORY_PODCASTS , Environment.DIRECTORY_RINGTONES , Environment.DIRECTORY_ALARMS , Environment.DIRECTORY_NOTIFICATIONS , Environment.DIRECTORY_PICTURES , Environment.DIRECTORY_MOVIES , Environment.DIRECTORY_DOWNLOADS , Environment.DIRECTORY_DCIM , or Environment.DIRECTORY_DOCUMENTS , or null to request access to the entire volume. |
Returns | |
---|---|
Intent | intent to request access, or null if the requested directory is invalid for that volume. |
Запрос на разрешение и обработка
Запрос разрешения должен быть инициирован в Деятельности или Фрагменте, и в то же время onActivityResult Захвачено в Uri ,Вот этот Uri Это может быть сохранено в локальном хранилище для легкого вызова. Запрошенный код инкапсулируется следующим образом:
Вот rootPath Корневой каталог внешней SD-карты, переданный в контексте, такой как /storage/0000-0000 Такой путь можно пройти context.getExternalFilesDirs(«external») Метод. DocumentsUtils Ниже приведен метод реализации класса инструмента.
среди них DocumentsUtils.checkWritableRootPath() Этот метод используется для проверки, есть ли у корневого каталога SD-карты разрешение на запись, если нет, перейдите к запросу на разрешение; DocumentsUtils.saveTreeUri() Способ сохранить возвращенный Uri Информация хранится локально для последующего запроса.
2. Пакет операций с файлами DocumentFile
Поскольку предыдущее приложение использовалось java.io.File Интерфейс работает с внешними файлами SD-карты, и ожидается минимальное количество изменений кода, тогда наилучшим способом является File Сделайте упаковку снова.
До Android 9.0 системные приложения могут передаваться по умолчанию java.io.File Интерфейс записывается на внешнюю SD-карту, но если это стороннее приложение открытого рынка, оно не может быть записано после 4.4, и некоторые производители настраивают версию Android 9.0. Внешнюю SD-карту также можно записывать напрямую без интерфейса DocumentFile, интерфейса DocumentFile ни java.io.File эффективный.
Поэтому лучше всего сначала проверить, есть ли разрешение на запись в файл, если есть разрешение на запись, напрямую использовать операцию интерфейса «Файл», если нет разрешения, а затем проверить, находится ли файл на внешней SD-карте, если файл находится на SD-карте, используйте операцию интерфейса DocumentFile. ,
Упакованные инструменты DocumentsUtils Описание метода,Не совместимы Указывает, что операция DocumentFile не инкапсулирована:
Источник
Android runtime permissions. Почему, зачем и как
Часто при установке приложения на Android нам приходилось видеть, что оно запрашивает какое-то немыслимое количество разрешений. Например:
Хорошо, если вы устанавливаете приложение от какого-то известного разработчика, которому можете доверять. Но весьма подозрительно, если вы устанавливаете новый музыкальный плеер, а ему для работы требуется, например, получать ваше местоположение. Или, тем более, фонарик, требующий доступ к смс и звонкам.
Некоторые разработчики, чтобы уменьшить недоверие, добавляют в описание приложения на Google Play информацию о том, зачем нужно то или иное разрешение.
К шестой версии Android ситуация поменялась. Теперь разрешения нужно запрашивать в процессе работы. О том, как этой новой возможностью пользоваться и ее некоторых подводных камнях будет рассказано далее.
Общая информация
Подобно тому, как это происходит в iOS, при запросе появится системный диалог с запросом разрешения.
|
Отличие в том, что после нажатия на кнопку “Deny” разрешение не будет полностью запрещено для приложения, как это происходит у Apple. Его можно будет запросить повторно, но в этом случае появится опция “Never ask again”, после выбора которой “Deny” работает как “Don’t allow” в iOS.
Разрешения делятся на два типа (есть и другие, но они нас не интересуют):
- обычные (normal);
- опасные (dangerous).
Обычные разрешения будут получены приложением при установке, никакого подтверждения от пользователя не потребуется (немного спорный момент, на мой взгляд, стоило бы уведомлять пользователя об обязательных разрешениях). В дальнейшем отозвать их у приложения будет невозможно. Опасные же должны быть запрошены в процессе работы приложения и в любой момент могут быть отозваны. Список опасных и не очень разрешений можно посмотреть тут.
Можно увидеть, что доступ к интернету не считается опасным. Все, кто использует рекламу в своих программах, могут вздохнуть с облегчением: отключить её, просто отобрав разрешение, не получится (все еще можно просто отключить интернет, но факт остается фактом).
Для того чтобы отозвать разрешение, которое было выдано ранее (или предоставить его, если вы выбрали “Never ask again”) нужно перейти в настройки приложения (Settings->Apps->*AppName*) в раздел Permissions и кликнуть по соответствующим переключателям. В этом меню также можно посмотреть все разрешения этой программы, выбрав пункт “All permissions” из контекстного меню. Еще есть возможность просматривать, каким приложениям выдано конкретное разрешение (и соответственно предоставить или отобрать его). Для этого в настройках в разделе Apps нужно кликнуть по меню с иконкой шестеренки и в открывшемся разделе выбрать App permissions. Далее, выбрав нужное разрешение, можно увидеть все приложения, которым оно нужно.
Второй момент заключается в том, насколько ясно будет человеку, для чего нужно это разрешение. Зачем приложению для смс доступ к календарю? Наверное, для какой-то классной функции, которая облегчит перенос дат из сообщений в календарь и тому подобное. Но знаете об этом только вы, поэтому сначала нужно объяснить причину запроса и показать какие возможности даст доступ к этому разрешению. Это относится и к первичным и к вторичным разрешениям.
|
Еще раз кратко:
- важные разрешения запрашиваем при запуске, вторичные — при первом использовании соответствующей функции;
- если понять, зачем нужно разрешение тяжело, предоставляем объяснение.
В случае, когда вам все-таки отказали, пояснение причины в следующий раз является обязательным. А если помимо отказа, пользователь попросил вас никогда не запрашивать данное разрешение, используя опцию “Never ask again”, но пытается использовать соответствующую функцию приложения, предложите ему перейти в настройки вашей программы и вручную включить необходимые разрешения. Это особенно важно, если разрешение критично для работы программы.