Опасения по поводу РАЗРЕШЕНИЙ НА ФАЙЛЫ И МЕДИА на 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

Другие вопросы по тегам