Android使用TBS浏览器加载pdf等文件

简介: 版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qingfeng812/article/details/79077350 项目结构技术方案TBS的其它优点,可以自行搜索网上其它资料,很多。
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qingfeng812/article/details/79077350

项目结构

Android配置TBS服务

技术方案

  • TBS的其它优点,可以自行搜索网上其它资料,很多。
  • 加载文件核心类是 TbsReaderView,腾讯文档没有写,所以需要查找网上资料。
  • TBS目前只支持加载本地文件。所以远程文件需要先下载,后用TBS加载文件显示。
  • 负责加载和显示文件的界面,离开本界面之后务必需要销毁,否则再次加载文件无法加载成功,会一直显示加载文件进度条。
  • 关键代码:

    mTbsReaderView.onStop();//销毁界面的时候一定要加上,否则后面加载文件会发生异常。

  • 完整项目源码
package com.yifeng.sample.tbs;
    import android.app.DownloadManager;
    import android.app.DownloadManager.Request;
    import android.content.Intent;
    import android.database.ContentObserver;
    import android.database.Cursor;
    import android.net.Uri;
    import android.os.Bundle;
    import android.os.Environment;
    import android.os.Handler;
    import android.support.v7.app.AppCompatActivity;
    import android.text.TextUtils;
    import android.util.Log;
    import android.view.View;
    import android.view.ViewGroup.LayoutParams;
    import android.widget.Button;
    import android.widget.RelativeLayout;

    import com.tencent.smtt.sdk.TbsReaderView;
    import com.tencent.smtt.sdk.TbsReaderView.ReaderCallback;

    import java.io.File;

    public class MainActivity extends AppCompatActivity implements ReaderCallback {

      private TbsReaderView mTbsReaderView;
      private Button mDownloadBtn;

      private DownloadManager mDownloadManager;
      private long mRequestId;
      private DownloadObserver mDownloadObserver;
      private String mFileUrl = "http://www.beijing.gov.cn/zhuanti/ggfw/htsfwbxzzt/shxfl/fw/P020150720516332194302.doc";
      private String mFileName;

      @Override
      protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mTbsReaderView = new TbsReaderView(this, this);
        mDownloadBtn = (Button) findViewById(R.id.btn_download);
        RelativeLayout rootRl = (RelativeLayout) findViewById(R.id.rl_root);
        rootRl.addView(mTbsReaderView, new RelativeLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));

        mFileName = parseName(mFileUrl);
        if (isLocalExist()) {
          mDownloadBtn.setText("打开文件");
        }

        if (isLocalExist()) {
          mDownloadBtn.setVisibility(View.GONE);
          displayFile();
        } else {
          startDownload();
        }
      }

      @Override
      public void onBackPressed() {
        startActivity(new Intent(MainActivity.this,IndexActivity.class));
        finish();//不关掉此界面,之后加载文件会无法加载
      }

      public void onClickDownload(View v) {
    //    if (isLocalExist()) {
    //      mDownloadBtn.setVisibility(View.GONE);
    //      displayFile();
    //    } else {
    //      startDownload();
    //    }
      }

      private void displayFile() {
        Bundle bundle = new Bundle();
        bundle.putString("filePath", "/storage/emulated/0/uu/HTTP权威指南.pdf");
        bundle.putString("tempPath", Environment.getExternalStorageDirectory().getPath());
        boolean result = mTbsReaderView.preOpen(parseFormat("HTTP权威指南.pdf"), false);
        if (result) {
          mTbsReaderView.openFile(bundle);
        }
      }

      private String parseFormat(String fileName) {
        return fileName.substring(fileName.lastIndexOf(".") + 1);
      }

      private String parseName(String url) {
        String fileName = null;
        try {
          fileName = url.substring(url.lastIndexOf("/") + 1);
        } finally {
          if (TextUtils.isEmpty(fileName)) {
            fileName = String.valueOf(System.currentTimeMillis());
          }
        }
        return fileName;
      }

      private boolean isLocalExist() {
        return getLocalFile().exists();
      }

      private File getLocalFile() {
        return new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS), mFileName);
      }

      private void startDownload() {
        mDownloadObserver = new DownloadObserver(new Handler());
        getContentResolver().registerContentObserver(Uri.parse("content://downloads/my_downloads"), true, mDownloadObserver);

        mDownloadManager = (DownloadManager) getSystemService(DOWNLOAD_SERVICE);
        DownloadManager.Request request = new DownloadManager.Request(Uri.parse(mFileUrl));
        request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, mFileName);
        request.allowScanningByMediaScanner();
        request.setNotificationVisibility(Request.VISIBILITY_HIDDEN);
        mRequestId = mDownloadManager.enqueue(request);
      }

      private void queryDownloadStatus() {
        DownloadManager.Query query = new DownloadManager.Query().setFilterById(mRequestId);
        Cursor cursor = null;
        try {
          cursor = mDownloadManager.query(query);
          if (cursor != null && cursor.moveToFirst()) {
            //已经下载的字节数
            int currentBytes = cursor.getInt(cursor.getColumnIndexOrThrow(DownloadManager.COLUMN_BYTES_DOWNLOADED_SO_FAR));
            //总需下载的字节数
            int totalBytes = cursor.getInt(cursor.getColumnIndexOrThrow(DownloadManager.COLUMN_TOTAL_SIZE_BYTES));
            //状态所在的列索引
            int status = cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_STATUS));
            Log.i("downloadUpdate: ", currentBytes + " " + totalBytes + " " + status);
            mDownloadBtn.setText("正在下载:" + currentBytes + "/" + totalBytes);
            if (DownloadManager.STATUS_SUCCESSFUL == status && mDownloadBtn.getVisibility() == View.VISIBLE) {
              mDownloadBtn.setVisibility(View.GONE);
              mDownloadBtn.performClick();
            }
          }
        } finally {
          if (cursor != null) {
            cursor.close();
          }
        }
      }

      @Override
      public void onCallBackAction(Integer integer, Object o, Object o1) {

      }

      @Override
      protected void onDestroy() {
        super.onDestroy();
        mTbsReaderView.onStop();
        if (mDownloadObserver != null) {
          getContentResolver().unregisterContentObserver(mDownloadObserver);
        }
      }

      private class DownloadObserver extends ContentObserver {

        private DownloadObserver(Handler handler) {
          super(handler);
        }

        @Override
        public void onChange(boolean selfChange, Uri uri) {
          Log.i("downloadUpdate: ", "onChange(boolean selfChange, Uri uri)");
          queryDownloadStatus();
        }
      }
    }
