Android 未在牛轧糖上打开PDF文件+;
我正在创建一个应用程序,在这个应用程序中有一个按钮,可以打开一个PDF,其中包含用户活动的日历 PDF位于“资源”文件夹中 实际代码是:Android 未在牛轧糖上打开PDF文件+;,android,pdf,Android,Pdf,我正在创建一个应用程序,在这个应用程序中有一个按钮,可以打开一个PDF,其中包含用户活动的日历 PDF位于“资源”文件夹中 实际代码是: private void abrirCalendario() { AssetManager assetManager = getAssets(); File fileDir = new File(Environment.getExternalStorageDirectory().getPath() + "/");
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);
}
private void abricalendario(){
AssetManager AssetManager=getAssets();
File fileDir=新文件(Environment.getExternalStorageDirectory().getPath()+“/”;
fileDir.mkdirs();
File File=新文件(fileDir,“Calendario DAERG.pdf”);
String path=Environment.getExternalStorageDirectory().getPath()+“/Calendario DAERG.pdf”;
意向意向=新意向(意向.行动\视图);
Uri;
if(Build.VERSION.SDK\u INT>=Build.VERSION\u code.N){
uri=FileProvider.getUriForFile(这是getPackageName()+“.provider”,新文件(路径));
List resinfo List=getPackageManager().queryInputActivities(intent,PackageManager.MATCH_DEFAULT_仅限);
对于(ResolveInfo ResolveInfo:ResInfo列表){
字符串packageName=“tk.davidev.android.ews”;
grantUriPermission(packageName、uri、Intent.FLAG_GRANT_uri_PERMISSION | Intent.FLAG_GRANT_READ_uri_PERMISSION);
}
}否则{
uri=uri.fromFile(新文件(路径));
}
如果(!file.exists()){
试一试{
InputStream in=assetManager.open(“calendario_2017.pdf”);
OutputStream out=新的BufferedOutputStream(新文件OutputStream(文件));
复制文件(输入、输出);
in.close();
out.flush();
out.close();
}捕获(例外e){
}
}
setDataAndType(uri,“应用程序/pdf”);
intent.setFlags(intent.FLAG\u活动\u新任务);
星触觉(意向);
}
我得到的错误是:
file:///storage/emulated/0/Calendario DAERG.pdf通过Intent.getData()在应用程序之外公开,我认为这是因为来自Mashmellow的Android改变了其顺序行为,例如在运行时请求权限或使用FileProvider管理URI。现在我必须在某些代码中授予权限才能工作。
这是一个在牛轧糖中用行动观点表达开放意图的例子
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授予权限
intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
我给您留下这个链接是为了了解这个新实现的背景知识。
另外,我按照这个anwser从asset中读取了我的file.pdf文件
希望能帮忙,问候