【问题标题】:How do I determine if Android can handle PDF如何确定 Android 是否可以处理 PDF
【发布时间】:2011-02-16 14:38:48
【问题描述】:

我知道 Android 无法原生处理 PDF。但是,Nexus One(可能还有其他手机)预装了 QuickOffice Viewer。如何确定用户是否安装了 PDF 查看器?

目前,开始下载 PDF 的代码看起来很简单:

Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse(url));
startActivity(intent);

下载后,用户点击下载的文件调用查看器。 但是,如果没有 PDF 查看器,Android 会报告“无法下载。手机不支持该内容”。 我想确定用户是否会收到此消息,如果收到,请将他们定向到 Android Market 中的 PDF 应用程序。

【问题讨论】:

  • 我的 HTC Hero 预装了 QuickOffice 查看器和 HTC 自己的 PDF 查看器。

标签: android pdf


【解决方案1】:

我一直在对此进行测试,发现以下内容有效。首先,您独立下载文件并将其存储在设备上,然后执行以下操作:

 File file = new File("/sdcard/download/somepdf.pdf");

 PackageManager packageManager = getPackageManager();
 Intent testIntent = new Intent(Intent.ACTION_VIEW);
 testIntent.setType("application/pdf");
 List list = packageManager.queryIntentActivities(testIntent, PackageManager.MATCH_DEFAULT_ONLY);
 if (list.size() > 0 && file.isFile()) {
     Intent intent = new Intent();
     intent.setAction(Intent.ACTION_VIEW);
     Uri uri = Uri.fromFile(file);
     intent.setDataAndType(uri, "application/pdf");

     startActivity(intent);

我已经在各种模拟器和扎根的氰基手机以及 HTC Magic 上对此进行了测试。如果没有可用的 pdf 渲染器,则列表将返回零并且不会发生任何事情。

将数据类型设置为 pdf mime 类型以获得正确的行为似乎很重要。

如果你例如安装 droidreader 它将对意图做出反应并显示 pdf。

当然,您也可以在下载 pdf 之前进行检查,具体取决于您的用例,或者执行弹出警报或重定向其他下载意图等操作。

编辑:我已经将它重构为一个单独的方法..

    public static final String MIME_TYPE_PDF = "application/pdf";

/**
 * Check if the supplied context can render PDF files via some installed application that reacts to a intent
 * with the pdf mime type and viewing action.
 *
 * @param context
 * @return
 */
public static boolean canDisplayPdf(Context context) {
    PackageManager packageManager = context.getPackageManager();
    Intent testIntent = new Intent(Intent.ACTION_VIEW);
    testIntent.setType(MIME_TYPE_PDF);
    if (packageManager.queryIntentActivities(testIntent, PackageManager.MATCH_DEFAULT_ONLY).size() > 0) {
        return true;
    } else {
        return false;
    }
}

【讨论】:

  • 那么,您需要先下载PDF,然后再尝试显示?这是否适用于远程托管的 PDF?
  • 不.. 你必须从我找到的下载它。在意图中传递 url 不适用于许多 PDF 阅读器..
  • 您应该在 canDisplayPdf 方法中使用 setDataAndType - 结果与 'setType' 不同。
  • 这应该如何与 FileProvider 一起工作?这是一个不同的意图
【解决方案2】:

您可以查询 PackageManager 以查看是否有可以处理您的 Intent 的包。这是一个例子:http://www.curious-creature.org/2008/12/15/android-can-i-use-this-intent/

【讨论】:

  • 这告诉我 BrowserActivity 可以处理 PDF,即使在 Android 1.5 模拟器上也是如此。但是,该模拟器下载文件后,下载列表显示“无法下载。手机不支持该内容。”如何确定我是否会收到此消息?
【解决方案3】:

你可能会使用异步任务来下载任何文件。所以简单的方法就是在异步任务的 post execute() 方法中添加以下代码。它会要求选择。

FileOpener.open(context, file);

并且文件应该包含有关文件路径和文件名的信息。示例

File file = new File(Environment
        .getExternalStoragePublicDirectory("/MDroid")
        + filepath + fileName );

希望对你有帮助

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-08
    • 1970-01-01
    • 2010-12-21
    • 1970-01-01
    相关资源
    最近更新 更多