Доступ к внешнему хранилищу в Android API 29
Я пытаюсь найти инструменты для очистки. Все больше и больше производителей запрещают рутирование устройств по какой-то «причине безопасности», запрещается НЕ запрашивать разблокировку.
После API 28 этот код приведет к ошибке:
ActivityCompat.requestPermissions(this, new String[]{
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE
}, 1); // Request permission or not, Will got same result
File rootFolder = Environment.getExternalStorageDirectory(); // That is working fine
rootFolder.listFiles(); // That will return null
Конечно, я могу использовать это:
android:requestLegacyExternalStorage="true"
Но я верю, что в будущем его убьют.
Итак, какой изящный способ управления SDCard?
Ответы
На Android 10 Environment.getExternalStorageDirectory()и Environment.getExternalStoragePublicDirectory()будет возвращать пути к хранилищу, но они не доступны для чтения или записи.
Для Android 10 вы можете продолжать использовать пути, предоставляемые Environment.getExternalStorageDirectory () и Environment.getExternalStoragePublicDirectory (), если вы добавляете
android:requestLegacyExternalStorage="true"тег приложения в файл манифеста. Во время выполнения ваше приложение может вызвать,Environment.isExternalStorageLegacy()чтобы проверить, был ли выполнен запрос.Другая (неизвестная) возможность (только для Android 10) - добавить
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />файл манифеста. Пользователь должен перейти к расширенным настройкам приложения и включить ихAdvanced settings Install unknown apps | Allow from this source. Приятно то, что пользователь может переключать права доступа. Вы можете упростить задачу для пользователя, если реализуете намерение, вSettings.ACTION_APPLICATION_DETAILS_SETTINGSкотором он может изменять настройки. Забавно то, что Environment.isExternalStorageLegacy () тоже возвращает true.При компиляции для Android 11 оба варианта не работают на устройстве Android 11. (Но они продолжают работать на устройствах Android 10). Пути Environment.getExternalStorageDirectory () и Environment.getExternalStoragePublicDirectory () являются
usable again in read mode and very often in write mode too. И это замечательно, поскольку можно просто снова перечислить содержимое каталогов, таких как Download или Pictures или DCIM / Camera, используя класс File. Но добавление<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />в файл манифеста и реализация намеренияSettings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSIONпредоставит вашему приложению доступ для чтения / записи для всех файлов, даже на съемной карте micro SD. (Наконец, вы можете снять запрет Google, не имея возможности читать / записывать вашу собственную карту micro sd на собственном устройстве Android с помощью вашего собственного приложения).Environment.isExternalStorageManager()может использоваться, чтобы проверить, включено ли разрешение. Пока вы не пытаетесь загрузить свое приложение в игровой магазин, все в порядке.