Как создать папку и сохранить все файлы, созданные моим приложением в этой папке в Android Q - PullRequest
0 голосов
/ 20 октября 2019

В моем приложении я сохраняю файлы изображений различных типов, видео, PDF и т. Д. Я создаю каталог, если он еще не существует, и сохраняю файлы, созданные моим приложением, в эту папку, чтобы пользователь моглегко найти файлы, используемые и созданные моим приложением. Но в Android 10 я не могу проверить и создать каталог во внешнем хранилище.

Я знаю, что могу добавить android:requestLegacyExternalStorage="true" в свой манифест, чтобы продолжать использовать старую функциональность, но это не постоянное решение. Кроме того, я не хочу использовать getExternalFilesDir(), так как эта папка, созданная этим методом, будет удалена, если пользователь удалит мое приложение, и я хочу, чтобы файлы, сохраненные приложением, оставались на его устройстве, чтобы эти файлы можно было использовать. снова.

Это код, который я использую в настоящее время для проверки и создания каталога моего приложения и сохранения файла "myFile" в этом каталоге.

File sd =Environment.getExternalStorageDirectory();
File directory = new File(sd.getAbsolutePath() + "/" + getResources().getString(R.string.app_name));

//create directory if not exist
if (!directory.isDirectory()) {
    directory.mkdirs();
}
File file = new File(directory, myFile);

Как мне добитьсятот же результат в Android 10? Что я точно хочу:

  1. Чтобы проверить, существует ли каталог с именем моего приложения или нет. Если этот каталог не существует, создайте его во внешнем хранилище устройства.
  2. Сохраните все файлы, созданные моим приложением, в этом каталоге.
  3. Эта папка не должна удаляться, даже если пользователь удаляет ее. приложение.
  4. Чтение файлов из этой папки.

1 Ответ

0 голосов
/ 21 октября 2019

В Android Q прямой доступ к файлам по умолчанию отключен для приложений, находящихся вне их личных папок. Вы можете использовать метод getPrimaryStorageVolume().createOpenDocumentTreeIntent() класса StorageManager, чтобы запросить доступ к основному внешнему тому. В этом случае вам нужно согласие пользователя, и вы все равно не сможете использовать File api напрямую, но при использовании класса DocumentFile у вас очень похожий интерфейс, так что это решение ближе к старому. Это работает, если вам нужно выполнить операции на переднем плане и в фоновом режиме, то есть без взаимодействия с пользователем, за исключением первого взаимодействия, запрашивающего разрешение. Я связываю библиотеку Flipper , она помогает управлять файлами, как в старых версиях Android.

...