我知道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电子市场中的PDF应用。
答案 0 :(得分:56)
我一直在测试这个并发现以下工作。首先,您单独下载文件并将其存储在设备上,然后执行此操作:
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);
我已经在各种模拟器和root root cyanogen手机以及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;
}
}
答案 1 :(得分:10)
您可以查询PackageManager以查看是否有可以处理您的Intent的包。这是一个例子:http://www.curious-creature.org/2008/12/15/android-can-i-use-this-intent/
答案 2 :(得分:0)
您可能会使用asynch任务来下载任何文件。所以简单的方法就是在asynch task.it的post execute()方法中添加以下代码。将要求选择。
FileOpener.open(context, file);
和文件应包含有关filepath和filename的信息。示例
File file = new File(Environment
.getExternalStoragePublicDirectory("/MDroid")
+ filepath + fileName );
希望有所帮助