Опасения по поводу РАЗРЕШЕНИЙ НА ФАЙЛЫ И МЕДИА на Android как разработчика
Я разрабатываю приложение, которое сохраняет данные в базе данных, я пытаюсь создать резервную копию и восстановить эту базу данных, что я могу сделать, моя проблема связана с «зловещим» всплывающим окном разрешения на API30+
Разрешить управление всеми файлами
Разрешите этому приложению доступ к изменению и удалению файлов на вашем устройстве ...
Разрешить этому приложению доступ, изменение и удаление файлов на устройстве или любых подключенных устройствах хранения? это приложение может получать доступ к файлам, не спрашивая вас.
Я не пытаюсь делать ничего из этого, мне просто нужно разрешение на резервное копирование / восстановление.
вот мой код для запроса разрешения:
private void requestStoragePermissionExport(){
if( (Build.VERSION.SDK_INT >= 30 )){
try {
Intent intent = new Intent(Manifest.permission.MANAGE_EXTERNAL_STORAGE);
intent.addCategory("android.intent.category.DEFAULT");
intent.setData(Uri.parse(String.format("package:%s",getApplicationContext().getPackageName())));
startActivityForResult(intent, 2296);
} catch (Exception e) {
Intent intent = new Intent();
intent.setAction(Settings.ACTION_MANAGE_ALL_FILES_ACCESS_PERMISSION);
startActivityForResult(intent, 2296);
}
}else{
ActivityCompat.requestPermissions(this, new String[]{
Manifest.permission.WRITE_EXTERNAL_STORAGE}, BACKUP_CODE);
}
}
есть ли лучший способ справиться с этим?
3 ответа
Google ограничивает использование широких прав доступа к файлам, таких как
MANAGE_EXTERNAL_STORAGE
. Вы можете использовать Storage Access Framework, чтобы получить ограниченный доступ к определенным файлам или каталогам.
// Request code for selecting a PDF document.
const val PICK_PDF_FILE = 2
fun openFile(pickerInitialUri: Uri) {
val intent = Intent(Intent.ACTION_OPEN_DOCUMENT).apply {
addCategory(Intent.CATEGORY_OPENABLE)
type = "application/pdf"
// Optionally, specify a URI for the file that should appear in the
// system file picker when it loads.
putExtra(DocumentsContract.EXTRA_INITIAL_URI, pickerInitialUri)
}
startActivityForResult(intent, PICK_PDF_FILE)
}
Или если вы хотите получить доступ ко всему каталогу;
fun openDirectory(pickerInitialUri: Uri) {
// Choose a directory using the system's file picker.
val intent = Intent(Intent.ACTION_OPEN_DOCUMENT_TREE).apply {
// Optionally, specify a URI for the directory that should be opened in
// the system file picker when it loads.
putExtra(DocumentsContract.EXTRA_INITIAL_URI, pickerInitialUri)
}
startActivityForResult(intent, your-request-code)
}
Существуют некоторые ограничения, к которым вы можете получить доступ. Подробнее об этом можно прочитать здесь https://developer.android.com/training/data-storage/shared/documents-files
Вы можете просто сделать резервную копию файла db в общедоступном каталоге документов.
Нет необходимости в разрешениях, которые вы упомянули.
Итак, после небольшого исследования я нашел лучшее решение для себя следующим образом:
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOCUMENTS) + File.separator + "foldername"
это не требует разрешений и работает с API ниже и выше 30