为什么我需要具有写权限的外部存储才能删除文件?

时间:2019-09-21 14:00:00

标签: java android android-permissions documentfile

我的问题是,为什么我要从sdcard删除文件时需要此权限,因为权限说“写”,所以当我尝试删除某些内容时不会向sdcard写入任何内容,这是为什么?需要吗?

我尝试删除该许可,但没有许可,则无济于事。

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): Get particular file Uri from TreeUri

3 个答案:

答案 0 :(得分:1)

有两种类型的权限。 1.阅读内容(只读访问权限) 2.修改内容(读写访问权限)

写入访问/权限与修改光盘上的内容有关。

答案 1 :(得分:0)

删除文件与在Unix中通过命令行发布rm的概念相同。这将取消链接需要写入权限的文件(修改磁盘)。

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

答案 2 :(得分:0)

在任何操作系统中删除文件都是对主文件表引用的修改,它会通知OS文件所在的位置。

相关问题