Зачем мне нужно разрешение на запись во внешнем хранилище для удаления файла? - PullRequest
0 голосов
/ 21 сентября 2019

У меня вопрос, почему мне нужно это разрешение, когда я пытаюсь удалить файл с SD-карты, так как в разрешениях написано «Запись», он ничего не записывает на SD-карту, когда я пытаюсь что-то удалить, так почему этотребуется?

Я пытался удалить разрешение, но без него ничего не работает.

WRITE_EXTERNAL_STORAGE - это опасное разрешение, которое мне нужно включить в мою политику конфиденциальности , и яне знаю, как это объяснить.

Мои разрешения

 <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

Мой код для удаления файла

if (getActivity() != null) {
                        try {
                            treeUri = storageUtil.loadTreeUri();
                            if (!treeUri.equals("")) {
                                deleteFile(Uri.parse(treeUri), file);
                                Main.songs.deleteFile(getActivity(), songList.get(position).getData());
                                Main.songs.reScan(getActivity());
                                songList = Main.songs.getSongs();
                                //Send broadcast to update adapters
                                Intent intent = new Intent(Constants.ACTIONS.BROADCAST_UPDATE_ADAPTER2);
                                getActivity().sendBroadcast(intent);

                                if (!songList.isEmpty()) {
                                    allSongsAdapter.updateList(songList);
                                }

                            } else if (treeUri.equals("")) {
                                ((MainActivity) getActivity()).getSDCardAccess();
                                Toast.makeText(getActivity(), "First select directory with music files and try again.", Toast.LENGTH_LONG).show();
                            }
                        } catch (Exception e) {
                            Toast.makeText(getActivity(), "Something went wrong!", Toast.LENGTH_SHORT).show();
                        }
                        dialog.dismiss();
}

метод deleteFile

private void deleteFile(Uri uri, File file){
    if (getActivity() != null){
        Intent intent = new Intent(Constants.ACTIONS.BROADCAST_UPDATE_PANEL_STATE);
        LocalBroadcastManager.getInstance(getActivity()).sendBroadcast(intent);

    }
    if (file.delete()){
        Log.i(TAG,"internal delete!");
        return;
    }
    if (getActivity() != null && file.exists()) {
        DocumentFile pickedDir = DocumentFile.fromTreeUri(getActivity(), uri);
        String filename = file.getName();
        try {
            getActivity().getContentResolver().takePersistableUriPermission(uri, Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
        } catch (SecurityException e) {
            Log.e(TAG, "SecurityException caught when deleting FilePath!", e);
        }
        Log.d(TAG, "fileName: " + filename);
        if (pickedDir != null) {
            DocumentFile documentFile = pickedDir.findFile(filename);
            if (documentFile != null && documentFile.exists()) {
                if (documentFile.delete()) {
                    Log.i(TAG, "Delete successful");
                } else {
                    Log.i(TAG, "Delete unsuccessful");
                }
            }
        }
    }
}

Это код, который я использовал из другого поста здесь

Android SAF (Storage Access FrameWork): Получить конкретный файл Uri из TreeUri

Ответы [ 3 ]

1 голос
/ 21 сентября 2019

Существует два типа разрешений.1. Для чтения содержимого (доступ только для чтения) 2. Для изменения содержимого (доступ для чтения и записи)

Доступ к записи / разрешение - это изменение содержимого на диске.

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

Удаление файла в любой ОС - это модификация ссылки на таблицу основного файла, которая сообщает ОС, где файл был расположен.

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

Удаление файла аналогично выдаче rm через командную строку в Unix.Это отсоединяет файл (модифицирующий диск), который требует разрешения на запись.

https://unix.stackexchange.com/a/10884

...