安卓加载展示PDF文件(腾讯X5内核(TbsReaderView)+PDFView)

最近项目要求加载、展示PDF文件,因为之前项目中已经有X5浏览器了,用X5内核加载PDF文件也简单,就很快写完。但是没想到,测试出来几个坑。这里总结整理下。

读写权限,必须要有

写在前面:引入PDFView,会让包的体积大几M;用其他的,我查了下,有各种问题:如水印加载不全、放大缩小不顺、超过3M的PDF文件就会OOM等。最后选择了PDFView

PDFView 的GitHub 地址

https://github.com/barteksc/AndroidPdfViewer

X5内核(TbsReaderView)+PDFView 实现PDF的加载,已经成功,并应用到项目中了

我的测试用PDF文件,找了3个:几百K、几兆、18M

全部源代码我会放在后面(关于项目包名的,我都去掉了,复制的时候,用自己需要的代码就好),我这里先说我踩的坑或因项目需求而产生的额外操作

项目要求:
1、在线加载,本地不保留PDF文件;
2、不做缓存。如:一个PDF文件有100页,当前打开看到50页,退出去,再次进来,加载完后,从第一页开始;
3、加载PDF文件正常(这点我单独写出来,是因为X5内核启动有问题,和这个“要求”冲突,后面会说)

实现项目要求办法:
1、TbsReaderView加载PDF,是把PDF先下载了,然后加载,但是项目要求本地不保留文件,我想到个折中方法:先下载展示,等退出界面的时候,删掉文件。
这里会有个问题:用户不退出呢?如果用户加载完界面,不杀死APP,直接切换到手机文件夹,就能找到PDF文件了。会有这个问题

2、我看了不少技术博客,没有提及清除PDF文件的,但是我在实现功能的过程中,看到了这个

//存放临时文件的目录。运行后,会在 
//Environment.getExternalStorageDirectory().getPath() 的目录下生成.tbs 的文件
bundle.putString(
	"tempPath",
	Environment.getExternalStorageDirectory().getPath()
)

然后我就找啊找,在文件夹的根目录下(因为后面没有加自定义文件夹的名字),找到了这个文件夹

.TbsReaderTemp包名

如:项目的包名是 com.chen.demo

这个文件夹的名字就是
.TbsReaderTempcom.chen.demo

在 .TbsReaderTemp包名 中,真有 .tbs 文件。进过测试(1、打开PDF文件,定位到某一页;2、退出界面;3、重新打开PDF文件,查看文件定位到的页数;4、重复1、2;5、切换到这个文件夹下;6、删除 .tbs 文件;7、回到APP,重新打开PDF文件,查看文件定位到的页数;8、和步骤3中的情况做对比),删除 .tbs 后,真的可以从第一页开始展示
注意:
(1)删掉这个临时文件,重新打开PDF文件时,会慢一点。这个需要自己恒量了。
(2).TbsReaderTemp包名 这个文件夹,在一些手机上,是不可见的。如:我的 华为mate20(安卓10、EMUI 10.1.0 )手机,就找不到,但是通过文件是否存在,可以判断出来

val s: String =
	"${Environment.getExternalStorageDirectory().getPath()}/.TbsReaderTemp包名/"
Log.e("s:",s)

val f: File = File(s)
if (f.exists()) {
	......
}

3、为了解决PDF的正确加载,我遇到了一个巨坑:X5内核,首次安装启动的时候,不一定会加载成功,如果加载失败 result 会变成false,即:tbsReaderView 无法加载PDF

 val result = tbsReaderView!!.preOpen("pdf", false)
 if (result) {
	//X5内核正常,可以直接展示PDF文件
	tbsReaderView!!.openFile(bundle)
}

我查了资料,也通过自己大量的卸载安装,得出下面的结论:
(1)手机上有腾讯类的产品(如:QQ、微信),可能会在手机上安装X5内核,如果有了内核,其他APP会共用;
(2)APP启动时,会调用

fun initX5Core() {

        QbSdk.setDownloadWithoutWifi(true)

        QbSdk.initX5Environment(this, object : QbSdk.PreInitCallback {
            override fun onCoreInitFinished() {
                Log.d("X5core", "x5加载结束")
            }

            override fun onViewInitFinished(p0: Boolean) {
                Log.d("X5core", "x5加载结束$p0")
            }
        })

}

如果是第一次安装启动,有可能 onViewInitFinished 的 p0 值是false,表示X5初始化、加载失败,会导致后面的 tbsReaderView 无法加载PDF文件;安装完APP后,从第二次启动APP开始,每次都是正常的
(3)和网络情况也有关系。如果第一次安装、启动,是在WIFI情况下,onViewInitFinished 小概率会 p0 = false,如果是流量情况下 大概率 p0 = false
(4)在 result = false 时

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值