Как записать файлы на SDCard, которые не будут удалены, если приложение будет удалено

Мне нужно иметь возможность читать и записывать данные на съемную SDCard, чтобы она не была удалена, если приложение будет удалено. Много данных!

У меня есть приложение, которое работает с более чем 50 000 файлов, 10 ГБ (в основном изображения и видео). Эти данные сначала загружаются непосредственно на SDCard с помощью SD-адаптера на ПК, а затем регулярно обновляются (небольшое количество файлов) через FTP на устройстве Android. (Есть небольшая группа пользователей в разных странах.)

Все это работает очень хорошо, если я использую getExternalFilesDirs() и Environment.isExternalStorageRemovable(file) для размещения данных на внешней SDCard. Пример пути: - /storage/1234-5678/Android/data.com.me.myapp/files/MyDataDirectory

Однако иногда пользователю необходимо удалить и переустановить приложение. В этом случае все данные уничтожаются, а восстановление занимает несколько часов, если SDCard подключена к ПК, и несколько дней, если требуется восстановление через FTP.

Я могу поместить все файлы в каталог верхнего уровня на SDCard и прочитать их. Приложение работает нормально, файлы не удаляются при удалении. Но обновление FTP завершается ошибкой с отказом в доступе при любой попытке записи на SDCard.

Приложение использует ActivityCompat.requestPermissions(activity, android.Manifest.permission.WRITE_EXTERNAL_STORAGE, 101) для получения разрешения от пользователя.

ContextCompat.checkSelfPermission(действие, разрешение.WRITE_EXTERNAL_STORAGE) возвращает PackageManager.PERMISSION_GRANTED после того, как это было сделано.

Я был бы очень рад записать свои данные в подкаталог общедоступного каталога, например ... File externalPublicDir = Environment.getExternalStoragePublicDirectory( Environment.DIRECTORY_PICTURES);

Однако: - Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES) всегда возвращает путь к внутреннему хранилищу. Не съемная SDCard. Мои данные слишком велики, чтобы это было приемлемо.

Все это отлично работало вплоть до KitKat, используя каталог верхнего уровня на SDCard, но прогрессивные меры безопасности заблокировали простые решения. Теперь я использую Nougat на всех устройствах, на которых запущено приложение.

Камера устройства, кажется, помещает фотографии в общедоступный каталог на SDCard, чтобы это можно было сделать.

Я создал решение с использованием Storage Access Framework, но оно очень-очень медленное.

Может ли кто-нибудь предложить способ записи в общий каталог на SDCard с использованием файловой системы?

Спасибо.


person David Burden    schedule 04.02.2019    source источник
comment
Камера устройства, похоже, помещает фотографии в общедоступный каталог на SDCard, чтобы это можно было сделать — камера устройства представляет собой предустановленное приложение. Производители устройств и разработчики пользовательских ПЗУ могут предоставлять предустановленным приложениям права, которых нет у обычных приложений. Я создал решение с использованием Storage Access Framework, но оно очень и очень медленное — тогда, возможно, задайте отдельный вопрос о переполнении стека с минимальным воспроизводимый пример, показывающий вашу реализацию вместе с подробностями вашего анализа производительности (отслеживание методов и т. д.), и попросите помощи в повышении ее производительности.   -  person CommonsWare    schedule 04.02.2019
comment
Примечание. Это не дубликат stackoverflow keep-files-after-uninstallation-of -android-app, потому что принятый ответ больше недействителен из-за того, что устарел в андроид-q . Надеюсь, блог Commonsware поможет нам в этом. назначить свидание   -  person k3b    schedule 17.07.2019