我正在尝试从我的Android应用程序中打开一些pdf。我正在使用Intent来做到这一点:
Intent intent = new Intent();
intent.setDataAndType(Uri.parse(url), "application/pdf");
startActivity(intent);
这段代码适用于某些pdf但是当我尝试打开其他代码时它失败了。
这是Android向我展示的消息:
该文件存在问题。
我必须提到,使用一个Crystal Report模板创建没有问题的pdf,并且使用另一个创建失败的pdf。
相反,如果我打开我的浏览器(在我的计算机上)失败的pdf的URL,它不会给我任何打开它们的错误所以我想这可能是Android上的一些限制不同于一些pdf到另一个(在Crystal Report模板上),但我看不到它。
在Android上打开pdf文件有哪些限制? (大小,不允许的Crystal Report的一些参数等等)
我已经放弃了它可能是一个大小限制,因为提供问题的pdf文件小于不提供任何错误的文件。
证明我已经完成了:
修改
我注意到我使用的是http://
协议,但PDF是https://
协议,因此我在Uri.parse
方法上对其进行了更改。
当我进行此更改时,应用程序崩溃并在日志中显示错误:
android.content.ActivityNotFoundException:找不到处理Intent的活动
另外,我注意到那些没有给我任何错误的PDF都在http://
协议而不是https://
的网址中,所以我猜https://
协议可以是问题。
我是否只能在意图上打开http://
请求?
答案 0 :(得分:10)
可能是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);
答案 1 :(得分:8)
我找到了一种解决方法,可以在我的Android应用程序上查看我的PDF(但不允许我在应用程序上显示后下载它)。如果我使用Google Docs打开PDF,我可以用我的Intent打开它。
这是我必须在我的网址之前添加的内容:
https://docs.google.com/gview?embedded=true&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文档打开它会怎样?
使用相同的代码,但只使用我的网址,而不是添加的Google文档网址,Android让我在两个应用程序之间进行选择:Adobe Acrobat Reader和Google Chrome。
如果我使用谷歌浏览器打开它,它会下载PDF但不会自动打开。
如果我用Adobe Acrobat Reader打开它,它会给我以下错误:
无法显示PDF(无法打开)
答案 2 :(得分:4)
如果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的本地文件。因此,根据我的知识,通过这种方法反过来查看云计算是不可能的。
答案 3 :(得分:4)
为android添加以下库:
//in app level build
compile '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();
了解更多信息,请使用此GitHub链接: https://github.com/JoanZapata/android-pdfview
答案 4 :(得分:3)
您可以使用Webview从URL打开PDF,如下所示:
cls.cursor
答案 5 :(得分:2)
使用意图以https://
协议打开pdf文件,definitelly https://
不是问题。
我看到你正在尝试这种方法来定义数据类型:
Intent intent = new Intent();
intent.setDataAndType(Uri.parse(url), "application/pdf");
startActivity(intent);
但会导致:
ActivityNotFoundException:找不到处理Intent的活动
如果您使用其他方法,可能无法在选项中看到PDF阅读器以打开此类文件:
Intent intent = new Intent();
intent.setDataAndType(Uri.parse(url), "application/pdf");
Intent chooserIntent = Intent.createChooser(intent, "Open Report");
startActivity(chooserIntent);
您必须在没有类型定义的情况下尝试此方法,它将完美运行:
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse(url));
startActivity(intent);
通过intent打开pdf文件的此问题的其他原因是打开此类文件的默认应用程序,因此可能会配置损坏或无效的应用程序,因此请重置默认值:
转到Settings
。
点按Applications
。
点按Default Applications
。
选择应用并清除默认值
答案 6 :(得分:2)
你可以试试这个,
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。
答案 7 :(得分:2)
您可以在android中使用以下库: - //在app level build compile
你的xml中的compile'com.github.barteksc:android-pdf-viewer:2.6.1'
:
<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)
有关详细信息,请参阅此link
答案 8 :(得分:2)
您的问题是您的pdf正在Data / data文件夹中下载,当您尝试使用默认intent打开时,外部应用程序没有任何权限从data / data文件夹中打开文件,因此您需要下载应用程序外部目录的文件,然后尝试重新打开它将正常工作。