开发工具:Android Studio Bumblebee | 2021.1.1 Patch 3 | Gradle Version 7.3 | plugin version 7.0.3
目录
按规矩先看效果
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 添加进入父类控件,用这个思路实现同一个界面加载浏览不同的文档。
重点和注意事项
- TbsReaderView是开启文件浏览的核心类,腾讯官方文档是没有写的,我还专门去查了;
- TbsReaderView建议通过动态创建,不要使用xml中引用;
- TBS目前只支持加载本地文件,所以远程文件必须先下载,再用TBS加载文件;
- 加载文件的界面,离开本界面之后务必销毁TbsReaderView,否则再次加载文件会一直卡在加载文件进度条上;停止代码:tbsReaderView.onStop();一般在onDestroy生命周期函数里调用。
开发最终要的是思路,其它的百度等搜索解决即可。
全靠记是记不完的,互联网帮我们记录重复的知识。