• Android应用内展示office文件--腾讯浏览服务(TBS)


    什么是TBS

     依托 X5 内核强大的能力,致力于提供优化移动端浏览体验的整套解决方案(官网介绍)。我们可利用其做文件浏览功能,支持多种文件格式,完全可以满足需求。更多介绍请看官网:http://x5.tencent.com/

    接入TBS

    TBS只能浏览本地文件,对于远程文件需要先进行下载,我们先看浏览本地文件如何实现。

    1. 下载SDKhttp://x5.tencent.com/tbs/sdk.html,将示例中lib下的jar文件 和 jniLibs下的so文件 copy至自己的项目中。 


    注: 
    如果jar包没有加载成功,则File–>Project Structure,点击+号加入jar包 
     
    如果so文件是放置于 libs 目录下,需要在 app/build.gradle中指定路径:

     android {
        ...
        sourceSets {
            main {
                jniLibs.srcDirs = ['libs']
            }
        }
     }

      

    2. 使用

      这里主要使用到了TbsReaderView类,并且给Activity实现ReaderCallback接口,并且实现其接口方法(可以不处理,但是需实现)。初始化TbsReaderView需要动态构建,如下:

     mTbsReaderView = new TbsReaderView(this, this);
     //rl_tbsView为装载TbsReaderView的视图
     rl_tbsView.addView(mTbsReaderView, new RelativeLayout.LayoutParams(
              ViewGroup.LayoutParams.MATCH_PARENT,
              ViewGroup.LayoutParams.MATCH_PARENT));
    
    

     打开本地文件:通过 Bundle 类型参数的形式向 TbsReaderView 对象传递文件地址和另一个临时目录地址。

     Bundle bundle = new Bundle();
     bundle.putString("filePath", getLocalFile().getPath());
     bundle.putString("tempPath", Environment.getExternalStorageDirectory()
                    .getPath());
     boolean result = mTbsReaderView.preOpen(parseFormat(mFileName), false);
     if (result) {
         mTbsReaderView.openFile(bundle);
     }

    3. 添加权限

    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.DOWNLOAD_WITHOUT_NOTIFICATION"/>
    <uses-permission android:name="android.permission.ACCESS_DOWNLOAD_MANAGER"/>
    <uses-permission android:name="android.permission.WRITE_SETTINGS"/>
    <uses-permission android:name="android.permission.READ_PHONE_STATE"/>

    下载远程文件

     利用系统提供的 DownloadManager 类来实现下载,并使用 ContentObserver 类监听下载进度,在其回调方法 onChange() 中可查询下载进度:

     private class DownloadObserver extends ContentObserver {
         @Override
         public void onChange(boolean selfChange, Uri uri) {
             //查询下载进度,使用DownloadManager.Query
         }
     }

      

    效果图

      



    注:某些机型可能预览失败, 可能是so文件无法适应64位机型,需在build.gradle下的defaultConfig{}中加入:

       ndk {
           abiFilters "armeabi", "armeabi-v7a", "x86", "mips"
       }

    某些机型可能无法下载含有中文路径的文件,可进行转码处理:

        /**
         * 将url进行encode,解决部分手机无法下载含有中文url的文件的问题(如OPPO R9)
         *
         * @param url
         * @return
         * @author xch
         */
        private String toUtf8String(String url) {
            StringBuffer sb = new StringBuffer();
            for (int i = 0; i < url.length(); i++) {
                char c = url.charAt(i);
                if (c >= 0 && c <= 255) {
                    sb.append(c);
                } else {
                    byte[] b;
                    try {
                        b = String.valueOf(c).getBytes("utf-8");
                    } catch (Exception ex) {
                        System.out.println(ex);
                        b = new byte[0];
                    }
                    for (int j = 0; j < b.length; j++) {
                        int k = b[j];
                        if (k < 0)
                            k += 256;
                        sb.append("%" + Integer.toHexString(k).toUpperCase());
                    }
                }
            }
            return sb.toString();
        }

    源码已上传至GitHub,需要的可以下载:https://github.com/yangxch/TBSFileBrowsing

    转载请注明:https://www.cnblogs.com/xch-yang/p/9361305.html 

     


      更多技术干货,欢迎关注我的公众号:ChaoYoung

  • 相关阅读:
    合并区间
    编程团体赛
    寻找数组的中间位置
    翻转链表2
    链表翻转
    CF1237H. Balanced Reversals
    arc108E
    agc028D
    CF1446D. Frequency Problem
    CF1439D. INOI Final Contests
  • 原文地址:https://www.cnblogs.com/xch-yang/p/9361305.html
Copyright © 2020-2023  润新知