虽然使用POI库可以解析并显示Office文档,但这需要开发者自己搭个服务器,确实多有不便。倘若只是简单的浏览文档内容,完全可以利用第三方的开发包直接渲染,比如腾讯的TBS服务(全称Tencent Browser Service,即腾讯浏览服务)。通过集成TBS服务,App能够直接打开下列文件格式:doc、docx、ppt、pptx、xls、xlsx、pdf、txt、epub,可谓中小开发者的一大福音。 TBS官网的接入说明网址为https://x5.tencent.com/docs/access.html,下面也简要介绍一下如何在App中快速集成TBS服务。 首先打开App模块的build.gradle,往dependencies节点添加下列配置,表示导入TBS工具库:
代码语言:javascript复制implementation 'com.tencent.tbs:tbssdk:44153'
接着修改AndroidManifest.xml,补充以下的网络权限和存储卡权限配置:
代码语言:javascript复制<!-- 上网 -->
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<!-- 存储卡 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
当然不要忘了给application节点加上如下属性,表示继续使用HTTP明文地址:
代码语言:javascript复制 android:usesCleartextTraffic="true"
还要补充下面的provider配置,以便TBS联网下载工具组件。
代码语言:javascript复制 <!-- 使用TBS浏览文档需要 -->
<provider
android:name="com.tencent.smtt.utils.FileProvider"
android:authorities="${applicationId}.provider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/x5_file_paths" />
</provider>
然后编写自定义的Application代码,例如MainApplication,同时往AndroidManifest.xml的application节点加上如下属性,表示采用自定义的Application。
代码语言:javascript复制 android:name=".MainApplication"
这个自定义的Application用于初始化TBS内核,以及基础参数设置,初始化代码示例如下:
代码语言:javascript复制private boolean isLoadTBS = false; // 是否成功加载
// 初始化TBS组件
public void qbSdkInit() {
if (isLoadTBS) { // 如果已经成功加载过,就不必重复加载了
return;
}
QbSdk.setDownloadWithoutWifi(true); //非WiFi情况下,主动下载TBS内核
// 搜集本地TBS内核信息并上报服务器,服务器返回结果决定使用哪个内核。
QbSdk.PreInitCallback cb = new QbSdk.PreInitCallback() {
@Override
public void onViewInitFinished(boolean isX5Core) {
isLoadTBS = isX5Core; // 为true表示内核加载成功
}
@Override
public void onCoreInitFinished() {}
};
// TBS内核初始化
QbSdk.initX5Environment(getApplicationContext(), cb);
// 以下设置会将Dex文件转为Oat的过程加以优化
HashMap<String, Object> map = new HashMap<String, Object>();
map.put(TbsCoreSettings.TBS_SETTINGS_USE_SPEEDY_CLASSLOADER, true);
map.put(TbsCoreSettings.TBS_SETTINGS_USE_DEXLOADER_SERVICE, true);
QbSdk.initTbsSettings(map); // 初始化TBS设置
}
特别注意,下载TBS组件需要完整的存储卡权限,不仅要提前申请存储的访问权限,还要在运行时获得动态授权才行。这意味着:上述初始化代码的qbSdkInit方法,只有在App被授予存储卡权限后才能运作。故而只在MainApplication中调用qbSdkInit方法并不保险,还需在存储卡动态授权之后再执行一遍,确保TBS组件能够正常加载。 以上初始化步骤都完成之后,接下来就能在App中浏览常见的文档啦。TBS提供了专门的阅读器视图TbsReaderView,调用阅读器对象的openFile方法,即可在界面上渲染文档内容。下面是使用TbsReaderView浏览文档的代码例子:
代码语言:javascript复制// 在阅读器视图中浏览文档
private void openFileInner(Context context, String filePath) {
closeReader(); // 关闭阅读器
rl_document.removeAllViews(); // 移除相对布局下的所有视图
mReaderView = new TbsReaderView(this, (i1, o1, o2) -> {});
RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(
RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.MATCH_PARENT);
mReaderView.setLayoutParams(params);
rl_document.addView(mReaderView); // 往相对布局上添加阅读器视图
String extension = filePath.substring(filePath.lastIndexOf(".") 1);
Bundle bundle = new Bundle();
bundle.putString("filePath", filePath); // 指定文件路径
// 指定文件缓存路径
bundle.putString("tempPath", getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS).toString() "/tbsfile");
// 预加载,判断格式是否正确,其中的parseFile方法是获取文件后缀
boolean result = mReaderView.preOpen(extension, false);
if (result) { // 文件格式正确
mReaderView.openFile(bundle); // 在阅读器视图中打开文档
} else { // 文件格式错误
Toast.makeText(this, "不支持该类型的文档", Toast.LENGTH_SHORT).show();
}
}
// 关闭阅读器
private void closeReader() {
if (mReaderView != null) {
mReaderView.onStop(); // 阅读器视图停止工作
}
}
运行测试App,到存储卡选择某个Word文档,回到浏览界面如下图所示。
再到存储卡选择某个Excel文档,回到浏览界面如图下图所示。
可见利用TBS成功加载并显示了常见的Office文档。