0
点赞
收藏
分享

微信扫一扫

Android开发笔记(一百八十四)利用TBS浏览各种文档

海牙秋天 2022-04-14 阅读 34

 虽然使用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工具库:

implementation 'com.tencent.tbs:tbssdk:44153'

接着修改AndroidManifest.xml,补充以下的网络权限和存储卡权限配置:

<!-- 上网 -->
<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明文地址:

    android:usesCleartextTraffic="true"

还要补充下面的provider配置,以便TBS联网下载工具组件。

    <!-- 使用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。

    android:name=".MainApplication"

这个自定义的Application用于初始化TBS内核,以及基础参数设置,初始化代码示例如下:

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浏览文档的代码例子:

// 在阅读器视图中浏览文档
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文档。


点此查看Android开发笔记的完整目录

举报

相关推荐

0 条评论