千家信息网

如何使用Android集成腾讯X5实现文档浏览功能

发表于:2026-11-03 作者:千家信息网编辑
千家信息网最后更新 2026年11月03日,这篇文章主要介绍了如何使用Android集成腾讯X5实现文档浏览功能,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。一、下载腾讯X5内核
千家信息网最后更新 2026年11月03日如何使用Android集成腾讯X5实现文档浏览功能

这篇文章主要介绍了如何使用Android集成腾讯X5实现文档浏览功能,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。

一、下载腾讯X5内核

1.前往https://x5.tencent.com/下载Android的内核,新版本的腾讯X5可以直接在bulid.gradle集成 api 'com.tencent.tbs.tbssdk:sdk:43697',如果是在App里集成可以把api换成implementation

2.AndroidStudio导入腾讯X5

a.把下载好的jar包导入libs,然后run as,再把jnilibs导入main包下

b. module的build.gradle添加cpu适配

3.Application中腾讯X5初始化,在onCreate()方法调用init方法

QbSdk.initX5Environment(this, new QbSdk.PreInitCallback() { @Override public void onCoreInitFinished() { } @Override public void onViewInitFinished(boolean b) { Log.e("xxx","hasLoad"+b); //此处将内核加载是否成功的状态保存到本地,SharePreference工具类可换为自己的 SharedPreferenceUtils.saveBoolean(getApplicationContext(),"hasLoad",b); } });

4.应用内调用,无论是否加载内核,都是把在线的文档下载到本地然后打开,不同的是,未加载内核会借助QQ浏览器或其他App的文件浏览功能类似微信(这个调用,腾讯X5已自动处理,我们无需关心),而加载内核后,使用X5的TbsReaderView来打开文件,接下来就是具体代码。

a.bulid.gradle中集成Retrofit,RxJava和进度管理器ProgressManager

implementation 'io.reactivex:rxandroid:1.2.1' implementation 'com.squareup.retrofit2:converter-gson:2.3.0' implementation 'com.squareup.retrofit2:adapter-rxjava:2.1.0' implementation 'com.squareup.retrofit2:retrofit:2.3.0' implementation 'io.reactivex:rxjava:1.2.6' implementation 'me.jessyan:progressmanager:1.5.0'

写网络下载工具

public interface LoadFileApi { @GET Call loadPdfFile(@Url String fileUrl);}public class LoadFileModel { //使用该方法来下载文件 public static void loadPdfFile(String url, Callback callback) { Retrofit retrofit = new Retrofit.Builder() .baseUrl("https://www.baidu.com/") .client(ProgressManager.getInstance().with(new OkHttpClient.Builder()) .build()) .addConverterFactory(GsonConverterFactory.create()) .build(); LoadFileApi mLoadFileApi = retrofit.create(LoadFileApi.class); if (!TextUtils.isEmpty(url)) { Call call = mLoadFileApi.loadPdfFile(url); call.enqueue(callback); } }}

b.具体调用

首先注册文件进度下载监听

private ProgressDialog commonProgressDialog;//切换为自己的进度控件 private ProgressInfo mLastDownloadingInfo; ProgressManager.getInstance().addResponseListener(url, new ProgressListener() { @Override public void onProgress(ProgressInfo progressInfo) { if (mLastDownloadingInfo == null) { mLastDownloadingInfo = progressInfo; } //因为是以请求开始时的时间作为 Id ,所以值越大,说明该请求越新 if (progressInfo.getId() < mLastDownloadingInfo.getId()) { return; } else if (progressInfo.getId() > mLastDownloadingInfo.getId()) { mLastDownloadingInfo = progressInfo; } int progress = mLastDownloadingInfo.getPercent(); commonProgressDialog.setProgress(progress); Log.d("xxx", "--Download-- " + progress + " % " + mLastDownloadingInfo.getSpeed() + " byte/s " + mLastDownloadingInfo.toString()); if (mLastDownloadingInfo.isFinish()) { //说明已经下载完成 commonProgressDialog.dismiss(); Log.d("xxx", "--Download-- finish"); } } @Override public void onError(long id, Exception e) { e.printStackTrace(); new Handler().post(new Runnable() { @Override public void run() { commonProgressDialog.dismiss(); } }); } }); }

然后打开文件

private static final String DOWN_DIR = Environment.getExternalStorageDirectory() + File.separator+"Download"; //文件下载的路径,可以自定义//打开文件 private void openFile(String filePath,String fileName) { boolean hasLoad = SharedPreferenceUtils.getBoolean(mContext, "hasLoad");//是否记载内核 if (hasLoad){ //展示文件的Activity Intent intentDoc = new Intent(this,FileDisplayActivity.class); intentDoc.putExtra("path",filePath); intentDoc.putExtra("fileName",fileName); startActivity(intentDoc); }else { if(!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){ Toast.makeText(this,"当前SD不可用",Toast.LENGTH_LONG).show(); return; } try { File file = new File(DOWN_DIR, fileName); if (file.exists()){ QbSdk.openFileReader(this, file.getAbsolutePath(), null, new ValueCallback() { @Override public void onReceiveValue(String s) { Log.e("xxx",s); } }); } else { downLoadFile(filePath,fileName); } } catch (Exception e) { e.printStackTrace(); ToastUtils.showShortToast(mContext, "已下载过了"); } } } private void downLoadFile(final String url, final String fileName) { commonProgressDialog.show(); LoadFileModel.loadPdfFile(url, new Callback() { @Override public void onResponse(@NonNull Call call, @NonNull Response response) { InputStream is = null; byte[] buf = new byte[2048]; int len; FileOutputStream fos = null; try { ResponseBody responseBody = response.body(); if (responseBody != null) { is = responseBody.byteStream(); final File file = new File(DOWN_DIR, fileName); fos = new FileOutputStream(file); while ((len = is.read(buf)) != -1) { fos.write(buf, 0, len); } fos.flush(); //未加载内核调用方法 QbSdk.openFileReader(mContext, file.getAbsolutePath(), null, new ValueCallback() { @Override public void onReceiveValue(String s) { Log.e("xxx",s); } }); ToastUtils.showLongToast(MeetingDetailActivity.this, "下载成功,保存在Download文件夹下"); } } catch (Exception e) { commonProgressDialog.dismiss(); ProgressManager.getInstance().notifyOnErorr(url,e); ToastUtils.showLongToast(MeetingDetailActivity.this, "下载失败"); } finally { try { if (is != null) is.close(); } catch (IOException e) { e.printStackTrace(); } try { if (fos != null) fos.close(); } catch (IOException e) { e.printStackTrace(); } } } @Override public void onFailure(@NonNull Call call, @NonNull Throwable t) { t.printStackTrace(); ToastUtils.showShortToast(MeetingDetailActivity.this, "下载失败"); commonProgressDialog.dismiss(); } }); }

FileDisplayActivity代码,对于一些包名可以切换为自己的包名,还有一些第三方库像进度展示,也可以切换为自己的进度控件

import android.content.Intent;import android.os.Bundle;import android.os.Environment;import android.os.Handler;import android.os.Message;import android.support.annotation.NonNull;import android.support.annotation.Nullable;import android.support.v7.app.AppCompatActivity;import android.text.TextUtils;import android.util.Log;import android.view.View;import android.view.WindowManager;import android.widget.TextView;import com.anshi.oatencentschool.R;import com.anshi.oatencentschool.utils.DialogBuild;import com.anshi.oatencentschool.utils.StatusBarUtils;import com.anshi.oatencentschool.utils.ToastUtils;import com.anshi.oatencentschool.utils.WeakHandler;import com.anshi.oatencentschool.utils.filetool.LoadFileModel;import com.anshi.oatencentschool.utils.filetool.SuperFileView2;import com.kaopiz.kprogresshud.KProgressHUD;import java.io.File;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import me.jessyan.progressmanager.ProgressListener;import me.jessyan.progressmanager.ProgressManager;import me.jessyan.progressmanager.body.ProgressInfo;import okhttp3.ResponseBody;import retrofit2.Call;import retrofit2.Callback;import retrofit2.Response;public class FileDisplayActivity extends AppCompatActivity { private String TAG = "FileDisplayActivity"; //Tencent 提供的TBS阅读浏览功能,不借助第三方软件打开office和pdf文件 private SuperFileView2 mSuperFileView; private String filePath; private TextView mTextView; private static final String DOWN_DIR = Environment.getExternalStorageDirectory() + File.separator+"Download"; private String fileName; private KProgressHUD commonProgressDialog; private WeakHandler weakHandler = new WeakHandler(new Handler.Callback() { @Override public boolean handleMessage(Message msg) { int progress = msg.arg1; if (progress==100){ commonProgressDialog.setProgress(progress); commonProgressDialog.dismiss(); }else { commonProgressDialog.setProgress(progress); } return true; } }); @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_file_display); getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON|WindowManager.LayoutParams.FLAG_FULLSCREEN); commonProgressDialog = DialogBuild.getBuild().createCommonProgressDialog(this, "下载中"); init(); } /** * 初始化 */ public void init() { mTextView = (TextView) findViewById(R.id.file_album_name); fileName = getIntent().getStringExtra("fileName"); int lastIndexOf = fileName.lastIndexOf("."); String substring = fileName.substring(0, lastIndexOf); mTextView.setText(substring); mSuperFileView = (SuperFileView2) findViewById(R.id.mSuperFileView); mSuperFileView.setOnGetFilePathListener(new SuperFileView2.OnGetFilePathListener() { @Override public void onGetFilePath(SuperFileView2 mSuperFileView2) { getFilePathAndShowFile(mSuperFileView); } }); Intent intent = this.getIntent(); String path = (String) intent.getSerializableExtra("path"); if (!TextUtils.isEmpty(path)) { Log.d(TAG, "文件path:" + path); setFilePath(path); } mSuperFileView.show(); ProgressManager.getInstance().addResponseListener(path, new ProgressListener() { @Override public void onProgress(ProgressInfo progressInfo) { int percent = progressInfo.getPercent(); Message obtain = Message.obtain(); obtain.arg1 = percent; weakHandler.sendMessage(obtain); } @Override public void onError(long id, Exception e) { } }); } @Override protected void onResume() { super.onResume(); StatusBarUtils.setWindowStatusBarColor(this,R.color.color_main); } /** * 显示文件 * @param mSuperFileView2 控件 */ private void getFilePathAndShowFile(SuperFileView2 mSuperFileView2) { if (getFilePath().contains("http")&&!new File(DOWN_DIR, fileName).exists()) {//网络地址要先下载 downLoadFile(getFilePath(),fileName,mSuperFileView2); } else { try { mSuperFileView2.displayFile(new File(DOWN_DIR, fileName)); }catch (Exception e){ e.printStackTrace(); } } } public void setFilePath(String fileUrl) { this.filePath = fileUrl; } private String getFilePath() { return filePath; } /** * 回退上一级菜单 * @param view 控件 */ public void onClick(View view) { finish(); } private void downLoadFile(final String url, final String fileName,final SuperFileView2 mSuperFileView2) { commonProgressDialog.show(); LoadFileModel.loadPdfFile(url, new Callback() { @Override public void onResponse(@NonNull Call call, @NonNull Response response) { InputStream is = null; byte[] buf = new byte[2048]; int len; FileOutputStream fos = null; try { ResponseBody responseBody = response.body(); is = responseBody.byteStream(); final File file = new File(DOWN_DIR, fileName); fos = new FileOutputStream(file); while ((len = is.read(buf)) != -1) { fos.write(buf, 0, len); } fos.flush(); mSuperFileView2.displayFile(file); ToastUtils.showLongToast(FileDisplayActivity.this, "下载成功,保存在Download文件夹下"); } catch (Exception e) { commonProgressDialog.dismiss(); ToastUtils.showLongToast(FileDisplayActivity.this, "下载失败"); } finally { try { if (is != null) is.close(); } catch (IOException e) { e.printStackTrace(); } try { if (fos != null) fos.close(); } catch (IOException e) { e.printStackTrace(); } } } @Override public void onFailure(@NonNull Call call, @NonNull Throwable t) { t.printStackTrace(); ToastUtils.showShortToast(FileDisplayActivity.this, "下载失败"); commonProgressDialog.dismiss(); } }); }}

布局Layout:

SuperFileView2代码,这个自定义的类是从https://github.com/ZhongXiaoHong/superFileView导入

import android.content.Context;import android.os.Bundle;import android.os.Environment;import android.text.TextUtils;import android.util.AttributeSet;import android.util.Log;import android.widget.FrameLayout;import android.widget.LinearLayout;import com.tencent.smtt.sdk.TbsReaderView;import java.io.File;/** * * Created by 12457 on 2017/8/29. */public class SuperFileView2 extends FrameLayout { private static String TAG = "SuperFileView"; private TbsReaderView mTbsReaderView; private Context context; public SuperFileView2(Context context) { this(context, null, 0); } public SuperFileView2(Context context, AttributeSet attrs) { this(context, attrs, 0); } public SuperFileView2(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); mTbsReaderView = new TbsReaderView(context, new TbsReaderView.ReaderCallback() { @Override public void onCallBackAction(Integer integer, Object o, Object o1) { } }); this.addView(mTbsReaderView, new LinearLayout.LayoutParams(-1, -1)); this.context = context; } private OnGetFilePathListener mOnGetFilePathListener; public void setOnGetFilePathListener(OnGetFilePathListener mOnGetFilePathListener) { this.mOnGetFilePathListener = mOnGetFilePathListener; } private TbsReaderView getTbsReaderView(Context context) { return new TbsReaderView(context, new TbsReaderView.ReaderCallback() { @Override public void onCallBackAction(Integer integer, Object o, Object o1) { } }); } public void displayFile(File mFile) { if (mFile != null && !TextUtils.isEmpty(mFile.toString())) { //增加下面一句解决没有TbsReaderTemp文件夹存在导致加载文件失败 String bsReaderTemp = Environment.getExternalStorageDirectory()+ File.separator+"TbsReaderTemp"; File bsReaderTempFile =new File(bsReaderTemp); if (!bsReaderTempFile.exists()) { Log.d("xxx","准备创建/storage/emulated/0/TbsReaderTemp!!"); boolean mkdir = bsReaderTempFile.mkdir(); if(!mkdir){ Log.d("xxx","创建/storage/emulated/0/TbsReaderTemp失败!!!!!"); } } //加载文件 Bundle localBundle = new Bundle(); Log.d("xxx",mFile.toString()); localBundle.putString("filePath", mFile.toString()); localBundle.putString("tempPath", bsReaderTemp); if (mTbsReaderView == null){ mTbsReaderView = getTbsReaderView(context.getApplicationContext()); String fileType = getFileType(mFile.toString()); boolean bool = mTbsReaderView.preOpen(fileType,false); if (bool) { try { mTbsReaderView.openFile(localBundle); }catch (Exception e){ e.printStackTrace(); } } }else { String fileType = getFileType(mFile.toString()); boolean bool = mTbsReaderView.preOpen(fileType,false); if (bool) { try { mTbsReaderView.openFile(localBundle); }catch (Exception e){ e.printStackTrace(); } } } } else { Log.d("xxx","文件路径无效!"); } } /*** * 获取文件类型 * * @param paramString * @return */ private String getFileType(String paramString) { String str = ""; if (TextUtils.isEmpty(paramString)) { Log.d(TAG, "paramString---->null"); return str; } Log.d(TAG, "paramString:" + paramString); int i = paramString.lastIndexOf('.'); if (i <= -1) { Log.d(TAG, "i <= -1"); return str; } str = paramString.substring(i + 1); Log.d(TAG, "paramString.substring(i + 1)------>" + str); return str; } public void show() { if(mOnGetFilePathListener!=null){ mOnGetFilePathListener.onGetFilePath(this); } } /*** * 将获取File路径的工作,"外包"出去 */ public interface OnGetFilePathListener { void onGetFilePath(SuperFileView2 mSuperFileView2); } public void onStopDisplay() { if (mTbsReaderView != null) { mTbsReaderView.onStop(); } }}

感谢你能够认真阅读完这篇文章,希望小编分享的"如何使用Android集成腾讯X5实现文档浏览功能"这篇文章对大家有帮助,同时也希望大家多多支持,关注行业资讯频道,更多相关知识等着你来学习!

文件 内核 腾讯 浏览 进度 功能 控件 方法 篇文章 文档 成功 代码 文件夹 路径 切换 工具 第三方 网络 b. 不同 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 百单网互联网科技有限公司怎么样 中国互联网科技工作委员会毛军 厦门中拓互联网络科技有限公司 美国互联网科技 成都互联网科技公司 壹账通互联网科技 科技互联网公司logo 伴你行互联网科技有限公司 恒生科技互联网指数分析 青海省互联网新科技 互联网时代科技改变生活 来此购互联网科技有限公司 崇明区互联网教育科技诚信经营 河南住房之家互联网科技 互联网科技创新的路径 长沙茂晟互联网科技有限公司 长沙互联网科技 伍佰万互联网科技怎么赚钱 互联网时代高科技布局 亚光科技低轨卫星互联网 互联网金融科技 厦门中拓互联网络科技有限公司 互联网是不是新科技 港股互联网科技股 互联网金融 金融科技 厦门千工互联网科技有限公司 开一家科技互联网公司需要多少钱 为客找房互联网科技公司怎么样 宇信科技在杭州互联网排第几 陕西九四连强互联网科技有限公司
0