大部分app打开pdf文件是通过intent调起手机中能打开pdf文件的工具,来查看pdf文件,如果需求是,用户在app内下载好pdf文件后,不通过第三方的工具,本地打开。

这样的需求要怎么实现呢?上网查了一些资料,发现了一个很好用PDF开源库。
使用起来也很简单,首先添加PDFView的引用
compile 'com.github.barteksc:android-pdf-viewer:2.4.0'
布局中引用PdfView
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <include layout="@layout/common_title" /> <com.github.barteksc.pdfviewer.PDFView android:id="@+id/pdf_view" android:layout_width="match_parent" android:layout_height="match_parent" /> </LinearLayout>
接下来就是下载pdf文件,为了节省用户资源,在每次下载之前检查一下本地是否有该pdf文件,如果有直接打开,没有的话再去下载。
这里我写了一个加载中的对话框,打开过程中和下载过程中用的都是这一个
if (CheckFileExist(title)){
builderShow = new CustomDialog(ShowPDFActivity.this);
LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View view = inflater.inflate(R.layout.dialog_pdf_progress_new, null);
builderShow.setContentView(view);
builderShow.show();
isDownload=false;
refushUI();
}else {
isDownload=true;
DownLoadPDF.getInstance().downLoadPDF(ShowPDFActivity.this, //下载路径);
}
如果本地有pdf文件,则开始加载pdf文件,refushUI();
public void refushUI(){
try {
pdfView.fromFile(new File(//pdf文件的绝对路径,//标题))
.defaultPage(1)
.enableAnnotationRendering(false)
.onLoad(new OnLoadCompleteListener() {
@Override
public void loadComplete(int nbPages) {
if (isDownload){
DownLoadPDF.getInstance().closeDilaoig();
}
if (builderShow != null&&builderShow.isShowing()) {
builderShow.dismiss();
}
}
})
.scrollHandle(null)
.load();
}catch (Exception e){
e.printStackTrace();
}
}
PDFView加载pdf文件有两种形式,一种是从文件中读取,还有一种就是从assets目录中读取
private void displayFromAssets(String assetFileName ) {
pdfView.fromAsset(assetFileName) //设置pdf文件地址
.defaultPage(6) //设置默认显示第1页
.onPageChange(this) //设置翻页监听
.onLoad(this) //设置加载监听
.onDraw(this) //绘图监听
.showMinimap(false) //pdf放大的时候,是否在屏幕的右上角生成小地图
.swipeVertical( false ) //pdf文档翻页是否是垂直翻页,默认是左右滑动翻页
.enableSwipe(true) //是否允许翻页,默认是允许翻页
// .pages( 2 , 3 , 4 , 5 ) //把2 , 3 , 4 , 5 过滤掉
.load();
}
private void displayFromFile( File file ) {
pdfView.fromFile(file) //设置pdf文件地址
.defaultPage(6) //设置默认显示第1页
.onPageChange(this) //设置翻页监听
.onLoad(this) //设置加载监听
.onDraw(this) //绘图监听
.showMinimap(false) //pdf放大的时候,是否在屏幕的右上角生成小地图
.swipeVertical( false ) //pdf文档翻页是否是垂直翻页,默认是左右滑动翻页
.enableSwipe(true) //是否允许翻页,默认是允许翻
// .pages( 2 , 3 , 4 , 5 ) //把2 , 3 , 4 , 5 过滤掉
.load();
}
本地没有pdf文件,需要从服务端获取,
DownLoadPDF.getInstance().downLoadPDF(ShowPDFActivity.this, //下载路径);
public class DownLoadPDF {
private static Context context;
private static File file ;
private static CustomDialog builder = null ;
private static Handler ddhandle;
private static DownLoadPDF instance = null;
public static DownLoadPDF getInstance(){
if(instance==null){
synchronized (DownLoadPDF.class){
if(instance==null){
instance = new DownLoadPDF();
}
}
}
return instance;
}
public void downLoadPDF(final Context con, final String url, final String title, final Handler ddhandler) {
ddhandle = ddhandler;
context = con;
builder = new CustomDialog(con);
LayoutInflater inflater = (LayoutInflater) con.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View view = inflater.inflate(R.layout.dialog_pdf_progress_new, null);
builder.setContentView(view);
builder.show();
new Thread() {
@Override
public void run() {
try {
file = getFileFromServer(url,title);
sleep(200);
if (file != null) {
handler.sendEmptyMessage(2);
}
} catch (Exception e) {
e.printStackTrace();
builder.dismiss();
handler.sendEmptyMessage(-1);
}
}
}.start();
}
public void closeDilaoig(){
if (builder != null&&builder.isShowing()) {
builder.dismiss();
}
}public static int length ;
public static File getFileFromServer(String path,String title)
throws Exception {
// 如果相等的话表示当前的sdcard挂载在手机上并且是可用的
if (Environment.getExternalStorageState().equals(
Environment.MEDIA_MOUNTED)) {
URL url = new URL(path);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setConnectTimeout(5000);
conn.setDoInput(true);
conn.connect();
length = conn.getContentLength();
InputStream is = conn.getInputStream();
//将pdf文件存储在指定文件夹下
File filePath = new File(//指定文件夹路径);
if (!filePath.exists()){
filePath.mkdir();
}
File file = new File(filePath , title+".pdf");
FileOutputStream fos = new FileOutputStream(file);
BufferedInputStream bis = new BufferedInputStream(is);
byte[] buffer = new byte[1024];
int len;
while ((len = bis.read(buffer)) != -1) {
fos.write(buffer, 0, len);
handler.sendEmptyMessage(0);
}
fos.close();
bis.close();
is.close();
return file;
} else {
handler.sendEmptyMessage(-1);
return null;
}
}
private static Handler handler = new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what) {
case 0:
break;
case -1:
//下载失败
Toast.makeText(context, "下载失败,请稍后再试!", Toast.LENGTH_SHORT).show();
break;
case 2:
ddhandle.sendEmptyMessage(100);
break;
default:
break;
}
}
};
}
大家可以看到,在pdf问价下载成功的时候handler.sendEmptyMessage(2);,当case为2的时候,通过调用该工具类的页面传过来的ddhandle重新发送了一个消息,
调用界面收到消息后会重新调用refushUI();这个方法来打开pdf文件。
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持!
# android
# 加载本地pdf
# android加载pdf文件
# Android startActivityForResult实例详解
# Android在Fragment中实现监听触摸事件
# Android 使用FragmentTabhost代替Tabhost
# Android数据持久化之File机制分析
# Android数据持久化之Preferences机制详解
# Android利用FlexboxLayout轻松实现流动布局
# android手机端与PC端使用adb forword通信
# Android 中SwipeRefreshLayout与ViewPager滑动事件冲突解决方法
# Android 7.0行为变更 FileUriExposedException解决方法
# 翻页
# 加载
# 是从
# 都是
# 过滤掉
# 这一
# 文档
# 也很
# 可以看到
# 写了
# 再去
# 有两种
# 第三方
# 后会
# 送了
# 方法来
# 机上
# 在手
# 对话框
# 开源
相关文章:
网站制作培训多少钱一个月,网站优化seo培训课程有哪些?
如何通过NAT技术实现内网高效建站?
整人网站在线制作软件,整蛊网站退不出去必须要打我是白痴才能出去?
在线流程图制作网站手机版,谁能推荐几个好的CG原画资源网站么?
香港服务器网站搭建教程-电商部署、配置优化与安全稳定指南
佛山企业网站制作公司有哪些,沟通100网上服务官网?
建站主机CVM配置优化、SEO策略与性能提升指南
再谈Python中的字符串与字符编码(推荐)
官网自助建站平台指南:在线制作、快速建站与模板选择全解析
如何选择高效响应式自助建站源码系统?
C#如何使用XPathNavigator高效查询XML
C++如何将C风格字符串(char*)转换为std::string?(代码示例)
如何快速生成凡客建站的专业级图册?
武汉网站设计制作公司,武汉有哪些比较大的同城网站或论坛,就是里面都是武汉人的?
C++如何编写函数模板?(泛型编程入门)
娃派WAP自助建站:免费模板+移动优化,快速打造专业网站
详解jQuery中基本的动画方法
太原网站制作公司有哪些,网约车营运证查询官网?
建站主机选哪种环境更利于SEO优化?
如何用PHP工具快速搭建高效网站?
实例解析angularjs的filter过滤器
建站主机与虚拟主机有何区别?如何选择最优方案?
网站制作知乎推荐,想做自己的网站用什么工具比较好?
打鱼网站制作软件,波克捕鱼官方号怎么注册?
如何在IIS7中新建站点?详细步骤解析
油猴 教程,油猴搜脚本为什么会网页无法显示?
道歉网站制作流程,世纪佳缘致歉小吴事件,相亲网站身份信息伪造该如何稽查?
建站之星如何配置系统实现高效建站?
建站之星×万网:智能建站系统+自助建站平台一键生成
如何在宝塔面板创建新站点?
建站主机SSH密钥生成步骤及常见问题解答?
如何选择域名并搭建高效网站?
家族网站制作贴纸教程视频,用豆子做粘帖画怎么制作?
如何通过FTP空间快速搭建安全高效网站?
如何设计高效校园网站?
深圳网站制作设计招聘,关于服装设计的流行趋势,哪里的资料比较全面?
湖州网站制作公司有哪些,浙江中蓝新能源公司官网?
关于BootStrap modal 在IOS9中不能弹出的解决方法(IOS 9 bootstrap modal ios 9 noticework)
高防服务器:AI智能防御DDoS攻击与数据安全保障
南平网站制作公司,2025年南平市事业单位报名时间?
建站之星后台搭建步骤解析:模板选择与产品管理实操指南
建站之星伪静态规则如何正确配置?
建站主机默认首页配置指南:核心功能与访问路径优化
网站建设设计制作营销公司南阳,如何策划设计和建设网站?
高端云建站费用究竟需要多少预算?
建站之星上传入口如何快速找到?
jQuery 常见小例汇总
如何挑选优质建站一级代理提升网站排名?
c++ stringstream用法详解_c++字符串与数字转换利器
如何在阿里云虚拟服务器快速搭建网站?
*请认真填写需求信息,我们会在24小时内与您取得联系。