为什么需要在Android应用内打开PDF、Word、Excel等文档?
由于公司项目有一部分功能是能观看新闻,但是这些新闻的内容并不都是一个HTML或者链接直接可以使用Android WebView直接打开,而是这些新闻详情中含有各种类型的文档都存在比如:PDF、Word、Excel等等文档。由于之前赶项目的时候,处理方式是直接调用系统浏览器下载查看,项目快完结时,公司老大说我们需要将我们的新闻在我们自己的应用内部打开,这样显得我们专业,而且友好,让我们去想个方案,至此需求就出来。
我相信Android 开发的都是想打人的,为啥IOS直接使用系统WebView就能直接打开所有文档,而我们就不行。这话说来就要怪Google爸爸了,Google爸爸其实是有方案解决,就是使用Google Service。但是由于国内的网络原因,所以这种方法只能放弃了。
我相信这个可能有很多的解决方法,但是我这是只是记录一下我自己的解决方法,如果还有更好的方法,还希望各位给我指出,感谢。
先看看我的实现效果图:
解决方法
我这里是使用腾讯的TBS内核,来替换掉Android 原生的WebView。至于为什么使用X5内核呢?理由有几点:
腾讯大佬的东西(虽然讨论区还是有些BUG,但是不影响大局)
微信、QQ都是使用的TBS内核
使用的TBS内核的人多,讨论区热闹,有很多的解决方案。
TBS内核优点:
1. TBS(腾讯浏览服务)的优势
1) 速度快:相比系统webview的网页打开速度有30+%的提升;
2) 省流量:使用云端优化技术使流量节省20+%;
3) 更安全:安全问题可以在24小时内修复;
4) 更稳定:经过亿级用户的使用考验,CRASH率低于0.15%;
5) 兼容好:无系统内核的碎片化问题,更少的兼容性问题;
6) 体验优:支持夜间模式、适屏排版、字体设置等浏览增强功能;
7) 功能全:在Html5、ES6上有更完整支持;
8) 更强大:集成强大的视频播放器,支持视频格式远多于系统webview;
9) 视频和文件格式的支持x5内核多于系统内核
10) 防劫持是x5内核的一大亮点
2. 运行环境
1)手机ROM版本高于或等于2.2版本
2)手机RAM大于500M,该RAM值通过手机 /proc/meminfo 文件的MemTotal动态获取
注:如果不满足上述条件,SDK会自动切换到系统WebView,SDK使用者不用关心该切换过程。
3. SDK尺寸指标
1)SDK提供的JAR包约250K
不想听我啰嗦的可以直接戳这里:
TBS内核的文件能力
APP在接入文件服务后,即可支持主流9种格式。升级文件服务后,可支持46种文件格式。
接入TBS
如果不想看我写的,可以直接看官网的接入流程。可以直接戳下面的链接直接看官网的SDK接入流程:TBS接入官网
1、导入Jar包
官网下载好Android Studio接入示例,将TBS jar包放入libs文件夹下面如图:
申请必要的权限:
<uses-permission android:name="android.; />
<uses-permission android:name="android.; />
<uses-permission android:name="android.;/>
<uses-permission android:name="android.;/>
<uses-permission android:name="android.;/>
<uses-permission android:name="android.;/>
2、初始化TBS
一般TBS的X5内核初始化是放在Application中进行,如图是我的项目中初始化地方:
下面是系统WebView的类和tbs内核的类的区别:
tbs的内核的类名和系统的基本一致,而且使用方法也是一致,这里就不赘述了。
3、64位手机
这个是TBS官网的解释:
x5内核暂时不提供64位的so文件,在64位手机上需要让APP以32位模式运行。具体操作如下:
1.如果使用是Eclipse则需要将所有的.so文件都放置在so加载目录:lib/armeabi文件夹下(没有该目录则新建一个,AP中没有使用到.so文件则需要拷贝任意一个32位的so文件到该目录下,如果没有合适的so可以到官网下载官网“SDK接入示例“,拷贝对应目录下的liblbs.so文件),lib文件夹下不要有其他以”armeabi“开头的文件夹。
2.如果使用的是 Android studio则需要进行两项配置,
(1)打开对应module中的build.gradle文件,在文件的android{}中的defaultConfig{}里(如果没有defaultConfig{}则手动添加)添加如下配置: ndk{abiFilters “armeabi”},如果配置后编译报错,那么需要在gradle.properties文件中加上Android.useDeprecatedNdk=true;
(2)找出build.gradle中配置的so加载目录:jniLibs.srcDir:customerDir,如果没有该项配置则so加载目录默认为:src/main/jniLibs,需要将.so文件都放置在so加载目录的armeabi文件夹下(没有该目录则新建一个,AP中没有使用到.so文件则需要拷贝任意一个32位的so文件到该目录下,如果没有合适的so可以到官网下载官网“SDK接入示例“,拷贝对应目录下的liblbs.so文件),so加载目录下不要有其他以”armeabi“开头的文件夹。
我就用我的接入的图片说明:
1.添加32位的so库
这个liblbs.so文件可以是任意的32位的so文件,我们一般自己难得去找,或者你有现成的更好,这里我直接拷贝示例里面的:
2.在 a 文件中对 libs 目录中 jar 文件的依赖
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
}
3.**需要注意的是:**TBS 目前只提供 armeabi 类型 CPU 架构的 so 库。当然,也可以将 so 文件放置于 libs 目录下,只不过需要在 a 中额外修改 so 文件依赖配置:
sourceSets {
main {
jniLibs.srcDirs = ['libs']
}
}
那么我们要怎么确认是否这个TBS的X5内核已经加载成功了呢?
如下图,当你长按选择复制的时候出现下面的蓝色水滴状就表示tbs的X5内核加载成功:
4、下载文件到本地
下载文件到本地,我们就使用系统的http请求来下载文件,假如你开发中用的Okhttp或者其他的网络框架,直接使用网络框架下载就好了。代码如下:
5、TbsReaderView加载文件
创建TbsReaderView:
/**
* 下载文件并使用TBS打开文件
** @param url 下载的路径
* @param fileName 保存的文件的名字
* @param fileType 我们需要打开的文件的类型 word类型 doc excel类型xls pdf类型 pdf等等,这个可以在官网上查
* @throws IOException
*/private void downLoadFile(URL url, String fileName, String fileType) throws IOException {
new Thread(new Runnable() {
@Overridepublicvoidrun() {
try {
final HttpURLConnection connection = (HttpURLConnection) url.openConnection();
//获取总的文件大小
connec("GET");
//试过POST 可能报错
connec(true);
connec(10000);
connec(10000);
//实现连接
connec();
if () == 200) {
//获取内容长度int contentLength = connec();
inputStream = connec();
File dir = mCon);
file = new File(dir, fileName);
if ()) {
();
}fileOutputStream = new FileOutputStream(file);
byte[] bytes = newbyte[1024];
int tempLen;
long totalReaded = 0;
while ((tempLen = in(bytes)) != -1) {
// bytes[index]= (byte) temp_Len;// index++;
totalReaded += tempLen;
finalint progress = (int) (totalReaded * 100 / contentLength);
mCon(() -> binding.(progress));
(bytes, 0, tempLen);}
}
} catch (Exception e) {
Logger.e("文件下载异常");
} finally {
if (fileOutputStream != null) {
try {
fileOu();
} catch (IOException e) {
e.printStackTrace();
}
}
if (inputStream != null) {
try {
in();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
});
}
Activity 中实现 ReaderCallback 接口,并通过 Java 代码动态创建 TbsReaderView 对象,将其添加到 content view 当中。
实现ReaderCallback 接口,重写方法:
暂不知这个方法有什么用,我也没使用到,所以未深究。
可能你会有疑惑,为什么不将 TbsReaderView 放在 layout 布局文件中,而是在代码中手动 add 进去。经测试,这么做会报错,提示找不到这个类。然后我们查看 TbsReaderView 源码,发现只有这么一个构造函数:
最后一步传入参数,打开文件即可:
说明下这里的fileType是一个字符串类型的,其实就是文件的后缀名,例如Word类型的是“doc” 、 PDF的类型是“pdf”,一般可以通过url来截取到类型。
总结
Android 应用中打开文件,上面只是我个人的项目使用的方法,当然还有其他的方法。欢迎大家都去尝试,其实一般这种按照官网的文档来做是没有什么问题的,但是说实话文档还是有点简陋,只有自己动手去做才比较清楚。还有点就是告诉大家:tbs的X5内核还是有问题的,并不是说腾讯的都没问题,可以去tbs的讨论区看看都有哪些问题,然后根据这些问题,确定自己的项目是否适合使用。
原创不易,如果觉得写得好,关注一下点个赞,是我最大的动力。
1.文章《“doc文件怎么打开“如何将docx转为word格式!》援引自互联网,为网友投稿收集整理,仅供学习和研究使用,内容仅代表作者本人观点,与本网站无关,侵删请点击页脚联系方式。
2.文章《“doc文件怎么打开“如何将docx转为word格式!》仅供读者参考,本网站未对该内容进行证实,对其原创性、真实性、完整性、及时性不作任何保证。
相关推荐
- . 现代买票为什么带上携程保险
- . 潮阳怎么去广州南站
- . 湖南马拉河怎么样
- . 烧纸为什么到三岔路口
- . 百色为什么这么热
- . 神州租车怎么样
- . 芜湖方特哪个适合儿童
- . 护肤品保养液是什么类目
- . 早晚的护肤保养有哪些项目
- . 女孩护肤品怎么保养的最好