在Android中打开pdf文件的限制

我想从我的Android应用程序中打开一些pdf。 我正在使用Intent来做到这一点:

Intent intent = new Intent(); intent.setDataAndType(Uri.parse(url), "application/pdf"); startActivity(intent); 

这段代码适用于某些pdf,但是当我尝试打开其他pdf时它失败了。

这是Android向我展示的消息:

该文件存在问题。

我必须提到,使用一个Crystal Report模板创建没有问题的pdf,并且使用另一个创建失败的pdf。

相反,如果我打开我的浏览器(在我的计算机上)失败的pdf的URL,它没有给我打开它们的任何错误所以我想也许Android上有一些限制,不同于某些pdf到另一个(在Crystal Report模板上),但我看不到它。

在Android上打开pdf文件有什么限制? (大小,Crystal Report的一些参数,不允许等等)

我已经放弃了它可能是一个大小限制,因为提供问题的pdf文件小于不提供任何错误的文件。

certificate我做了:

  • 在浏览器上打开错误的PDF ~~>确定
  • 在手机上下载错误的PDF并打开它~~>确定
  • 在APP上打开错误的PDF ~~> 错误
  • 在PDF崩溃的公司的APP上打开好的PDF ~~> OK

编辑

我注意到我使用的是http://协议,但PDF是在https://协议上,所以我在Uri.parse方法上更改了它。

当我进行此更改时,应用程序崩溃并在日志中显示错误:

android.content.ActivityNotFoundException:找不到处理Intent的Activity

此外,我注意到没有给我任何错误的PDF,在http://协议而不是https://的URL中,所以我想https://协议可能是问题所在。

我只能在Intent上打开http://请求吗?

Related of "在Android中打开pdf文件的限制"

可能是Android PDF查看器应用程序无法解释该文件。 您是否尝试将完全相同的文件复制/下载到Android手机并从那里打开?

此外,我建议使用IntentChooser启动PDF查看器,只是为了在没有安装PDF查看器的情况下安全地玩/给用户选择应用程序选项:

 Intent intent = new Intent(); intent.setDataAndType(Uri.parse(url), "application/pdf"); Intent chooserIntent = Intent.createChooser(intent, "Open Report"); startActivity(chooserIntent); 

我find了一种解决方法,可以在我的Android应用程序上查看我的PDF(但不允许我在应用程序上显示后下载它)。 如果我使用Google Docs打开PDF,我可以使用我的Intent打开它。

这是我在我的url之前添加的内容:

 https://docs.google.com/gview?embedded=true&url= 

所以最后的url将是:

 https://docs.google.com/gview?embedded=true&url=https://myUrl.pdf 

这是我现在使用的整个代码:

 String url= "https://docs.google.com/gview?embedded=true&url=https://url.pdf"; Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url)); startActivity(intent); 

但它仍然不够 ,因为我想打开它而不需要使用第三方应用程序。 此外,使用Google Docs打开PDF速度很慢,我必须等待太多,直到最终打开PDF。

如果有人知道如何用原生Android打开它,请告诉我。


如果我不使用Google文档打开它会怎样?

使用相同的代码,但只使用我的url,而不是添加的Google文档url,Android让我在两个应用程序之间进行选择:Adobe Acrobat Reader和Google Chrome。

  • 如果我使用谷歌浏览器打开它,它会下载PDF但不会自动打开。

  • 如果我用Adobe Acrobat Reader打开它,它会给我以下错误:

    PDF无法显示(无法打开)

如果API> = 21,您可以使用PDFRenderer创建每个页面的位图,但它只能查看,不可编辑。 这是我在飞行中编写的一个示例,缺少导航按钮,但这些不应该难以实现。

 PdfRenderer renderer = new PdfRenderer(ParcelFileDescriptor.open(new File("/path/to/file.pdf"), ParcelFileDescriptor.MODE_READ_ONLY)); PdfRenderer.Page page = renderer.openPage(0); Bitmap bitmap = Bitmap.createBitmap(page.getWidth(), page.getHeight(), Bitmap.Config.ARGB_8888); page.render(bitmap, null, null, PdfRenderer.Page.RENDER_MODE_FOR_DISPLAY); imageView.setImageBitmap(bitmap); page.close(); renderer.close(); 

编辑

PdfRenderer需要FileDescriptor的本地文件。 因此,根据我的知识,通过“云”进行查看,这种方法是不可能的。

