Android 为什么意图的活动返回null?

Android 为什么意图的活动返回null?,android,pdf,Android,Pdf,我在一件如此基本的事情上撞上了一堵砖墙。我想做的是打开一个PDF文件,使用任何像Adobe reader一样安装的PDF阅读器程序。然而,当我检查任何注册为application/pdf的已安装应用程序时,它总是返回null,即使我已验证是否安装了Adobe Reader。以下是我正在使用的代码: String pdfFile = "android.resource://" + getPackageName() + "/" + R.raw.middleburychamberweb2014; In

我在一件如此基本的事情上撞上了一堵砖墙。我想做的是打开一个PDF文件,使用任何像Adobe reader一样安装的PDF阅读器程序。然而,当我检查任何注册为application/pdf的已安装应用程序时,它总是返回null,即使我已验证是否安装了Adobe Reader。以下是我正在使用的代码:

String pdfFile = "android.resource://" + getPackageName() + "/" + R.raw.middleburychamberweb2014;
Intent pdfIntent = null, chooser=null;


pdfIntent = new Intent(Intent.ACTION_VIEW);
pdfIntent.setDataAndType(Uri.parse(pdfFile), "application/pdf");

PackageManager pm = getPackageManager();
List<ResolveInfo> activities = pm.queryIntentActivities(pdfIntent, 0);

if (pdfIntent.resolveActivity(getPackageManager()) != null) {
   chooser = Intent.createChooser(pdfIntent,"Select Viewer for PDF file");

   startActivity(chooser);

} else {
  /* No PDF reader found on device. Provide user the option to
   * install the Adobe Reader found on Google Play.
   */
   Log.e("Directory","No PDF viewers!");

   noPDFReader(getString(R.string.doc1web));
}

不,您不需要内容提供商

我喜欢这样: 这段代码为我打开了PDF

         fileName = "something.pdf"
         File path = Environment.getExternalStoragePublicDirectory(
                Environment.DIRECTORY_PICTURES);  // these can be anywhere, really. but this app stuffed them here

         File file = new File(path, fileName); // get the path



         Intent intent = new Intent();
         intent.setAction(Intent.ACTION_VIEW);

         String extension = android.webkit.MimeTypeMap.getFileExtensionFromUrl(Uri.fromFile(file).toString());
         String mimetype = android.webkit.MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension);

         intent.setDataAndType(Uri.fromFile(file), mimetype);

         PackageManager packageManager = getPackageManager();
         List<ResolveInfo> activities = packageManager.queryIntentActivities(intent, 0);
         boolean isIntentSafe = activities.size() > 0;

         if (isIntentSafe) {
            startActivity(intent);
         }
         else {
            Log.d("SHOWFILE", "no intents available");
         }

迄今为止,几乎没有编写过任何应用程序支持晦涩难懂的android:resource方案,这就是为什么它不起作用的原因

我同意323go-使用内容提供商。这需要在提供者端实现零行Java代码,因为您只需使用FileProvider。调用startActivity时,它需要一个清单条目、一个元数据XML文件和一行代码,以允许PDF查看器访问内容。这比写入外部存储器更能证明未来,而且更安全


FWIW,我已经演示了如何通过文件提供程序向外部PDF查看器提供PDF。

您不能将资源URI传递给其他应用程序。它无法进入文件。您需要实现ContentProvider。这假定PDF查看器具有对外部存储的读取权限。这将慢慢消失,即使在今天,我也不会做出这样的假设。323go的建议是正确的-一个内容提供商,如Android提供的文件提供商,是一个更好的途径。非常感谢您的帮助。但是,我已经从Github下载了您的示例,并将其安装在带有PDF阅读器的手机上,我收到了无法打开此文档的消息。此外,这可能也与此相关,我可以通过点击文件名查看下载到手机上的PDF文件,阅读器会自动执行并加载该文件,但由于某些原因,当我尝试从我的应用程序测试任何阅读器时,它总是返回空值。以下是我用于测试的代码:if pdfIntent.resolveActivitygetPackageManager!=无效的{@maleman:您使用的是什么PDF阅读器?Adobe reader、QuickOffice和RepliGo reader在打开内容方案Uri值时没有问题。我有Adobe reader和Polaris Office。直接调用它们时,它们似乎可以正常工作。然而,有一个有趣的注意事项是,在“我的设置->默认应用程序”下没有PDF程序的条目。@maleman:设置>默认应用程序不是标准Android的一部分,因此可能是您的设备制造商干扰了意向解析。我将应用程序加载到较旧的Acer平板电脑上,令我惊讶的是,选择器出现了!现在我收到了一个找不到文件的错误!我验证了pdf文件已复制到资产目录no但是,当我启动adb shell并导航到/data/data/[my application]/files时,它是空的。故事还在继续。。。