我正在尝试查看/打开我已下载到应用程序存储的几个文件,但由于某种原因,生成的操作视图活动没有打开文件的权限。在fileEntity.getFile()
下面返回一个File实例。
Uri uri = Uri.fromFile(fileEntity.getFile());
Debugger.message("Viewing file of type " + file.mime + " at " + uri);
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setDataAndType(uri, fileEntity.mime);
startActivity(intent);
输出:
10:44:10.161 5660 com.app VERBOSE消息在文件中查看application / pdf类型的文件:///data/user/0/com.app/files/1_lol.pdf
10:44:10.421 2551#2551错误DisplayData openFd:java.io.FileNotFoundException:Permission denied
10:44:10.421 2551#2551 ERROR PdfLoader无法加载文件(未打开)显示数据[PDF:1_lol.pdf] + FileOpenable,uri:file:/// data / user / 0 / com的.app /文件/ 1_lol.pdf
这是我最初保存文件的方式,这似乎有效:
File file = fileEntity.getFile();
FileOutputStream fos = new FileOutputStream(file);
HttpResponse response = getClient().rawRequest(fileEntity.url);
response.getEntity().writeTo(fos);
response.getEntity().consumeContent();
fos.flush();
fos.close();
问题是无法打开下载的文件。
我错过了什么,或者我不明白内部存储是如何工作的?
我在android manifest中有这些权限;
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
编辑因此,从android文档中的所有示例中,我都无法在appcompat库中找到有关FileProvider
的任何资源。在instructions here帮助解决问题之后。
答案 0 :(得分:0)
您没有打开文件的权限是因为您没有按照您的意图授予其他应用打开或查看文件的权限。要允许其他应用打开下载的文件,请包含标志(如下所示):FLAG_GRANT_READ_URI_PERMISSION
Intent browserIntent = new Intent(Intent.ACTION_VIEW);
browserIntent.setDataAndType(getUriFromFile(localFile), "application/pdf");
browserIntent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION|
Intent.FLAG_ACTIVITY_NO_HISTORY);
startActivity(browserIntent);
对于函数:getUriFromFile
private Uri getUriFromFile(File file){
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N) {
return Uri.fromFile(file);
}else {
return FileProvider.getUriForFile(itemView.getContext(), itemView.getContext().getApplicationContext().getPackageName() + ".provider", file);
}
}