我正在创建一个应用程序,并且在此应用程序中有一个按钮,用于打开带有用户活动日历的PDF ...
PDF位于资产文件夹中。
实际代码是:
private void abrirCalendario() {
AssetManager assetManager = getAssets();
File fileDir = new File(Environment.getExternalStorageDirectory().getPath() + "/");
fileDir.mkdirs();
File file = new File(fileDir, "Calendario DAERG.pdf");
String path = Environment.getExternalStorageDirectory().getPath() + "/Calendario DAERG.pdf";
Intent intent = new Intent(Intent.ACTION_VIEW);
Uri uri;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
uri = FileProvider.getUriForFile(this, getPackageName() + ".provider", new File(path));
List<ResolveInfo> resInfoList = getPackageManager().queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY);
for (ResolveInfo resolveInfo : resInfoList) {
String packageName = "tk.davidev.android.ews";
grantUriPermission(packageName, uri, Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_READ_URI_PERMISSION);
}
}else {
uri = Uri.fromFile(new File(path));
}
if(!file.exists()) {
try {
InputStream in = assetManager.open("calendario_2017.pdf");
OutputStream out = new BufferedOutputStream(new FileOutputStream(file));
copyFile(in, out);
in.close();
out.flush();
out.close();
} catch (Exception e) {
}
}
intent.setDataAndType(uri, "application/pdf");
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
}
我得到的错误是:
file:///storage/emulated/0/Calendario DAERG.pdf exposed beyond app through Intent.getData()
答案 0 :(得分:0)
大家好,因为我认为来自Mashmellow的Android会改变其细分行为,例如在运行时请求权限或使用FileProvider来管理URI。现在我必须在某些代码中给予许可才能工作。 这是在Nougat中使用ACTION_VIEW打开Intent的一个例子
File archivo= new File(getExternalFilesDir(Environment.DIRECTORY_PICTURES),"excerpt_DEC.pdf");
Uri uri = FileProvider.getUriForFile(this,
"com.example.android.fileprovider",
archivo);
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(uri,"application/pdf");
intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
startActivity(intent);
我的例子和你的一样。我从资产中读取了一个文件然后,我发现该文件已创建并保存在 archivo 对象中。稍后,使用FileProvider方法获取一个uri,最后,我赋予使用此行的意图权限
intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
我留下这个链接,了解有关此新实施的背景知识。 https://developer.android.com/reference/android/support/v4/content/FileProvider.html 另外,我跟着这个anwser从资产中读取了我的file.pdf https://stackoverflow.com/a/7495078/8650422 希望能有所帮助,问候!