在Android中打开pdf文件的限制

我正试图从我的Android应用程序打开一些PDF。 我正在使用一个意图来做到这一点:

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

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

这是Android向我展示的信息:

这个文件有问题。

我不得不提一下,正在打开没有问题的PDF是用一个水晶报表模板创build的,失败的PDF是用另一个创build的。

相反,如果我打开在我的浏览器(在我的电脑上)失败的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://所以我猜https://协议可能是问题。

我只能打开http://意向请求?

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

这可能是由Android PDF查看器应用程序解释失败的文件。 你有没有尝试复制/下载完全相同的文件到你的Android手机,并从那里打开?

此外,我会build议使用IntentChooser启动PDF查看器,只是为了安全播放PDF阅读器安装/给予用户选项来select应用程序:

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

我发现了一个解决方法来查看我的Android应用程序上的PDF(但不允许我在应用程序显示后下载)。 如果我使用Google文档打开我的PDF,我可以用我的意图打开它。

这是我必须在我的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文档打开PDF格式的速度很慢,我不得不等待很长时间才能打开PDF。

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


如果我不打开Goog​​le文档,会发生什么情况?

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

  • 如果我用Google Chrome打开它,它会下载PDF,但不会自动打开。

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

    PDF无法显示(无法打开)

为Android添加以下库: – //在应用程序级别编译“com.joanzapata.pdfview:android-pdfview:1.0.4@aar'

 //inside your xml file <com.joanzapata.pdfview.PDFView android:id="@+id/pdfview" android:layout_width="match_parent" android:layout_height="match_parent"/> //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); 

如果API> = 21,则可以使用PDFRenderer为每个页面创build一个位图,但只能看到,不可编辑。 这里是一个例子,我在飞行中,缺乏导航button,但这些不应该很难实现。

 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的本地文件。 因此,就我所知,通过“云”来观察,这种方法是不可能的。

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

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

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

但会造成:

ActivityNotFoundException:找不到处理Intent的活动

如果你使用这种其他的方法可能你不能看PDF阅读器的选项来打开这种types的文件:

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

这个问题的其他原因打开PDF文件通过意图将是默认的应用程序来打开这种types的文件,所以可能会有一个损坏或无效的应用程序configuration,所以重置默认值:

转到Settings 。 点击Applications 点按Default Applications

select应用程序并清除默认值

你可以试试这个,

 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库: – / /在应用程序级别build立编译

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

在你的xml中:

 <com.github.barteksc.pdfviewer.PDFView android:id="@+id/pdfView" android:layout_width="match_parent" android:layout_height="match_parent"/> 

在你的活动/片段中:

 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正在下载数据/数据文件夹内,当您尝试打开使用默认意图时,外部应用程序没有任何权限打开文件从数据/数据文件夹内,所以你需要下载文件应用程序的外部目录,然后尝试重新打开它将工作。