android webview打开pdf文件
1.下载之后打开
思路如下:
if(本地没有该文件)
下载+打开
else打开
这段代码需要在WebViewClient的shouldOverrideUrlLoading进行拦截:
WebViewClient client = new WebViewClient() {/*** 防止加载网页时调起系统浏览器*/@Overridepublic boolean shouldOverrideUrlLoading(WebView view, String url) {try {if(url.endsWith(".pdf")){//进行下载等相关操作return true;}} catch (Exception e) {e.printStackTrace();}view.loadUrl(url);return true;}@Overridepublic void onReceivedHttpAuthRequest(WebView webview, com.tencent.smtt.export.external.interfaces.HttpAuthHandler httpAuthHandlerhost, String host, String realm) {}@Overridepublic void onPageStarted(WebView view, String url, Bitmap favicon) {}@Overridepublic void onPageFinished(WebView view, String url) {}};webview.setWebViewClient(client);
因为写的时候是已经封装过的,没办法展示,思路是这个思路,或者可以直接打开文件,系统会自动提示你下载,只不过下载位置就不一定了。。。所以也没办法在下载完打开。
打开系统下载
Intent intent = new Intent();intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);intent.setAction(Intent.ACTION_VIEW);intent.setDataAndType(Uri.parse("http:"), "application/pdf");act.startActivity(intent);
自己下载后打开
Intent intent = new Intent();intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);intent.setAction(Intent.ACTION_VIEW);intent.setDataAndType(Uri.fromFile(filename), "application/pdf");act.startActivity(intent);
方法2.使用控件,在新的activity中打开(或者也可以在同一个界面,直接隐藏webview,不过这种情况需要处理返回键)
资源地址:https://github.com/barteksc/AndroidPdfViewer
当然,我写这种demo没有,所以也贴一下代码:
导入:
compile 'com.github.barteksc:android-pdf-viewer:2.8.2'
PdfActivity.java:
public class PdfActivity extends MyTitleActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_pdf);setTitleBarTitleText("文件内容");new AsyncTask<String, Void, InputStream>() {@Overrideprotected InputStream doInBackground(String... strs) {URL url = null;try {url = new URL(strs[0]);HttpURLConnection connection = (HttpURLConnection)url.openConnection();connection.setRequestMethod("GET");//试过POST 可能报错connection.setDoInput(true);connection.setConnectTimeout(10000);connection.setReadTimeout(10000);//实现连接connection.connect();if (connection.getResponseCode() == 200) {InputStream is = connection.getInputStream();//这里给过去就行了return is;}} catch (MalformedURLException e) {e.printStackTrace();} catch (ProtocolException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}return null;}@Overrideprotected void onPostExecute(InputStream inputStream) {super.onPostExecute(inputStream);PDFView pdfView = (PDFView) findViewById(R.id.pdfView);pdfView.fromStream(inputStream).enableSwipe(true).swipeHorizontal(false).enableDoubletap(true).defaultPage(0).onPageScroll(new OnPageScrollListener() {@Overridepublic void onPageScrolled(int page, float positionOffset) {}}).onError(new OnErrorListener() {@Overridepublic void onError(Throwable t) {Toast.makeText(getApplicationContext(), "error", Toast.LENGTH_SHORT).show();}}).enableAnnotationRendering(false).password(null).scrollHandle(null).load();}}.execute(getIntent().getStringExtra("url"));}
}
这里需要前一个界面把url传进来:
intent.putExtra("url","xx");
xml:
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout android:layout_width="match_parent"android:layout_height="match_parent"xmlns:android="http://schemas.android.com/apk/res/android"><com.github.barteksc.pdfviewer.PDFView xmlns:android="http://schemas.android.com/apk/res/android"android:id="@+id/pdfView"android:layout_width="match_parent"android:layout_height="match_parent" />
</FrameLayout>
3.使用js进行加载
https://github.com/zhoukai1526/ReadPdf/blob/master/app/src/main/java/com/iwintrue/readpdf/MainActivity.java
具体就是这个网址下载的方式了,给的demo不是很好,换个pdf网址就不行了。
相应博客地址:https://blog.csdn.net/zach_zhou/article/details/55518367
不过确实也是一种思路,如果要用建议用pdfobject,官网在:https://pdfobject.com/
附录:使用js方式基本配置:
(1)webview配置
WebSettings webSettings = mWebView.getSettings();// 设置与Js交互的权限webSettings.setJavaScriptEnabled(true);mWebView.addJavascriptInterface(new AndroidtoJs(), "test");
public class AndroidtoJs extends Object {// 定义JS需要调用的方法// 被JS调用的方法必须加入@JavascriptInterface注解@JavascriptInterfacepublic void hello(String msg) {System.out.println("JS调用了Android的hello方法");}
}
(2)android调用js:
js方法(网页内):
function callJS(){alert("Android调用了JS的callJS方法");}
android调用:
mWebView.loadUrl("javascript:callJS()");
(3)js调用java
js方法:
function callAndroid(){// 由于对象映射,所以调用test对象等于调用Android映射的对象,此处和addJavascriptInterface最后一个字符串同名test.hello("js调用了android中的hello方法");}
如果确定用这种方式和公共网页交互也可以使用webviewjavasciptbridge,可以兼容苹果和android,当然如果是用于打开pdf是用不到的。
这里总结一下各种方法的优缺点:
1.下载打开
缺点需要下载到本地(需要一点时间,随着打开文件增多,会占用更多手机存储空间),手机必须有能打开pdf的软件,否则看不到。用户体验略差。
优点不会增加apk大小,不需要尽心额外配置。
2.apk内部打开
缺点占用大,大约要4.4M,相当于应用内部装了个pdf解析软件。
优点:不需要占用更多的手机存储空间,不需要进行文件下载,用户体验好,兼容性好。
3.用js交互方式
缺点:开发者必须要具备js交互的知识,因为是采用js控件的形式,可能会导致一定的兼容问题(这个没有经过测试,不知道兼容性如何),加载速度会比apk内部打开的速度要慢。
优点:既不会占用内存,也不会增大apk包大小(也会增大一个js文件一个html),如果显示没有问题,体验会非常好。
android webview打开pdf文件相关推荐
- android webView显示PDF文件
最近公司开发的应用需要使用webview显示PDF格式的合同文件,因为后台返回的是一个PDF文件的的下载路径,用浏览器是可以直接打开查看的.起初我以为webview应该也能直接解析查看,毕竟强大如Go ...
- android webview打开pdf 的两种方式
方法1:利用设备自带浏览器打开pdf private void loadPDF1(){ mWebView.getSettings().setJavaScriptEnabled(true); mWebV ...
- Android用PdfRenderer类开发打开pdf文件的功能
PdfRenderer是Android官方用于开发打开pdf文件功能的类,今天介绍一下它的最基本的使用.Android官方有一个相关的Sample,项目名是PdfRendererBasic,大家也可以 ...
- Android下载并打开PDF文件
1.下载PDF文件到本地 private void downFile(){String urlString = "http://14.215.72.79/file3.data.weipan. ...
- android webview打开相册,Android webView不能响应h5打开相册的操作
做android聊天时,遇到过一个问题,h5的页面发送的图片在android端不能响应,ios那边一路畅通.也是相当无奈,目前发现了好多android端与ios端webView的异同. android ...
- 如何用WebView打开pdf链接
Android的WebView是无法直接打开pdf链接的,即使用浏览器打开,也会提示下载pdf文件. 而ios的浏览器是可以打开pdf链接的,具体原因我也不知道- - 好在Google提供了一个chr ...
- android 上传pdf文件,Android 加载PDF文件
今天按项目要求找了一个android的PDF控件,各种操作效果都非常好,在这里和大家分享一下. 用法很简单: 1.在build.gradle里面添加依赖 compile 'com.github.bar ...
- android用于打开各种文件的intent
import android.app.Activity; import android.content.Intent; import android.net.Uri; import andro ...
- 使用第三方应用打开pdf文件
/*** android获取一个用于打开PDF文件的intent** @param path 要打开的文件的绝对路径* @return*/public Intent getPdfFileIntent( ...
- Android 加载pdf文件
今天来总结一下加载pdf文件. 加载pdf有好多办法, 一:使用webview来加载. mWebView.loadUrl("http://docs.google.com/gviewembed ...
最新文章
- doxygen 注释规范_编程规范 - doxygen注释规范示例(C++)
- 使用xshell SSH远程连接 linux
- 人工神经网络-2020-第十四周-人工神经网络硬件实现-备课
- (五)我的JavaScript系列:JavaScript的糟粕
- 对比几个数据概念,数据仓库、数据集市、数据湖、数据中台分别是什么?到底有什么区别?都得做吗?
- 1.1图像处理的概念
- 安装docker遇到的坑 Could not resolve host: download.docker.com;
- linux 脚本 列表,shell -脚本 给出多个数据列表 执行任务
- 天国近了(一) -- 揭穿OOP神话
- Linux firewall防火墙详解(一)——firewall基础知识简介
- 遗传算法原理与应用详解
- 在DW中如何让代码对齐?
- BLE蓝牙的连接和配对过程
- a1a2b1b2c1c2语言级别区分,西班牙语 | 西班牙语的等级是怎么划分的?(A1/A2、B1/B2、C1/C2)...
- 利用机器学习算法挖掘群控网络黑产设备
- 次坐标从0开始_三坐标测量机安全使用+量块校准操作规程
- windows系统常量
- 基于polar码和SCMA的多用户检测的联合检测译码matlab仿真,polar采用SCAN软译码,SCMA用MPA算法
- mysql数据库建库建表
- UI设计师需要掌握的移动APP设计技巧
热门文章
- 清空分区linux,Linux使用fdisk删除分区详解
- 证件照(1寸2寸)拍摄处理知识汇总
- as常用固定搭配_英语常用固定搭配
- 阿里云免费证书SSL下载及安装
- http://localhost:8080/login的密码和账号的问题
- Linux 内核通知链(notifier chain)原理和使用方法
- 获得代理ippython_Python3.x:免费代理ip的批量获取并入库
- 微信公众号开通留言功能条件有哪些?
- php excel 高度,PHPExcel,自动调整行高
- Internet网络行为学