如何通过Android中的Intent打开Pdf查看器

时间:2019-01-10 19:32:52

标签: android android-intent

VB.NET / SQL Developer是Android开发的新手,但概念正在逐渐普及。

我设法实现DownloadManager来从URI将PDF下载到DIRECTORY_DOWNLOADS文件夹,但是当我尝试使用Intent打开时,系统仅提示我使用Dropbox和Word,而不是普通应用程序。

Intent pdfIntent = new Intent(Intent.ACTION_VIEW);
pdfIntent.setDataAndType(Uri.parse(DIRECTORY_DOWNLOADS + File.separator + "WinLib" + File.separator + "WinLib.pdf"), "application/pdf");
pdfIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
pdfIntent.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);


try{
    startActivity(pdfIntent);
}catch(ActivityNotFoundException e) {
    Toast.makeText(MainActivity.this, "No Application available to view PDF", Toast.LENGTH_SHORT).show();
}

当我从“下载”文件夹中单击文件时,会显示Drive PDF Viewer和OneDrive PDF Viewer的选项。

正如我所说,我对Android / Java不熟悉,所以请不要苛刻,但由于Google在此方面干Google了,因此不胜感激!

预先感谢

戴夫

解决方案

用户“ Shine”将我指向“ Martin Himmel” post的方向。

我不得不组合intent.setData和intent.setType,因为当我使用setType时,它将数据重置为null,所以找不到文件。

完成后,我得到了错误:

android.os.FileUriExposedException: file:///storage/emulated/0/Download/WinLib/WinLib.pdf exposed beyond app through ClipData.Item.getUri()

该解决方案是在“ eranda.del”的post中找到的。

所以我的最终代码如下:

public String get_mime_type(String url) {
    String ext = MimeTypeMap.getFileExtensionFromUrl(url);
    String mime = null;
    if (ext != null) {
        mime = MimeTypeMap.getSingleton().getMimeTypeFromExtension(ext);
    }
    return mime;
}

public void open_file(String filename) {
    File file = new File(Environment.getExternalStoragePublicDirectory(
            Environment.DIRECTORY_DOWNLOADS), filename);

    Uri uri = Uri.fromFile(file);
    String mime = get_mime_type(uri.toString());

    StrictMode.VmPolicy.Builder builder = new StrictMode.VmPolicy.Builder();
    StrictMode.setVmPolicy(builder.build());

    Intent intent = new Intent();
    intent.setAction(Intent.ACTION_VIEW);
    intent.setDataAndType(uri, mime);
    intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
    this.startActivity(Intent.createChooser(intent, "Open file with"));
}

非常感谢Shine和其他帮助我完成此任务的贡献者!

戴夫

1 个答案:

答案 0 :(得分:0)

您确定该Uri.parse(DIRECTORY_DOWNLOADS + File.separator + "WinLib" + File.separator + "WinLib.pdf")参数吗?我将尝试使用一种类似于here的方法来尝试FileProvider.getUriForFile()。这样,您可以轻松地检查通过以下方式传递给意图的pdf的Uri和mime类型:

String mime = getContentResolver().getType(uri);

我还想像您需要进行.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)调用,以便授予对外部查看Intent的读取权限。