笔者最近两个项目里头都有须要展现文件的功能,因而作了一番调研,发现asce1885给出一份方案,不过都是关于pdf的展现:www.jianshu.com/p/1bf49af65… 显然不符合笔者的要求,笔者的项目里须要展现的文件格式并不单一,后来通过一番搜索最后敲定使用腾讯的Tbs,能够在应用内打开各种型文件。不过这过程也有点坑。html
腾讯浏览服务(TBS,Tencent Browsing Service)整合腾讯底层浏览技术和腾讯平台资源及能力,提供总体浏览服务解决方案。TBS更多详细的介绍,请移步:x5.tencent.com/tbs/android
关于接入Tbs服务官网给出了接入文档:x5.tencent.com/tbs/guide/s… 很搞笑的是我找了好久也没有发现具备打开文件能力demo工程,官网sdk里头的demo工程竟然都没有展现文件功能,后来我发现官网论坛里有很多朋友留言,不知如何使用SdK打开文件,所以本文主要将的是如何使用SDK打开文件,以及对sdk打开文件的功能的简单封装。git
参考:x5.tencent.com/tbs/guide/s…github
下载 SDK jar 包放到工程的libs目录下bash
x5暂时不提供64位so文件,为了保证64位手机能正常加载x5内核,进行如下两项设置:
(1)打开对应module中的build.gradle文件,在文件的android{}中的defaultConfig{}里(若是没有defaultConfig{}则手动添加)添加以下配置: ndk{abiFilters "armeabi"}网络
显示文件关键代码,例如:ide
Bundle localBundle = new Bundle();
localBundle.putString("filePath", mFile.toString());
localBundle.putString("tempPath", Environment.getExternalStorageDirectory() + "/" + "TbsReaderTemp");
if (this.mTbsReaderView == null)
this.mTbsReaderView = getTbsReaderView(context);
boolean bool = this.mTbsReaderView.preOpen(getFileType(mFile.toString()), false);
if (bool) {
this.mTbsReaderView.openFile(localBundle);
}复制代码
TbsReaderView是封装的用于展现文件的View,继承与FramLayout,首先调用mTbsReaderView.preOpen(getFileType(mFile.toString()), false)进行文件打开以前的初始化工做,而后调用的mTbsReaderView.openFile(localBundle)打开文件,localBundle里包含有文件在本地的路径,加载文件步骤十分简单,其中的加载任务所有交由tbs内核完成。gradle
有时候可能须要加载网络文件,可是tbs目前是暂时不支持在线预览的,所以是须要使用网络将文件下载下来以后在展现,所以笔者这里对获取文件路径这一部分进行封装,以下:ui
public void show() {
if(mOnGetFilePathListener!=null){
mOnGetFilePathListener.onGetFilePath(this);
}
}
/***
* 将获取File路径的工做,“外包”出去
*/
public interface OnGetFilePathListener {
void onGetFilePath(SuperFileView2 mSuperFileView2);
}复制代码
TbsReaderView是上面的SuperFileView2的子View,完整使用以下:this
mSuperFileView = (SuperFileView2) findViewById(R.id.mSuperFileView);
//设置获取文件路径监听
mSuperFileView.setOnGetFilePathListener(new SuperFileView2.OnGetFilePathListener() {
@Override
public void onGetFilePath(SuperFileView2 mSuperFileView2) {
getFilePathAndShowFile(mSuperFileView2);
}
});
Intent intent = this.getIntent();
String path = (String) intent.getSerializableExtra("path");
if (!TextUtils.isEmpty(path)) {
TLog.d(TAG, "文件path:" + path);
setFilePath(path);
}
mSuperFileView.show();复制代码