如何使用Android存储访问框架获取DocumentContract

时间:2017-03-28 13:56:33

标签: android file-permissions storage-access-framework

我正在尝试在我的应用中实施SAF。我已设法使用以下内容将音乐文件复制到外部SD卡:

         Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE);
    startActivityForResult(intent, REQUEST_CODE_OPEN_DIRECTORY);

调出文件/文件夹选择器

复制:

   private String copyFile(String inputPath, String inputFile, Uri treeUri) {
    InputStream in = null;
    OutputStream out = null;
    String error = null;
    DocumentFile pickedDir = DocumentFile.fromTreeUri(getActivity(), treeUri);
    String extension = inputFile.substring(inputFile.lastIndexOf(".")+1,inputFile.length());

    try {
        DocumentFile newFile = pickedDir.createFile("audio/"+extension, inputFile);
        out = getActivity().getContentResolver().openOutputStream(newFile.getUri());
        in = new FileInputStream(inputPath + inputFile);

        byte[] buffer = new byte[1024];
        int read;
        while ((read = in.read(buffer)) != -1) {
            out.write(buffer, 0, read);
        }
        in.close();
        // write the output file (You have now copied the file)
        out.flush();
        out.close();

    } catch (FileNotFoundException fnfe1) {
        error = fnfe1.getMessage();
    } catch (Exception e) {
        error = e.getMessage();
    }
    return error;
}

BUT 当用户选择“移动”时,我想删除原始位置中可能不在文档树中的文件,因为它们与选择的文件夹无关。它们的路径来自Mediastore_DATA字段。 问题是如何使用这些文件获取DocumentContract以便我可以删除它们?

1 个答案:

答案 0 :(得分:1)

无法从SAF获取URI权限,无需调用其他UI。

由于您使用MediaStore获取媒体文件,因此您可以将ContentResolver.delete()与您必须删除的媒体URI一起使用。我假设你有WRITE_EXTERNAL_STORAGE权限。我不建议使用File直接删除底层文件,因为MediaStore没有机会清理它。

或者,您也可以尝试https://developer.android.com/reference/android/os/storage/StorageVolume.html#createAccessIntent(java.lang.String)获取整个主存储的树URI权限。但它只适用于API 24。