简单地为android添加以下库: – //在app level build编译’com.joanzapata.pdfview:android-pdfview:1.0.4@aar’

 //inside your xml file  //inside java code pdfView.fromAsset(pdfName) .pages(0, 2, 1, 3, 3, 3) .defaultPage(1) .showMinimap(false) .enableSwipe(true) .onDraw(onDrawListener) .onLoad(onLoadCompleteListener) .onPageChange(onPageChangeListener) .load(); for more info:- use this github link 

https://github.com/JoanZapata/android-pdfview

您可以使用Webview从URL打开PDF,如下所示:

 webview.loadUrl("http://drive.google.com/viewerng/viewer?embedded=true&url=" + your url); 

使用https://协议打开pdf文件的意图,definitelly https://不是问题。

我看到你正在尝试定义数据types的方法:

 Intent intent = new Intent(); intent.setDataAndType(Uri.parse(url), "application/pdf"); startActivity(intent); 

但它会导致:

ActivityNotFoundException:找不到处理Intent的Activity

如果您使用其他方法,可能无法在选项中看到PDF阅读器以打开此类文件:

  Intent intent = new Intent(); intent.setDataAndType(Uri.parse(url), "application/pdf"); Intent chooserIntent = Intent.createChooser(intent, "Open Report"); startActivity(chooserIntent); 

您必须在没有types定义的情况下尝试此方法,它将完美地工作:

 Intent intent = new Intent(Intent.ACTION_VIEW); intent.setData(Uri.parse(url)); startActivity(intent); 

通过intent打开pdf文件的此问题的其他原因将是打开此类文件的默认应用程序,因此可能您将配置损坏或无效的应用程序,因此重置默认值:

转到Settings 。 点按Applications 点按Default Applications

选择应用程序并清除默认值

你可以试试这个,

 public void OpenPDFFile(String file_name) { try { File pdfFile = new File(getFile(), file_name);//File path if (pdfFile.exists()) //Checking for the file is exist or not { Uri path = Uri.fromFile(pdfFile); Intent objIntent = new Intent(Intent.ACTION_VIEW); objIntent.setDataAndType(path, "application/pdf"); objIntent.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY); try { startActivity(objIntent); Log.e("IR", "No exception"); } catch (ActivityNotFoundException e) { Log.e("IR", "error: " + e.getMessage()); Toast.makeText(DownloadedPdfActivity.this, "No Application Available to View PDF", Toast.LENGTH_SHORT).show(); } } }catch (Exception e){ e.printStackTrace(); } } 

要么

  mWebviewPdf.getSettings().setJavaScriptEnabled(true); mWebviewPdf.getSettings().setLoadWithOverviewMode(true); mWebviewPdf.getSettings().setUseWideViewPort(true); pDialog = new ProgressDialog(PdfActivity.this, android.R.style.Theme_DeviceDefault_Dialog); pDialog.setTitle("PDF"); pDialog.setMessage("Loading..."); pDialog.setIndeterminate(false); pDialog.setCancelable(false); mWebviewPdf.setWebViewClient(new WebViewClient() { @Override public void onPageStarted(WebView view, String url, Bitmap favicon) { super.onPageStarted(view, url, favicon); pDialog.show(); } @Override public void onPageFinished(WebView view, String url) { super.onPageFinished(view, url); pDialog.dismiss(); } }); **mWebviewPdf.loadUrl("https://docs.google.com/gview?embedded=true&url=" + mUrl);** String url= "https://docs.google.com/gview?embedded=true&url=" + mUrl; Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url)); startActivity(intent); 

您可以在webview中显示pdf。

您可以使用以下库来安装android: – //在app level build编译中

编译’com.github.barteksc:android-pdf-viewer:2.6.1′

在你的xml中:

  

在你的活动/片段中:

 pdfView.fromUri(Uri) or pdfView.fromFile(File) or pdfView.fromBytes(byte[]) or pdfView.fromStream(InputStream) // stream is written to bytearray - native code cannot use Java Streams or pdfView.fromSource(DocumentSource) or pdfView.fromAsset(String) 

有关更多信息,请参阅此链接

您的问题是您的pdf正在Data / data文件夹中下载,当您尝试使用默认intent打开时,外部应用程序没有任何权限从data / data文件夹中打开文件,因此您需要下载该文件应用程序的外部目录,然后尝试重新打开它将工作。