我想从网址下载PDF,如果没有检测到PDF查看器,也想触发catch
短语。
这是我的代码:
try {
startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(materialPdfUrl)));
} catch (ActivityNotFoundException e) {
openDialog(getString(R.string.error),
getString(R.string.no_pdf_reader));
}
现在问题是ActivityNotFoundException永远不会被触发,因为它总是下载PDF,即使没有PDF Viewer。你怎么建议我这样做?
修改 这是我的旧代码:
Intent pdfIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(materialPdfUrl));
pdfIntent.setType("application/pdf");
pdfIntent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
startActivity(pdfIntent);
答案 0 :(得分:2)
startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(materialPdfUrl)));
正在开始Implicit Intent
,因此不会抛出ActivityNotFoundException
。
如果您阅读此http://developer.android.com/guide/components/intents-filters.html#ccases
例如,考虑当用户关注网页上的链接时浏览器应用程序执行的操作。它首先尝试显示数据(如果链接指向HTML页面,则可以显示)。如果它无法显示数据,它会将隐式意图与方案和数据类型放在一起,并尝试启动可以完成工作的活动。如果没有接收者,则要求下载管理员下载数据。这使得它在内容提供者的控制之下,因此可能更大的活动池(具有仅命名数据类型的过滤器的活动)可以响应。
因此,如果没有找到PDF查看器,Android下载管理器将尝试下载该文件(而不是抛出该异常)。
如果您想查看pdf或被告知您无法查看(而不是下载),那么您需要使用PackageManager
手动查询系统,以确定应用程序是否会响应您的意图而不是而不仅仅是开除和遗忘。
ActivityNotFoundException
将为Explicit Intent's
提供类似的内容:
Intent intent = new Intent();
intent.setComponent(new ComponentName("com.facebook","NewsFeedActivity.java"));
startActivity(intent);```
答案 1 :(得分:1)
您使用的函数 startActivity()不是在PDF阅读器不存在的情况下,它只从URL下载PDF,如果有PDF阅读器那么它将提供一个选择器,就像点击PDF文件一样。
答案 2 :(得分:1)
您可以尝试使用此代码。这可能对您有所帮助。
Intent intent = new Intent();
intent.setClassName("com.adobe.reader", "com.adobe.reader.AdobeReader");
intent.setAction(android.content.Intent.ACTION_VIEW);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
Uri uri = Uri.fromFile(file);
intent.setDataAndType(uri, "application/pdf");
try {
startActivity(intent);
} catch (Exception e) {
AlertDialog.Builder builder = new AlertDialog.Builder(
getApplicationContext());
builder.setTitle("No Application Found");
builder.setMessage("Download application from Android Market?");
builder.setPositiveButton(
"Yes, Please",
new DialogInterface.OnClickListener() {
@Override
public void onClick(
DialogInterface dialog,
int which) {
Intent marketIntent = new Intent(
Intent.ACTION_VIEW);
marketIntent.setData(Uri
.parse("market://details?id=com.adobe.reader"));
mProgressDialog.dismiss();
startActivity(marketIntent);
}
});
builder.setNegativeButton("No, Thanks",
null);
builder.create().show();
}
答案 3 :(得分:1)
我建议使用PackageManager来检测系统是否会为您处理PDF意图。
PackageManager packageManager = context.getPackageManager();
Intent intent = new Intent(Intent.ACTION_VIEW)
.setType("application/pdf");
List<ResolveInfo> list = packageManager.queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY;
if (list.size() > 0) {
// Happy days a PDF reader exists
startActivity(intent);
} else {
// No PDF reader, ask the user to download one first
// or just open it in their browser like this
intent = new Intent(Intent.ACTION_VIEW)
.setData(Uri.parse("http://docs.google.com/gview?embedded=true&url=" + pdfUrl);
startActivity(intent);
}
有关检查意图的详细信息,请参阅此blog post。这种方法的另一个好处是,在应用程序尝试执行Intent之前,您可以灰显/删除菜单选项。然后,您可以以更友好的方式向用户解释他们需要获取PDF查看器应用程序,或者确实应用一些逻辑来回退到基于Web的PDF查看器。
用福昕阅读器和Adobe Reader试用这种方法后,他们似乎都有不同的行为。 Foxit不会为您下载PDF,它会将您重定向到浏览器并下载文件。 Adobe将为您下载该文件,然后显示它。
因此,一旦检测到PDF查看器可用,为了解决这个差异,您可能需要将PDF下载到SD卡,例如下载文件夹。这可能最好在AsyncTask中实现,或者您可以使用DownloadManager
。然后在首选阅读器中打开本地文件Uri。这应该绕过行为的差异。也许打开福克斯的票,让它与Adobe一致? ;)
答案 4 :(得分:0)
使用startActivityForResult(..)。
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(Uri.fromFile(file), "application/pdf");
startActivityForResult(intent, REQUEST_CODE);
您将在活动的onActivityResult(..)中获得结果。
答案 5 :(得分:0)
这是因为您的设备或模拟器没有能够查看本地PDF文件的应用程序。
每当启动一个intent时,都应该在模拟器上安装本机应用程序来处理该意图。防爆。如果您使用Google地图作为操作调用intent,则必须使用基于Google API的模拟器。默认情况下,android模拟器没有PDF阅读器。您可以在带有PDF阅读器的设备上测试它,它应该可以正常工作。