为什么Android的解析活动返回null?

时间:2014-11-19 21:38:22

标签: android pdf

我在一个如此基本的东西上撞砖墙。我想要做的是打开一个PDF文件,其中包含任何像Adobe Reader一样安装的PDF阅读器程序。但是,当我检查注册为“application / pdf”的任何已安装的应用程序时,即使安装了已验证的Adobe Reader,它也始终返回null。这是我正在使用的代码:

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));
}

2 个答案:

答案 0 :(得分:1)

不,您不需要内容提供商。

我是这样的: 这段代码为我打开了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");
         }

答案 1 :(得分:1)

大约有零个应用程序都写了这个模糊的android:resource方案,这就是为什么这不起作用。

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

FWIW,我a sample project演示通过FileProvider向外部PDF查看器提供PDF。