相关文章
|
2月前
|
ARouter Android开发
Android不同module布局文件重名被覆盖
Android不同module布局文件重名被覆盖
|
8天前
|
人工智能 文字识别 数据挖掘
MarkItDown:微软开源的多格式转Markdown工具,支持将PDF、Word、图像和音频等文件转换为Markdown格式
MarkItDown 是微软开源的多功能文档转换工具,支持将 PDF、PPT、Word、Excel、图像、音频等多种格式的文件转换为 Markdown 格式,具备 OCR 文字识别、语音转文字和元数据提取等功能。
74 9
MarkItDown:微软开源的多格式转Markdown工具,支持将PDF、Word、图像和音频等文件转换为Markdown格式
|
1月前
|
缓存 监控 前端开发
在资源加载优化中,如何利用浏览器缓存提升性能?
通过以上这些方法,可以有效地利用浏览器缓存来提升资源加载的性能,减少网络请求次数,提高用户体验和应用的响应速度。同时,需要根据具体的应用场景和资源特点进行灵活调整和优化,以达到最佳的效果。此外,随着技术的不断发展和变化,还需要持续关注和学习新的缓存优化方法和策略。
93 53
|
11天前
|
JavaScript
jquery图片和pdf文件预览插件
EZView.js是一款jquery图片和pdf文件预览插件。EZView.js可以为图片和pdf格式文件生成在线预览效果。支持的文件格式有pdf、jpg、 png、jpeg、gif。
41 16
|
1月前
|
Web App开发 缓存 安全
WIN11 Chrome 双击打不开闪退及Chrome浏览器不能拖拽文件crx
【11月更文挑战第6天】本文介绍了 WIN11 系统中 Chrome 浏览器双击打不开闪退及不能拖拽文件 crx 的原因和解决方法。包括浏览器版本过旧、扩展程序冲突、硬件加速问题、缓存过多、安全软件冲突、系统文件损坏、用户配置文件损坏等问题的解决方案,以及 crx 文件的屏蔽、权限问题和文件格式问题的处理方法。
127 2
|
2月前
|
Android开发 UED
Android 中加载 Gif 动画
【10月更文挑战第20天】加载 Gif 动画是 Android 开发中的一项重要技能。通过使用第三方库或自定义实现,可以方便地在应用中展示生动的 Gif 动画。在实际应用中,需要根据具体情况进行合理选择和优化,以确保用户体验和性能的平衡。可以通过不断的实践和探索,进一步掌握在 Android 中加载 Gif 动画的技巧和方法,为开发高质量的 Android 应用提供支持。
|
2月前
|
Java Apache Maven
将word文档转换成pdf文件方法
在Java中,将Word文档转换为PDF文件可采用多种方法:1) 使用Apache POI和iText库,适合处理基本转换需求;2) Aspose.Words for Java,提供更高级的功能和性能;3) 利用LibreOffice命令行工具,适用于需要开源解决方案的场景。每种方法都有其适用范围,可根据具体需求选择。
|
2月前
|
Java Apache Maven
Java将word文档转换成pdf文件的方法?
【10月更文挑战第13天】Java将word文档转换成pdf文件的方法?
536 1
|
2月前
|
索引 Python
PDF文件页面提取操作小指南
PDF文件页面提取操作小指南
101 4
|
2月前
|
计算机视觉 Python
Python操作PDF文件
Python操作PDF文件
41 1