我有一个文件路径:file:///storage/emulated/0/Android/data/rocks.v d 。*****。develop / files / 1Q 2017财务业绩.PDF
这是代码:
Intent intent = new Intent(Intent.ACTION_VIEW);
try {
String newFilePath = filePath.replaceAll("%20", " ");
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N) {
intent.setDataAndType(Uri.parse(newFilePath), "application/pdf");
} else {
Uri uri = Uri.parse(newFilePath);
File file = new File(uri.getPath());
if (file.exists()){
uri = FileProvider.getUriForFile(context, context.getPackageName() + ".provider", file);
intent.setDataAndType(uri, "application/pdf");
intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
}
}
intent.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
context.startActivity(intent);
我的uri = content://rocks.v d 。*****。develop.provider / files / Android / data / rocks.v d 。 *****。开发/文件/ 1Q%202017%20financial%20results.pdf
Pdf阅读器正在打开,出现意外错误。 怎么了?
答案 0 :(得分:6)
intent.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
在这里,您要清除所有现有的旗帜,尤其是FLAG_GRANT_READ_URI_PERMISSION
。因此,您启动的活动将无法访问您的内容。
从setFlags()
切换到addFlags()
。
答案 1 :(得分:2)
如果你正在使用android-N(即上面的API 24)就像这样
try {
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
File f = new File(Your File Path);
Uri uri = null;
// So you have to use Provider
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
uri = FileProvider.getUriForFile(this,getApplicationContext().getPackageName() + ".provider", file);
// Add in case of if We get Uri from fileProvider.
intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
}else{
uri = Uri.fromFile(f);
}
intent.setDataAndType(uri, "application/pdf");
startActivity(intent);
} catch(Exeption e){
e.printstacktrace();
}
您也可以在Lollipop上方使用此代码。
答案 2 :(得分:0)
在Adobe pdf阅读器中打开它。如果没有安装adobe reader,我将重定向到google play。
private void viewPdf(Uri file){
Intent intent;
intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(file, "application/pdf");
try{
startActivity(intent);
}catch(ActivityNotFoundException e){
AlertDialog.Builder builder = new AlertDialog.Builder(getApplicationContext());
builder.setTitle("No Application Found");
builder.setMessage("Download from Android Market?");
builder.setPositiveButton("Yes, Please", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
Intent marketIntent = new Intent(Intent.ACTION_VIEW);
marketIntent.setData(Uri.parse("market://details?id=com.adobe.reader"));
startActivity(marketIntent);
}
});
builder.setNegativeButton("No, Thanks", null);
builder.create().show();
}