我一直试图让这个工作一段时间。我已经在这里看到了有关如何从Android打开pdf的其他问题,一般的共识是我在下面的代码。我错过了什么吗?
try
{
Uri path = Uri.parse("android.resource://com.TeamGLaDOS.DayTradeSim/" + R.raw.teamdoc);
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(path, "application/pdf");
this.startActivity(intent);
}
catch(ActivityNotFoundException e)
{
Toast.makeText(this, "No Application Available to view PDF", Toast.LENGTH_SHORT).show();
}
编辑:它始终抛出ActivityNotFoundException并显示Toast。
异常消息是:
android.content.ActivityNotFoundException: No Activity found to handle Intent { act=android.intent.action.VIEW dat=android.resource://com.TeamGLaDOS.DayTradeSim/2130968576 typ=application/pdf }
编辑2:我安装了一个pdf应用程序(Aldiko),之前我曾使用其他应用程序在Aldiko中启动pdf。
答案 0 :(得分:2)
您的URI经过适当构建,可通过ID访问原始资源,但这并不意味着所有PDF阅读器都将使用android.resource://
数据URI方案解析意图。
它在某种程度上取决于用户设备上安装的PDF Reader应用程序的实现,但许多检查不仅仅是在您的意图中设置的mimeType。例如,Adobe Reader将解析具有file://
URI,content://
URI或根本没有URI的任何Intent(只是mimeType),但它不能解析直接指向a的URI资源。
为尽可能通用,您应首先将要从资源/资源中读取的任何PDF文件复制到文件系统(内部或外部存储,只要文件创建在外部可读,就没有区别)。然后将带有URI的intent传递给文件实例,整体上你应该有更好的运气。
快速测试显示,Aldiko只对具有file://
URI和“application / pdf”mimeType的Intent做出响应,而且甚至Adobe Reader都没有解决其他任何选项...所以这是你的赢家。
HTH
答案 1 :(得分:1)
尝试查询数据包管理器:
PackageManager packageManager = getPackageManager();
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setType("application/pdf");
List list = packageManager.queryIntentActivities(intent,PackageManager.MATCH_DEFAULT_ONLY);
if (list.size() > 0) {
intent.setDataAndType(path, "application/pdf");
startActivity(intent);
}
这将检查是否找到了运行pdfs的内容。
URI看起来很好,但是如果找不到pdf,你可以随时捕获FileNotFoundException
,如果你遗漏了一个字符,用getPackageName()
替换你的包名。