是否需要READ_EXTERNAL_STORAGE权限才能从Intent.ACTION_GET_CONTENT读取Uri

时间:2018-06-12 21:22:57

标签: android

我想知道,如果我发布以下Intent.ACTION_GET_CONTENT

Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType("application/zip");
startActivityForResult(intent, RequestCode.REQUEST_CHOOSE_BACKUP_FILE);

并尝试以下列方式从意图中读取返回的Uri。

Uri uri = data.getData();

// Figure out extension
ContentResolver contentResolver = getContext().getContentResolver();
MimeTypeMap mimeTypeMap = MimeTypeMap.getSingleton();
final String extension = mimeTypeMap.getExtensionFromMimeType(contentResolver.getType(uri));

File temp = null;
try {
    temp = File.createTempFile(Utils.getJStockUUID(), "." + extension);
} catch (IOException e) {
    e.printStackTrace();
}

// Delete temp file when program exits.
temp.deleteOnExit();

InputStream inputStream = null;
OutputStream outputStream = null;

try {
    inputStream = getContext().getContentResolver().openInputStream(uri);
    outputStream = new FileOutputStream(temp);

    byte[] buffer = new byte[8 * 1024];
    int bytesRead;
    while ((bytesRead = inputStream.read(buffer)) != -1) {
        outputStream.write(buffer, 0, bytesRead);
    }
} catch (IOException e) {
    Log.e(TAG, "", e);
} finally {
    close(outputStream);
    close(inputStream);
}

是否需要READ_EXTERNAL_STORAGE权限?

我测试了几轮。令我惊讶的是,我可以在没有请求READ_EXTERNAL_STORAGE的情况下执行成功阅读。

我只是想确认READ_EXTERNAL_STORAGE并非真正需要在Intent.ACTION_GET_CONTENT中阅读Uri,在所有类型的情况下。

1 个答案:

答案 0 :(得分:2)

我有一个用户安装了第三方文件管理器的实例(File Manager+),如果没有首先授予READ_EXTERNAL_STORAGE权限,那么从ACTION_GET_CONTENT返回的Uri读取将失败,并显示权限错误(只有当他们使用第三方应用程序选择文件时,如果他们使用Google云端硬盘或正常的系统选择,则在未经许可的情况下工作正常)。

我能够通过在Play商店中的一个模拟器上安装文件管理器+并试用它来复制行为。