Android Q удаление файлов Операции с файлами

RecoverableSecurityException вызывает сбой при удалении файла.

В Android Q используйте MediaStore getContentResolver (). Query (), чтобы получить курсор, затем используйте цикл while, чтобы получить photoUri, используйте cursor.moveToNext (), чтобы объединить добавление photoUri в Arraylist. код пути к файлу, например:

 Uri photoUri = Uri.withAppendedPath(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,mCursor.getString(mCursor.getColumnIndex(MediaStore.Images.Media._ID)));

затем используйте:

 mContext.getContentResolver().delete(photoUri, null, null);

всегда выполнять RecoverableSecurityException. Я знаю, что есть способ открыть диалоговое окно для удаления, как это.

 ((Activity)mContext).startIntentSenderForResult(e1.getUserAction().getActionIntent().getIntentSender(), 100, null, 0, 0, 0); 

есть способ удалить файл, перескочив через Exception. или другой способ удалить файл. путь к файлу хранится во внешнем хранилище, например: pictures / abc.jpg


person Pang-yao Liu    schedule 29.08.2019    source источник
comment
Вы нашли решение этого вопроса? У меня такое же исключение. Но, к сожалению, я не нашел решения.   -  person K.tas    schedule 07.02.2020
comment
не перемещайте файл в папку приложения, если приложение создает хранилище файлов в папке, не сталкиваясь с этой проблемой   -  person Pang-yao Liu    schedule 10.02.2020
comment
Я решил эту проблему, запросив разрешение. Спасибо.   -  person K.tas    schedule 10.02.2020


Ответы (1)


Вы должны получить разрешение на доступ к хранилищу в Android Q.

Я решил, используя этот запрос на разрешение:

if (DEVICE_VERSION >= 29) {
        //NOTE: This method and its functions compatible with API Level 24 and above but I am using for only 29 and above
        List<UriPermission> permissions = MainActivity.this.getContentResolver().getPersistedUriPermissions();
        if (permissions.isEmpty()) {
            StorageManager manager = getSystemService(StorageManager.class);
            StorageVolume primaryStorageVolume = manager.getPrimaryStorageVolume();
            //For open the permission allowing page
            startActivityForResult(primaryStorageVolume.createOpenDocumentTreeIntent(), STORAGE_PERMISSION_REQ_CODE);
        } else {
            for (UriPermission up : permissions) {
                String permissionUri = up.getUri().toString();
                if (permissionUri.contains("DCIM") || permissionUri.endsWith("%3A") || permissionUri.endsWith("A")) {
                    requestExternalStoragePermission(); //I also used this method for reading and writing of external storage.
                    return;
                }
            }
        }
}

Затем в методе onActivityResult () вы должны проверить STORAGE_PERMISSION_REQ_CODE и установить его с помощью takePersistableUriPermission ():

@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (resultCode == Activity.RESULT_OK && requestCode == STORAGE_PERMISSION_REQ_CODE) {
        final int takeFlags = data.getFlags() & (Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
        MainActivity.this.getContentResolver().takePersistableUriPermission(data.getData(), takeFlags);
    }
} 

В моем случае это сработало.

person K.tas    schedule 10.02.2020