Office文件在app内部打开,相信大家一搜这个问题很多都是腾讯的TBS,而腾讯的TBS文档写的比TM屎还要臭,然后我就在各种论坛上寻找打开office的方法,折磨了我三天最终在最后一天选择放弃TBS,也彻底把我整崩溃了,终于在周一上班的时候搞出来了,接下来给大家详细讲解一下TBS的使用。
第一步:下载TBS的SDK:
https://x5.tencent.com/tbs/sdk.html
第二步:引用到Android工程中:
implementation files(‘libs/tbs_sdk_thirdapp_v4.3.0.375_44275_sharewithdownloadwithfile_withoutGame_obfs_20230104_145521.jar’)
ndk {
// abiFilters "armeabi-v7a"
abiFilters 'armeabi', "armeabi-v7a", 'x86'
}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TNSuegHI-1680272868248)(file:///C:/Users/swh/AppData/Local/Temp/msohtmlclip1/01/clip_image002.jpg)]
第三步清单文件配置:
然后在res文件夹下创建一个xml文件 文件命名为:x5webview_file_paths.xml和provide_file_paths.xml
x5webview_file_paths.xml:
<?xml version="1.0" encoding="utf-8"?>
<paths>
<external-path name="sdcard" path="." />
<external-path name="storage" path="." />
</paths>
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CyNoLatw-1680272868249)(file:///C:/Users/swh/AppData/Local/Temp/msohtmlclip1/01/clip_image004.jpg)]
provide_file_paths.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<paths>
<external-path path="" name="sdcard"/>
</paths>
</resources>
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-h3AwmwyN-1680272868250)(file:///C:/Users/swh/AppData/Local/Temp/msohtmlclip1/01/clip_image006.jpg)]
权限
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" /> <!-- 在SDCard中创建与删除文件权限 -->
<uses-permission
android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"
tools:ignore="ProtectedPermissions" />
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bhqarHQ5-1680272868251)(file:///C:/Users/swh/AppData/Local/Temp/msohtmlclip1/01/clip_image008.jpg)]
<service
android:name="com.tencent.smtt.export.external.DexClassLoaderProviderService"
android:label="dexopt"
android:process=":dexopt"></service>
<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/x5webview_file_paths" />
</provider>
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-g0CauJ7q-1680272868251)(file:///C:/Users/swh/AppData/Local/Temp/msohtmlclip1/01/clip_image010.jpg)]
功能实现
//搜集本地tbs内核信息并上报服务器,服务器返回结果决定使用哪个内核。
QbSdk.PreInitCallback cb = new QbSdk.PreInitCallback() {
@Override
public void onViewInitFinished(boolean arg0) {
// TODO Auto-generated method stub
//x5內核初始化完成的回调,为true表示x5内核加载成功,否则表示x5内核加载失败,会自动切换到系统内核。
Log.d("xxx", " onViewInitFinished is " + arg0);
if(!arg0){
TbsDownloader.startDownload(getApplicationContext());
}
}
@Override
public void onCoreInitFinished() {
// TODO Auto-generated method stub
}
};
//x5内核初始化接口
QbSdk.initX5Environment(getApplicationContext(), cb);
QbSdk.setDownloadWithoutWifi(true);
QbSdk.setTbsListener(new TbsListener() {
@Override
public void onDownloadFinish(int i) {
Log.d("xxx", "下载完成 progress = " + i);
}
@Override
public void onInstallFinish(int i) {
Log.d("xxx", "正在安装内核 progress = " + i);
}
@Override
public void onDownloadProgress(int i) {
Log.d("xxx", "已经下载 progress = " + i);
}
});
boolean b = QbSdk.canLoadX5(getApplicationContext());
if(b){
Log.i("xxx","内核可用"+b);
}
// 在调用TBS初始化、创建WebView之前进行如下配置
HashMap map = new HashMap();
map.put(TbsCoreSettings.TBS_SETTINGS_USE_SPEEDY_CLASSLOADER, true);
map.put(TbsCoreSettings.TBS_SETTINGS_USE_DEXLOADER_SERVICE, true);
QbSdk.initTbsSettings(map);
使用X5模块加载
QbSdk.openFileReader(this, url, null,null);
布局引用:
TbsReaderView tbsReaderView = new TbsReaderView(MainActivity.this, new TbsReaderView.ReaderCallback() {
@Override
public void onCallBackAction(Integer integer, Object o, Object o1) {
}
});
LinearLayout layout= findViewById(R.id.rl_tbsView);
layout.addView(tbsReaderView,new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT,RelativeLayout.LayoutParams.MATCH_PARENT));
String bsReaderTemp = FileUtils.getTBSFileDir(MainActivity.this) + "/TbsReaderTemp";
File bsReaderTempFile = new File(bsReaderTemp);
if (!bsReaderTempFile.exists()) {
Log.e("111111", "准备创建/storage/emulated/0/TbsReaderTemp!!");
boolean mkdir = bsReaderTempFile.mkdir();
if (!mkdir) {
Log.e("111111", "创建/storage/emulated/0/TbsReaderTemp失败!!!!!");
}
}
String extension = url.substring(url.lastIndexOf(".") + 1);
Log.i("xxx","路径:"+extension);
String path = FileUtils.getTBSFileDir(getApplicationContext()).getPath() +"/test.doc";
boolean b= tbsReaderView.preOpen(getFileType(url), false);
// boolean b = tbsReaderView.preOpen(extension, false);
if(b){
Bundle bundle = new Bundle();
bundle.putString("filePath", url);
bundle.putString("tempPath", FileUtils.getTBSFileDir(this) + "/" + "TbsReaderTemp");
tbsReaderView.openFile(bundle);
}
private String getFileType(String paramString) {
String str = "";
if (TextUtils.isEmpty(paramString)) {
Log.d("print", "paramString---->null");
return str;
}
Log.d("print", "paramString:" + paramString);
int i = paramString.lastIndexOf('.');
if (i <= -1) {
Log.d("print", "i <= -1");
return str;
}
str = paramString.substring(i + 1);
Log.d("print", "paramString.substring(i + 1)------>" + str);
return str;
}
DEMO:
小细节 注意线程问题 解决方案
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
//预览文件
tbsReaderView.openFile(bundle);
}
}, 500);
turn str;
}
DEMO:
小细节 注意线程问题 解决方案
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
//预览文件
tbsReaderView.openFile(bundle);
}
}, 500);