Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/234.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Android开放式pdf是';行不通_Java_Android - Fatal编程技术网

Java Android开放式pdf是';行不通

Java Android开放式pdf是';行不通,java,android,Java,Android,一段时间以来,我一直在努力让它工作。我在这里看到了关于如何从Android打开PDF的其他问题,普遍的共识是下面的代码。我错过什么了吗 try { Uri path = Uri.parse("android.resource://com.TeamGLaDOS.DayTradeSim/" + R.raw.teamdoc); Intent intent = new Intent(Intent.ACTION_VIEW); intent.s

一段时间以来,我一直在努力让它工作。我在这里看到了关于如何从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

尝试查询数据包管理器:

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);
}
这将检查是否找到可以运行PDF的内容


URI看起来不错,但您始终可以捕获
FileNotFoundException
,如果找不到pdf,则会抛出该异常,并用
getPackageName()
替换包名,以防您缺少字符。

您的URI构造适当,可以通过ID访问原始资源,但这并不意味着所有的PDF阅读器都会使用
android.resource://
数据URI方案来解析意图。 这在某种程度上取决于安装在用户设备上的PDF阅读器应用程序的实现,但许多人检查的不仅仅是意图中设置的mimeType。例如,Adobe Reader将使用
文件://
URI、
内容://
URI或根本不使用URI(仅使用mimeType)解析任何意图,但它不会解析直接指向资源的URI

为了尽可能做到通用,您应该首先从资产/资源中复制任何想要读取的PDF文件,并将其复制到文件系统中(内部或外部存储,只要文件是外部可读的,就没有区别)。然后将带有URI的意图传递给文件实例,总体来说,您的运气会好得多

快速测试表明,Aldiko只使用
文件://
URI和“application/pdf”mimeType对意图做出响应,而Adobe Reader也没有解决任何其他选项……所以这就是你的赢家


HTH

它不工作怎么办?有错误吗?如果有错误,您的日志会怎么说?@KurtisNusbaum我已经更新了详细信息。@KurtisNusbaum感谢您删除了您的答案,并因为我否决了您的答案而否决了我的投票!我没有投你反对票。我刚刚取消了我的投票。我删除了我的答案,因为正如你指出的,它是错误的。所以我不想留下错误的答案。我应该留下错误的答案吗?有趣的是,当我这样做时,
list
的大小为1,但仍然抛出异常。请参阅我的答案。这是因为解析没有数据URI的意图(仅限mimeType)和解析定义了URI+mimeType的意图将导致一组不同的可用活动:)您应该能够将列表中的项强制转换为ResolveInfo,以便使用list.get(0)获取活动的包名.resolvePackageName排除它找不到Aldiko的可能性。谢谢,这似乎是造成问题的原因。我认为我们将采用另一种方式来显示pdf,因为将其从软件包中复制到设备上的成本有点高。(这是一个大pdf)。谢谢