通过android意图打开在线pdf文件?
Posted
技术标签:
【中文标题】通过android意图打开在线pdf文件?【英文标题】:Open online pdf file through android intent? 【发布时间】:2014-06-08 01:26:40 【问题描述】:目前我有一个pdf url
,我想简单地使用意图打开它,但是,如果我将url
放入intent
,它就不起作用
我的代码是这样的,总是抛出ActivityNotFoundException
错误
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(Uri.parse(law.url), "application/pdf");
try
startActivity(intent);
catch (ActivityNotFoundException e)
Utility.showErrorDialog(
ctx,ctx.getResources().getString(R.string.sys_in,
ctx.getResources().getString(R.string.err_no_pdf_reader),
ctx.getResources().getString(R.string.close));
我也尝试了 goolge doc 方法,但我的客户拒绝了这个,所以我没有使用这个方法
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(Uri.parse("http://docs.google.com/viewer?url="
+ publish.get(Integer.parseInt((String) view.getTag())).pdfURL), "text/html");
ctx.startActivity(intent);
感谢您的帮助
记录猫错误更新
04-23 18:18:50.487: E/androidRuntime(17161): android.content.ActivityNotFoundException: No Activity found to handle Intent act=android.intent.action.VIEW dat=http://oshc.zizsoft.com/oshc_testing.pdf typ=application/pdf
04-23 18:18:50.487: E/AndroidRuntime(17161): at android.app.Instrumentation.checkStartActivityResult(Instrumentation.java:1568)
04-23 18:18:50.487: E/AndroidRuntime(17161): at android.app.Instrumentation.execStartActivity(Instrumentation.java:1439)
04-23 18:18:50.487: E/AndroidRuntime(17161): at android.app.Activity.startActivityForResult(Activity.java:3356)
04-23 18:18:50.487: E/AndroidRuntime(17161): at android.app.Activity.startActivityForResult(Activity.java:3317)
04-23 18:18:50.487: E/AndroidRuntime(17161): at android.support.v4.app.FragmentActivity.startActivityFromFragment(FragmentActivity.java:848)
04-23 18:18:50.487: E/AndroidRuntime(17161): at android.support.v4.app.Fragment.startActivity(Fragment.java:878)
04-23 18:18:50.487: E/AndroidRuntime(17161): at com.example.oshpedia.Fragment.Shelf$4.onItemClick(Shelf.java:142)
04-23 18:18:50.487: E/AndroidRuntime(17161): at it.sephiroth.android.library.widget.AdapterView.performItemClick(AdapterView.java:299)
04-23 18:18:50.487: E/AndroidRuntime(17161): at it.sephiroth.android.library.widget.AbsHListView.performItemClick(AbsHListView.java:972)
04-23 18:18:50.487: E/AndroidRuntime(17161): at it.sephiroth.android.library.widget.AbsHListView$PerformClick.run(AbsHListView.java:2511)
04-23 18:18:50.487: E/AndroidRuntime(17161): at it.sephiroth.android.library.widget.AbsHListView$1.run(AbsHListView.java:3200)
04-23 18:18:50.487: E/AndroidRuntime(17161): at android.os.Handler.handleCallback(Handler.java:615)
04-23 18:18:50.487: E/AndroidRuntime(17161): at android.os.Handler.dispatchMessage(Handler.java:92)
04-23 18:18:50.487: E/AndroidRuntime(17161): at android.os.Looper.loop(Looper.java:137)
04-23 18:18:50.487: E/AndroidRuntime(17161): at android.app.ActivityThread.main(ActivityThread.java:4882)
04-23 18:18:50.487: E/AndroidRuntime(17161): at java.lang.reflect.Method.invokeNative(Native Method)
04-23 18:18:50.487: E/AndroidRuntime(17161): at java.lang.reflect.Method.invoke(Method.java:511)
04-23 18:18:50.487: E/AndroidRuntime(17161): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789)
04-23 18:18:50.487: E/AndroidRuntime(17161): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:556)
04-23 18:18:50.487: E/AndroidRuntime(17161): at dalvik.system.NativeStart.main(Native Method)
【问题讨论】:
第一个例子应该可以。请发布完整的“ActivityNotFoundException”堆栈跟踪。 嗨,您有什么建议:通过 android 意图打开在线 pdf 文件?哪种方法最好 【参考方案1】:你可以像这样在 webview 中查看 pdf
WebView webView = (WebView) findViewById(R.id.webview);
webView.getSettings().setjavascriptEnabled(true);
webView.getSettings().setPluginsEnabled(true);
webView.loadUrl("https://docs.google.com/viewer?"+pdf_url);
【讨论】:
您好,感谢您的回答——对我帮助很大。但请注意,您的代码缺少 url 参数名称,即它应该是; webView.loadUrl("docs.google.com/viewer?url="+pdf_url); 我没有可用的预览 嗨,这里连同 URL 我需要传递输入参数然后我会得到 Pdf 链接 @JuturuYugandhar,这个解决方案有一个限制。它不能显示大的pdf。此线程包含有关此问题的答案:***.com/q/39866468/8192914【参考方案2】:您可以通过以下两种方式中的任何一种查看或下载 pdf,即在设备内置浏览器中打开它或通过将其嵌入到您的应用程序中的 web 视图中打开它。
要在浏览器中打开 pdf,
Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(pdf_url));
startActivity(browserIntent);
改为在 webview 中打开,
WebView webView = (WebView) findViewById(R.id.webView1);
webView.getSettings().setJavaScriptEnabled(true);
webView.loadUrl(pdf_url);
【讨论】:
@Tuhin Subhra 你如何解决网页不可用问题 webView.loadUrl() 不推荐使用 Google 文档,如此处所述。 ***.com/a/10861538/1177865 注意:是 WebView 而不是 Webview。 (从 android.webkit.WebView 导入)【参考方案3】:实际错误
android.content.ActivityNotFoundException: No Activity found to
handle Intent
act=android.intent.action.VIEW
dat=http://oshc.zizsoft.com/oshc_testing.pdf typ=application/pdf
这说明:
-
你“
broadcast
”并打算让系统尝试打开一个PDF
文件
系统未找到任何已注册能够处理此类文件的应用程序 (PDF
)
您只需要某种PDF viewer
。
解决方案
获取PDF reader
应用程序或使用@Mahendra 的解决方案。
【讨论】:
我已经安装了ezPDF阅读器,仍然报同样的错误【参考方案4】:您可以像这样在网页视图中查看 PDF
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(Uri.parse( "http://docs.google.com/viewer?url=" + pdfLink), "text/html");
startActivity(intent);
【讨论】:
当您的浏览器中没有谷歌帐户时,它不起作用。【参考方案5】:最佳做法是在开始之前将您的 Intent
包装成 Chooser
。它为用户提供了内置的应用程序选择对话框,让我们避免ActivityNotFoundException
这里有一个小例子:
Intent browserIntent = new Intent(Intent.ACTION_VIEW);
browserIntent.setDataAndType(Uri.parse(msg.getData()), Constants.MIME_PDF);
Intent chooser = Intent.createChooser(browserIntent, getString(R.string.chooser_title));
chooser.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); // optional
startActivity(chooser);
其中Constants.MIME_PDF
定义为字符串值“application/pdf”。
可以问PackageManager
这个Intent
有没有适当的处理Activity
。
public static boolean isActivityForIntentAvailable(Context context, Intent intent)
final PackageManager packageManager = context.getPackageManager();
List list = packageManager.queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY);
return list.size() > 0;
【讨论】:
这是一个很好的解决方案,因为它利用现有的应用程序来打开 pdf 文档,并且还让用户可以选择他喜欢的那个。如果没有安装任何“pdf阅读器”应用程序,不添加选择器会破坏应用程序。 简单而神奇。谢谢! 这对我有帮助。我有一个没有 pdf 名称的链接,当我们点击该 url 时生成了 pdf。在 webview 它最近停止显示。使用选择器方法,我能够显示 pdf。谢谢 这是一个很好的解决方案,但是当我使用谷歌驱动器的链接时,它不起作用。你能看看this question吗?【参考方案6】:从这里下载源代码 (Open Pdf from url in Android Programmatically)
MainActivity.java
package com.deepshikha.openpdf;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.ProgressBar;
public class MainActivity extends AppCompatActivity
WebView webview;
ProgressBar progressbar;
@Override
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
webview = (WebView)findViewById(R.id.webview);
progressbar = (ProgressBar) findViewById(R.id.progressbar);
webview.getSettings().setJavaScriptEnabled(true);
String filename ="http://www3.nd.edu/~cpoellab/teaching/cse40816/android_tutorial.pdf";
webview.loadUrl("http://docs.google.com/gview?embedded=true&url=" + filename);
webview.setWebViewClient(new WebViewClient()
public void onPageFinished(WebView view, String url)
// do your stuff here
progressbar.setVisibility(View.GONE);
);
【讨论】:
【参考方案7】:我看到您正在尝试这种定义数据类型的方法:
Intent intent = new Intent();
intent.setDataAndType(Uri.parse(url), "application/pdf");
startActivity(intent);
但它会导致:
ActivityNotFoundException: 找不到处理 Intent 的 Activity
使用没有类型定义的方法,它会完美地工作:
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse(url));
startActivity(intent);
【讨论】:
【参考方案8】:你可以试试这个。 它适用于 .pdf 和 .docx
String pdfUrl = "abc.pdf"; //
String url = "http://docs.google.com/gview?embedded=true&url=" + pdfUrl;
WebView webView = findViewById(R.id.webview_cv_viewer);
webView.getSettings().setSupportZoom(true);
webView.getSettings().setJavaScriptEnabled(true);
webView.loadUrl(url);
【讨论】:
【参考方案9】:kotlin 使用anko,只需调用
context.browse(PDF_URL)
要打开任何文档文件,您的浏览器会将您重定向到文档查看器应用程序。
如果您想使用 Google 文档,请将您的 pdf 网址附加为,
"http://docs.google.com/viewer?url=$PDF_URL"
【讨论】:
【参考方案10】:如果您使用 Intent,您将一直被定向到浏览器, 使用 PDFView Android Widget 在 Android 应用程序中查看 Pdf 假设您已经有 PDF Url 或 您可以使用 Intent 将 URL 传递给此活动
第 1 步:添加依赖项
implementation 'com.github.barteksc:android-pdf-viewer:3.1.0-beta.1'
implementation 'com.github.barteksc:android-pdf-viewer:2.8.2'
同步 Gradle
第 2 步:创建布局 [文本视图是可选的]
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_
android:layout_
tools:context=".ViewPdf">
<com.github.barteksc.pdfviewer.PDFView
android:id="@+id/ViewPdf"
android:layout_
android:layout_
/>
<TextView
android:id="@+id/txt"
android:layout_
android:layout_
android:visibility="invisible"
/>
</RelativeLayout>
第3步:这里是Activity.java文件代码,在代码中间添加URL到pdfUrl变量
package com.example.firebase;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.media.Image;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle;
import android.webkit.WebView;
import android.widget.TextView;
import android.widget.Toast;
import com.github.barteksc.pdfviewer.PDFView;
import java.io.BufferedInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
public class ViewPdf extends AppCompatActivity
private TextView txt; // You can remove if you don't want this
private PDFView pdf;
@Override
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_view_pdf);
pdf = findViewById(R.id.ViewPdf);
txt = findViewById(R.id.txt);
//Intent inten = getIntent();
String pdfUrl = "Add PDF url"
//Toast.makeText(this, pdfUrl, Toast.LENGTH_SHORT).show();
try
new RetrievePdfStream().execute(pdfUrl);
catch (Exception e)
Toast.makeText(this, "Failed to load Url :" + e.toString(), Toast.LENGTH_SHORT).show();
class RetrievePdfStream extends AsyncTask<String, Void, InputStream>
@Override
protected InputStream doInBackground(String... strings)
InputStream inputStream = null;
try
URL url = new URL(strings[0]);
HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
if (urlConnection.getResponseCode() == 200)
inputStream = new BufferedInputStream(urlConnection.getInputStream());
catch (IOException e)
return null;
return inputStream;
@Override
protected void onPostExecute(InputStream inputStream)
pdf.fromStream(inputStream).load();
第 4 步: 不要忘记更改/在上面的代码中提供 pdf url 以使其工作
【讨论】:
【参考方案11】:您可以使用 SkewPdfView 库从远程 url 加载 pdf。
首先,在你的根 build.gradle 中添加以下内容:
allprojects
repositories
...
maven url 'https://jitpack.io'
并将 SkewPdfView 库添加为:
dependencies
implementation 'com.github.naya-aastra:SkewPdfView:1.1'
现在在您的布局中包含 SkewPdfView:
<com.nayaastra.skewpdfview.SkewPdfView
android:id="@+id/skewPdfView"
android:layout_
android:layout_/>
以编程方式加载 PDF 文件:
SkewPdfView skewPdfView;
skewPdfView = findViewById(R.id.skewPdfView);
skewPdfView.loadPdf(pdfLink);
附: SkewPdfView 库的链接
SkewPdfView Github Page
【讨论】:
【参考方案12】:设备中的默认应用程序使用以下方法查看文档。 这里的 url 是文档的 url。
val browserIntent = Intent(
Intent.ACTION_VIEW,
Uri.parse(url)
)
(view.context as AppActivity).startActivity(browserIntent)
【讨论】:
【参考方案13】:你可以关注这个
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse(URL_HERE));
startActivity(intent);
【讨论】:
以上是关于通过android意图打开在线pdf文件?的主要内容,如果未能解决你的问题,请参考以下文章