我如何确定Android是否可以处理PDF

我知道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应用程序。

Solutions Collecting From Web of "我如何确定Android是否可以处理PDF"

我一直在testing这个,发现以下的作品。 首先你独立下载文件并将其存储在设备上,然后你去做这件事:

  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上进行了testing。 如果没有pdf渲染器可用,则列表将返回零并且什么都不会发生。

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

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

当然你也可以在你下载PDF之前做这个检查,这取决于你的用例,或者做一些事情,比如popup警告或者redirect其他的意图以便下载或者其他的东西。

编辑:我已经重构了一个单独的方法。

  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; } } 

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

您可能会使用asynchronous任务来下载任何文件。因此,简单的方法是在后面的execute()方法中添加下面的代码,这将是asynchronoustask.it将要求select。

 FileOpener.open(context, file); 

文件应包含有关文件path和文件名的信息

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

希望能帮助到你