腾讯TBS浏览服务打开本地文档(word.pdf.ppt)踩过的坑

2023-10-14 07:59

本文主要是介绍腾讯TBS浏览服务打开本地文档(word.pdf.ppt)踩过的坑,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

记录一下安卓使用腾讯tbs浏览本地文档(word.pdf.ppt)踩过的坑,以方便以后自己面查阅跟供他人参考。
腾讯TBS服务官网介绍


 



遇到的坑:
1、按照文档接入sdk,并在DemoApplication 初始化加载tbs内核不成功,(周五、周六、周日)通常是初始化加载不成功,其他时间段没问题

2、tbs初始化加载成功,添加显示具体文档的时候,一直提示 "插件加载失败"

处理办法:
问题1:按照sdk流程初始化初始化加载tbs内核,加载内核不成功重新调用下载方法:

TbsDownloader.startDownload();

10次都加载不成功,直接手动加载安装本地tbs内核资源(本地tbs资源可以放在自己的服务器上):

QbSdk.installLocalTbsCore()  问题2: 根据官网常见问题做对应的修改即可:
腾讯浏览服务  3.7 targetAPI为Android P时无法下载内核?

下面附上代码段:

package com.demo.tbsloadfile;import android.app.Application;
import android.util.Log;
import android.widget.Toast;import com.tencent.smtt.export.external.TbsCoreSettings;
import com.tencent.smtt.sdk.QbSdk;
import com.tencent.smtt.sdk.QbSdk.PreInitCallback;
import com.tencent.smtt.sdk.TbsDownloader;
import com.tencent.smtt.sdk.TbsListener;import java.io.File;
import java.util.HashMap;public class DemoApplication extends Application {private static final String TAG = "DemoApplication";@Overridepublic void onCreate() {super.onCreate();initTBS();//targetSdkVersion > 27 ,需要参考文档   3.7 targetAPI为Android P时无法下载内核?添加xml// https://x5.tencent.com/docs/questions.html//复制文件到sdkcardFileCopyAssetToSD.getInstance(getApplicationContext()).copyAssetsToSD("sources" , FileCopyAssetToSD.getDiskCacheDir(getApplicationContext()).toString()).setFileOperateCallback(new FileCopyAssetToSD.FileOperateCallback() {@Overridepublic void onSuccess() {}@Overridepublic void onFailed(String error) {}});// tbs内核本地加载
//        FileCopyAssetToSD.getInstance(getApplicationContext()).copyAssetsToSD("apk" , FileCopyAssetToSD.getDiskCacheDir(getApplicationContext()).toString()).setFileOperateCallback(new FileCopyAssetToSD.FileOperateCallback() {
//            @Override
//            public void onSuccess() {
//                String filePath = FileCopyAssetToSD.getDiskCacheDir(getApplicationContext()).toString() + File.separator + "x5.apk";
//                initLocalTbsCore(filePath);
//                Toast.makeText(getApplicationContext() , "复制成功"+filePath , Toast.LENGTH_LONG).show();
//
//            }
//
//            @Override
//            public void onFailed(String error) {
//
//            }
//        });}private boolean isDownTbsSuccess = false;//TBS X5插件是否下载成功private int downTbsCount = 0;//尝试下载次数/*** 腾讯TBS初始化流程*/public void initTBS() {/********************************TBS服务器下发版本开始*********************************/if (QbSdk.getTbsVersion(getApplicationContext()) == 0) {//获取不到版本号,说明插件没有加载成功,重新跑流程//判断是否是x5内核未下载成功,存在缓存 重置化sdk,这样就清除缓存继续下载了QbSdk.reset(getApplicationContext());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.setDownloadWithoutWifi(true);/* SDK内核初始化周期回调,包括 下载、安装、加载 */QbSdk.setTbsListener(new TbsListener() {/*** @param progress 110: 表示当前服务器认为该环境下不需要下载*/@Overridepublic void onDownloadFinish(int progress) {Log.i(TAG, "onDownloadFinished: " + progress);//下载结束时的状态,下载成功时errorCode为100,其他均为失败,外部不需要关注具体的失败原因if (isDownTbsSuccess) {return;}if (progress < 100) {return;}if (progress != 100) {//回调里面还是没有成功,那就再次尝试下载if (downTbsCount < 10) {//尝试下载10次,失败就开始从自己的服务器端下载downTbs();} else {//加载从自己的服务器端下载的x5内核FileCopyAssetToSD.getInstance(getApplicationContext()).copyAssetsToSD("apk" , FileCopyAssetToSD.getDiskCacheDir(getApplicationContext()).toString()).setFileOperateCallback(new FileCopyAssetToSD.FileOperateCallback() {@Overridepublic void onSuccess() {String filePath = FileCopyAssetToSD.getDiskCacheDir(getApplicationContext()).toString() + File.separator + "x5.apk";initLocalTbsCore(filePath);Toast.makeText(getApplicationContext() , "复制成功" , Toast.LENGTH_LONG).show();Log.i(TAG,"复制成功:"+filePath);}@Overridepublic void onFailed(String error) {}});}downTbsCount++;}if (progress == 100) {isDownTbsSuccess = true;}}/**initX5Environment* @param stateCode 200、232安装成功*/@Overridepublic void onInstallFinish(int stateCode) {Log.i(TAG, "onInstallFinished: " + stateCode);}/*** 首次安装应用,会触发内核下载,此时会有内核下载的进度回调。* @param progress 0 - 100*/@Overridepublic void onDownloadProgress(int progress) {Log.i(TAG, "Core Downloading: " + progress);}});/* 此过程包括X5内核的下载、预初始化,接入方不需要接管处理x5的初始化流程,希望无感接入 */QbSdk.initX5Environment(this, new PreInitCallback() {@Overridepublic void onCoreInitFinished() {// 内核初始化完成,可能为系统内核,也可能为系统内核}/*** 预初始化结束* 由于X5内核体积较大,需要依赖wifi网络下发,所以当内核不存在的时候,默认会回调false,此时将会使用系统内核代替* 内核下发请求发起有24小时间隔,卸载重装、调整系统时间24小时后都可重置* @param isX5 是否使用X5内核*/@Overridepublic void onViewInitFinished(boolean isX5) {Log.i(TAG, "onViewInitFinished: " + isX5);}});}}/*** 下载TBS插件 通过腾讯端下发*/public void downTbs() {//判断是否是x5内核未下载成功,存在缓存 重置化sdk,这样就清除缓存继续下载了QbSdk.reset(getApplicationContext());//开始下载x5内核TbsDownloader.startDownload(getApplicationContext());}/*** tbs内核本地加载*/public void initLocalTbsCore(String filePath) {QbSdk.reset(getApplicationContext());QbSdk.setTbsListener(new TbsListener() {@Overridepublic void onDownloadFinish(int i) {}@Overridepublic void onInstallFinish(int i) {int tbsVersion = QbSdk.getTbsVersion(getApplicationContext());}@Overridepublic void onDownloadProgress(int i) {}});QbSdk.installLocalTbsCore(getApplicationContext(), 44197, filePath);}}
 
package com.demo.tbsloadfile;import androidx.appcompat.app.AppCompatActivity;
import pub.devrel.easypermissions.EasyPermissions;import android.Manifest;
import android.content.Context;
import android.os.Bundle;
import android.os.Environment;
import android.text.TextUtils;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.widget.LinearLayout;import com.tencent.smtt.sdk.TbsReaderView;import java.io.File;
import java.util.logging.Logger;public class MainActivity extends AppCompatActivity implements  TbsReaderView.ReaderCallback{String TAG = "MainActivity";String mFilePath = "";LinearLayout llBoard;TbsReaderView tbsReaderView;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);checkPermission();mFilePath = FileCopyAssetToSD.getDiskCacheDir(this)+ File.separator + "安全教育(1).ppt";llBoard = findViewById(R.id.llBoard);findViewById(R.id.btnAdd).setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {try {tbsReaderView = new TbsReaderView(MainActivity.this, MainActivity.this);tbsReaderView.setFocusable(false);llBoard.addView(tbsReaderView, new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));String tbsReaderTemp = getDiskCacheDir(MainActivity.this).toString() + "/" + "TbsReaderTemp";File tbsReaderTempFile = new File(tbsReaderTemp);if (!tbsReaderTempFile.exists()) {tbsReaderTempFile.mkdir();}Bundle localBundle = new Bundle();localBundle.putString(TbsReaderView.KEY_FILE_PATH, mFilePath);localBundle.putString(TbsReaderView.KEY_TEMP_PATH, tbsReaderTemp);boolean bool = tbsReaderView.preOpen(getFileType(mFilePath), false);if (bool) {tbsReaderView.openFile(localBundle);} else {Log.i(TAG,"X5内核加载课件失败,需要重新加载");//加载本地x5so 执行 DemoApplication  initLocalTbsCore();}} catch (Exception e) {e.printStackTrace();}}});}@Overridepublic void onCallBackAction(Integer integer, Object o, Object o1) {}/**** 获取文件类型** @param paramString* @return*/private String getFileType(String paramString) {String str = "";if (TextUtils.isEmpty(paramString)) {return str;}int i = paramString.lastIndexOf('.');if (i <= -1) {return str;}str = paramString.substring(i + 1);return str;}//    /路径例如: /SD卡/Android/data/程序的包名/cache/uniqueNamepublic static File getDiskCacheDir(Context context) {//获取缓目录String cachePath;if (Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())|| !Environment.isExternalStorageRemovable()) {cachePath = context.getExternalCacheDir().getPath();} else {cachePath = context.getCacheDir().getPath();}File file = new File(cachePath + File.separator + "tbs");if (!file.exists()) {file.mkdirs();}return file;}public void checkPermission(){String[] perms = {Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE,Manifest.permission.RECORD_AUDIO, Manifest.permission.READ_EXTERNAL_STORAGE};if (EasyPermissions.hasPermissions(this, perms)) {} else {// Do not have permissions, request them nowEasyPermissions.requestPermissions(this, "需要先获取相关权限",0x01, perms);}}@Overrideprotected void onDestroy() {super.onDestroy();if (tbsReaderView != null)tbsReaderView.onStop();}
}

参考:
腾讯TBS浏览服务打开word.pdf.ppt等文档的使用_Huang_SS的博客-CSDN博客

Android实现复制Assets文件到SD卡 - 码农教程demo地址:
https://gitee.com/woshiluchi/tbsloadfile.git安卓腾讯TBS加载本地文件(word.pdf.ppt)-Android文档类资源-CSDN下载

这篇关于腾讯TBS浏览服务打开本地文档(word.pdf.ppt)踩过的坑的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/209171

相关文章

C#集成DeepSeek模型实现AI私有化的流程步骤(本地部署与API调用教程)

《C#集成DeepSeek模型实现AI私有化的流程步骤(本地部署与API调用教程)》本文主要介绍了C#集成DeepSeek模型实现AI私有化的方法,包括搭建基础环境,如安装Ollama和下载DeepS... 目录前言搭建基础环境1、安装 Ollama2、下载 DeepSeek R1 模型客户端 ChatBo

JAVA集成本地部署的DeepSeek的图文教程

《JAVA集成本地部署的DeepSeek的图文教程》本文主要介绍了JAVA集成本地部署的DeepSeek的图文教程,包含配置环境变量及下载DeepSeek-R1模型并启动,具有一定的参考价值,感兴趣的... 目录一、下载部署DeepSeek1.下载ollama2.下载DeepSeek-R1模型并启动 二、J

使用Python创建一个能够筛选文件的PDF合并工具

《使用Python创建一个能够筛选文件的PDF合并工具》这篇文章主要为大家详细介绍了如何使用Python创建一个能够筛选文件的PDF合并工具,文中的示例代码讲解详细,感兴趣的小伙伴可以了解下... 目录背景主要功能全部代码代码解析1. 初始化 wx.Frame 窗口2. 创建工具栏3. 创建布局和界面控件4

Python进行PDF文件拆分的示例详解

《Python进行PDF文件拆分的示例详解》在日常生活中,我们常常会遇到大型的PDF文件,难以发送,将PDF拆分成多个小文件是一个实用的解决方案,下面我们就来看看如何使用Python实现PDF文件拆分... 目录使用工具将PDF按页数拆分将PDF的每一页拆分为单独的文件将PDF按指定页数拆分根据页码范围拆分

Python自动化Office文档处理全攻略

《Python自动化Office文档处理全攻略》在日常办公中,处理Word、Excel和PDF等Office文档是再常见不过的任务,手动操作这些文档不仅耗时耗力,还容易出错,幸运的是,Python提供... 目录一、自动化处理Word文档1. 安装python-docx库2. 读取Word文档内容3. 修改

springboot的调度服务与异步服务使用详解

《springboot的调度服务与异步服务使用详解》本文主要介绍了Java的ScheduledExecutorService接口和SpringBoot中如何使用调度线程池,包括核心参数、创建方式、自定... 目录1.调度服务1.1.JDK之ScheduledExecutorService1.2.spring

Android 悬浮窗开发示例((动态权限请求 | 前台服务和通知 | 悬浮窗创建 )

《Android悬浮窗开发示例((动态权限请求|前台服务和通知|悬浮窗创建)》本文介绍了Android悬浮窗的实现效果,包括动态权限请求、前台服务和通知的使用,悬浮窗权限需要动态申请并引导... 目录一、悬浮窗 动态权限请求1、动态请求权限2、悬浮窗权限说明3、检查动态权限4、申请动态权限5、权限设置完毕后

Python如何实现PDF隐私信息检测

《Python如何实现PDF隐私信息检测》随着越来越多的个人信息以电子形式存储和传输,确保这些信息的安全至关重要,本文将介绍如何使用Python检测PDF文件中的隐私信息,需要的可以参考下... 目录项目背景技术栈代码解析功能说明运行结php果在当今,数据隐私保护变得尤为重要。随着越来越多的个人信息以电子形

使用Python快速实现链接转word文档

《使用Python快速实现链接转word文档》这篇文章主要为大家详细介绍了如何使用Python快速实现链接转word文档功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 演示代码展示from newspaper import Articlefrom docx import

0基础租个硬件玩deepseek,蓝耘元生代智算云|本地部署DeepSeek R1模型的操作流程

《0基础租个硬件玩deepseek,蓝耘元生代智算云|本地部署DeepSeekR1模型的操作流程》DeepSeekR1模型凭借其强大的自然语言处理能力,在未来具有广阔的应用前景,有望在多个领域发... 目录0基础租个硬件玩deepseek,蓝耘元生代智算云|本地部署DeepSeek R1模型,3步搞定一个应