Android开发集成最新版本TBS实现pdf、work、excel等文档在同一个界面切换不同类型文件显示功能

开发工具:Android Studio Bumblebee | 2021.1.1 Patch 3 | Gradle Version 7.3 | plugin version 7.0.3

目录

按规矩先看效果

TBS介绍

功能实现步骤

集成Tbs库

X5WebViewApp工具类核心代码

 在MyApplication引用

AndroidManifest.xml清单操作

权限获取

application里重要操作

文件paths的xml文件配置

同一个界面切换不同类型文件加载的核心代码

加载文档函数

关闭并销毁函数

核心思路

重点和注意事项


按规矩先看效果

TBS介绍

腾讯TBS完全可以代替原生WebView,效率更高,功能更强大,非常重要的是可以规避很多特殊网络各种异常情况

可以看各种文档:doc、docx、ppt、pptx、xls、xlsx、pdf、txt、epub

可以看视频图片功能强大稳定。

 官网地址下载sdk和查看文档  腾讯浏览服务-接入文档

我使用的库:腾讯的tbs最新版本库版本v4.3.0.281_44181-Android文档类资源-CSDN下载

功能实现步骤

集成Tbs库

方法1:导入最新的tbs库

 方法2:在app里的build.gradle加入库

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

X5WebViewApp工具类核心代码

//手动下载x5内核
    TbsDownloader.startDownload(context);
//设置非wifi条件下允许下载X5内核
    QbSdk.setDownloadWithoutWifi(true);
    QbSdk.setTbsListener(new TbsListener() {
    @Override
    public void onDownloadFinish(int i) {
    }
    @Override
    public void onInstallFinish(int i) {
    }
    @Override
    public void onDownloadProgress(int i) {
        System.out.println("正在下载:" + i);
    }
});
//搜集本地tbs内核信息并上报服务器,服务器返回结果决定使用哪个内核。
QbSdk.PreInitCallback cb = new QbSdk.PreInitCallback() {
    @Override
    public void onViewInitFinished(boolean arg0) {
        //x5內核初始化完成的回调,true表x5内核加载成功,否则表加载失败,会自动切换到系统内核。
        Log.d("app", " 内核加载 " + arg0);
        TBSState = arg0;
    }
    @Override
    public void onCoreInitFinished() {
    }
};
//x5内核初始化接口
    QbSdk.initX5Environment(context, 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设置

 在MyApplication引用

在自己集成的Application里编写初始化代码

public void onCreate() {
		super.onCreate();
		appInstance = this;
		new X5WebViewApp().initX5app(getApplicationContext());
}

AndroidManifest.xml清单操作

权限获取

需要的网络权限和存储卡权限配置:

<!-- 上网 -->
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE" />
<!-- 存储卡 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
 <!-- 硬件加速对X5视频播放非常重要,建议开启 -->
<uses-permission android:name="android.permission.GET_TASKS" />

application里重要操作

<provider
    android:name="com.tencent.smtt.utils.FileProvider"
    android:authorities="${applicationId}"
    android:exported="false"
    android:grantUriPermissions="true">
    <meta-data
        android:name="android.support.FILE_PROVIDER_PATHS"
        android:resource="@xml/x5_webview_file_paths" />
</provider>
<service
    android:name="com.tencent.smtt.export.external.DexClassLoaderProviderService"
    android:label="dexopt"
    android:process=":dexopt" />

文件paths的xml文件配置

创建xml文件夹,然后在加入文件x5_webview_file_paths.xml

<?xml version="1.0" encoding="utf-8"?>
<paths>
    <external-path name="sdcard" path="."/>
</paths>

同一个界面切换不同类型文件加载的核心代码

加载文档函数

binding.viewLl:是我的一个父控件,你们可以根据自己的需求定

TbsReaderView mReaderView;
// 在阅读器视图中浏览文档
    private void openFileInner(Context context, String filePath) {
        closeReader(); // 关闭阅读器
        binding.viewLl.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);
        binding.viewLl.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() + "/TbsReaderTemp");
        // 预加载,判断格式是否正确,其中的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(); // 阅读器视图停止工作
        }
    }

核心思路

使用完后销毁TbsReaderView 再次使用就重新创建TbsReaderView 添加进入父类控件,用这个思路实现同一个界面加载浏览不同的文档。

重点和注意事项

  1. TbsReaderView是开启文件浏览的核心类,腾讯官方文档是没有写的,我还专门去查了;
  2. TbsReaderView建议通过动态创建,不要使用xml中引用;
  3. TBS目前只支持加载本地文件,所以远程文件必须先下载,再用TBS加载文件;
  4. 加载文件的界面,离开本界面之后务必销毁TbsReaderView,否则再次加载文件会一直卡在加载文件进度条上;停止代码:tbsReaderView.onStop();一般在onDestroy生命周期函数里调用。

开发最终要的是思路,其它的百度等搜索解决即可。

全靠记是记不完的,互联网帮我们记录重复的知识。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

PYB3

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值