0

我的问题是为什么我在尝试从 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();
}

删除文件方法

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(存储访问框架):从 TreeUri 获取特定文件 Uri

4

3 回答 3

1

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

写访问/许可是关于修改光盘上的内容。

于 2019-09-21T14:20:05.497 回答
0

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

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

于 2019-09-21T16:05:52.857 回答
0

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

于 2019-09-21T16:13:35.767 回答