说明:使用TBS(腾讯浏览服务)打开,目前不支持在线预览,只能先下载下来,在打开

下载SDK

第一步:

加载jar、so

tbs_sdk_thirdapp_v4.3.0.1072_43646_sharewithdownloadwithfile_withoutGame_obfs_20190429_175122.jar

第二步:

权限处理

1. 清单文件配置

2. 动态权限申请

private String[] permissions = new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE};private List mPermissionList = new ArrayList<>();private void requestPermisson() {if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {mPermissionList.clear();for (int i = 0; i < permissions.length; i++) {if (ContextCompat.checkSelfPermission(mContext, permissions[i]) != PackageManager.PERMISSION_GRANTED) {mPermissionList.add(permissions[i]);}}if (mPermissionList.isEmpty()) {//未授予的权限为空,表示都授予了hasPermissionDismiss = false;} else {//请求权限方法String[] permissionsArr = mPermissionList.toArray(new String[mPermissionList.size()]);requestPermissions(permissionsArr, 100);}}}private boolean hasPermissionDismiss = false;//用户是否禁止权限@Overridepublic void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {super.onRequestPermissionsResult(requestCode, permissions, grantResults);if (requestCode == 100 && grantResults.length > 0) {for (int i = 0; i < grantResults.length; i++) {if (grantResults[i] != PackageManager.PERMISSION_GRANTED) {hasPermissionDismiss = true;break;}}//如果有权限没有被允许if (hasPermissionDismiss) {showPermissionDialog();//跳转到系统设置权限页面,或者直接关闭页面,不让他继续访问} else {//X5内核的初始化initX5();}}}

第三步:

x5内核初始化,权限申请之前初始化会失败,

private void initX5(){QbSdk.initX5Environment(this, new QbSdk.PreInitCallback() {@Overridepublic void onCoreInitFinished() {//x5内核初始化完成回调接口,此接口回调并表示已经加载起来了x5,有可能特殊情况下x5内核加载失败,切换到系统内核。Log.e("@@","onCoreInitFinished:");}@Overridepublic void onViewInitFinished(boolean b) {//x5內核初始化完成的回调,为true表示x5内核加载成功,否则表示x5内核加载失败,会自动切换到系统内核。Log.e("@@","加载内核是否成功:" + b);}});}

第四步:

文件的下载,支持断点

/** * 下载文件 */private void downloadFile() {new Thread(new Runnable() {@Overridepublic void run() {HttpURLConnection conn = null;RandomAccessFile raf = null;BufferedInputStream bis = null;try {//1. 创建文件夹、及文件File file = new File(filePah);if (!file.getParentFile().exists()) {file.getParentFile().mkdirs();}raf = new RandomAccessFile(file, "rwd");URL url = new URL(item.getFileUrl());conn = (HttpURLConnection) url.openConnection();conn.setConnectTimeout(3000);conn.setReadTimeout(3000);conn.setRequestMethod("GET");getLength();finishSize = file.length();conn.setRequestProperty("Range", "bytes=" + finishSize + "-");raf.seek(finishSize);conn.connect();bis = new BufferedInputStream(conn.getInputStream());int len;byte[] buffer = new byte[1024 * 8];while (isDownload && (-1 != (len = bis.read(buffer)))) {raf.write(buffer, 0, len);finishSize += len;if (finishSize < fileSize) {handler.sendEmptyMessage(0);} else {//下载完成isDownload = false;handler.sendEmptyMessage(1);}}} catch (Exception e) {e.printStackTrace();handler.sendEmptyMessage(-1);} finally {try {if (raf != null) {raf.close();raf = null;}if (bis != null) {bis.close();bis = null;}if (conn != null) {conn.disconnect();conn = null;}} catch (Exception e) {e.printStackTrace();}}}}).start();}/** * 首先开启一个线程去获取要下载文件的大小(长度) */private void getLength() {HttpURLConnection connection = null;try {//连接网络URL url = new URL(item.getFileUrl());connection = (HttpURLConnection) url.openConnection();connection.setConnectTimeout(3000);//连接超时时间connection.setReadTimeout(3000);//读取超时时间connection.setRequestMethod("GET");//请求类型为GETif (connection.getResponseCode() == 200) {//网络连接成功fileSize = connection.getContentLength();}} catch (Exception e) {e.printStackTrace();} finally {try {if (connection != null) {connection.disconnect();}} catch (Exception e) {e.printStackTrace();}}}

第五步:

打开文件

1. 在布局文件中随便创建一个view,用来显示文档

TbsReaderView不支持在布局文件中创建,只能动态添加
mTbsReaderView = new TbsReaderView(this, new TbsReaderView.ReaderCallback() {@Overridepublic void onCallBackAction(Integer integer, Object o, Object o1) {}});prview.addView(mTbsReaderView, new LinearLayout.LayoutParams(-1, -1));

2. 缓存目录的创建,如果没有缓存目录,会报空指针异常,TbsReaderTemp

String tbsReaderTemp = Environment.getExternalStorageDirectory() + "/TbsReaderTemp";

打开文件的完整代码:

private void previewDoc() {mTbsReaderView = new TbsReaderView(this, new TbsReaderView.ReaderCallback() {@Overridepublic void onCallBackAction(Integer integer, Object o, Object o1) {}});prview.addView(mTbsReaderView, new LinearLayout.LayoutParams(-1, -1));String tbsReaderTemp = Environment.getExternalStorageDirectory() + "/TbsReaderTemp";Bundle bundle = new Bundle();bundle.putString("filePath", filePah);bundle.putString("tempPath", tbsReaderTemp);String fileType = item.getFileName().substring(item.getFileName().lastIndexOf(".") + 1);boolean result = mTbsReaderView.preOpen(fileType, false);if (result) {mTbsReaderView.openFile(bundle);} else {//前面任何一部出错,都可能导致文档打开失败}}

第六步:

关闭文档的时候一定要关闭TbsReaderView,否则再次打开文档失败。

if (mTbsReaderView != null) {mTbsReaderView.onStop();mTbsReaderView.destroyDrawingCache();}

ok.腾讯TBS打开文档的介绍到此介绍。

更多相关文章

  1. android media 播放器
  2. Android中JNI的使用之HelloWorld
  3. Android(安卓)resource linking failed AAPT: error: not well-f
  4. 如何在32位ubuntu11.10 下编译android 4.0.1源码和goldfish内核
  5. Android(安卓)permission 访问权限大全
  6. 安卓笔记android 本地Tomcat配置servlet的步骤和注意项
  7. SharePreferences源码分析(SharedPreferencesImpl)
  8. Android文件上传至服务器
  9. android 导出

随机推荐

  1. Android的生命周期 Start onResume
  2. android如何查看app数据(无root权限)
  3. Cocos2d-x 项目从VS移植到Android中的配
  4. [ADB]ADB(Android(安卓)Debug Bridge)简介
  5. Android(安卓)编译 C 库
  6. 电脑通过vnc控制android 手机
  7. Android(安卓)Studio长方体表面积计算器(
  8. 【Android(安卓)+ Java】简便的异步Http
  9. GreenDao 在 Android(安卓)Studio 中的配
  10. Android防止过快点击造成多次事件执行(防