android TBS预览文件

由于项目的需求,要求在手机端预览附件(xls、doc、ptf等)。文件格式不限,刚开始ios端很方便的将文件的url地址放到webview中,就可以直接在线预览,但是android端的webview真的是太不给力了,不能直接预览就算了,还要做很多的处理(不同的格式文件要不同的处理),真的心累。后来朋友推荐我使用马哥的TBS,他们项目中就用的这个,心想,既然是马哥的,那肯定好使喽。

好了。废话不多说了,下来就开始TBS文件预览了,但提前说一下,

1、TBS只能预览本地的文件,不能直接预览服务器上的文件,所以我们还需要将文件下载,然后找到本地的路径,再进行预览

2、TBS是腾讯版的WebView,但是加载网页与加载文件是不同的api,这一点要注意

3、TBS使用的x5内核,只要手机上安装了QQ、微信、或者QQ浏览器,这些腾讯的都有,到时候,只需要下载插件就可以了

下面就是加载xls的文件了,可以看一下效果

感觉还是可以的。

好了,接下来就是集成步骤了,一步一步来,完美运行。

一:首先下载官方的SDK,https://x5.tencent.com/tbs/sdk.html 

直接下载完整版的就可以了。

下载完成后,其中有一个jar包(我把名字改了,很长的一个名字),将其导入Android Studio工程。

其中有AS的demon压缩包,其中有一个jniLibs文件,直接将其拷贝到src/main目录下

二:配置支持64位的手机x5,在本项目的build.glide中添加如下代码:

(需要AS有ndk的配置https://mp.csdn.net/postedit/78803593,不知道没有配置有没有问题,这个没有测试,但是直觉告诉我还是配上的好,^_^)

//X5兼容64位手机
        ndk { abiFilters "armeabi", "armeabi-v7a", "x86", "mips" }

三:添加如下的权限:(没有权限可是不行的) 

 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
 <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
 <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
 <uses-permission android:name="android.permission.READ_PHONE_STATE" />
 <uses-permission android:name="android.permission.INTERNET" />

四:接下来就是代码了,直接拷贝就可以了

1、首先在application中初始化(其中下载文件我用的xUtils3,这个导入一个依赖就可以了),记得在清单文件中进行配置

app.class:

package management.project.tbswebviewtext;

import android.app.Application;
import android.util.Log;

import com.tencent.smtt.sdk.QbSdk;
import com.tencent.smtt.sdk.TbsListener;

import org.xutils.x;

/**
 * Created by 笔片 on 2018/8/6.
 */

public class app extends Application{

    @Override
    public void onCreate() {
        super.onCreate();

        x.Ext.init(this);
        x.Ext.setDebug(false); //输出debug日志,开启会影响性能

        //搜集本地tbs内核信息并上报服务器,服务器返回结果决定使用哪个内核。
        QbSdk.setDownloadWithoutWifi(true);//非wifi条件下允许下载X5内核

        QbSdk.PreInitCallback cb = new QbSdk.PreInitCallback() {
            @Override
            public void onCoreInitFinished() {

            }

            @Override
            public void onViewInitFinished(boolean b) {
                Log.e("apptbs", " onViewInitFinished is " + b);
            }
        };

        QbSdk.setTbsListener(new TbsListener() {
            @Override
            public void onDownloadFinish(int i) {
                Log.d("apptbs", "onDownloadFinish");
            }

            @Override
            public void onInstallFinish(int i) {
                Log.d("apptbs", "onInstallFinish");
            }

            @Override
            public void onDownloadProgress(int i) {
                Log.d("apptbs", "onDownloadProgress:" + i);
            }
        });

        QbSdk.initX5Environment(getApplicationContext(), cb);

    }
}

2、我们的WebView.class

package management.project.tbswebviewtext;

import android.graphics.Color;
import android.os.Environment;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.text.TextUtils;
import android.util.Log;
import android.widget.ProgressBar;
import android.widget.RelativeLayout;
import android.widget.Toast;

import com.tencent.smtt.sdk.TbsReaderView;

import org.xutils.common.Callback;
import org.xutils.http.RequestParams;
import org.xutils.x;

import java.io.File;
import java.text.SimpleDateFormat;

public class WebActivity extends AppCompatActivity implements TbsReaderView.ReaderCallback {

    ProgressBar web_bar;
    TbsReaderView mTbsReaderView;
    RelativeLayout mRelativeLayout;

    // 文件的下载路径
    private static final String BASE_URL = "http://192.168.200.15:8088/xmgl/userfiles/upload/files/201807310923533619.xls";
    //    private static final String BASE_URL = "http://192.168.200.15:8088/xmgl//userfiles/upload/files/20180803143620366.doc";
//    private static final String BASE_URL = "http://192.168.200.15:8088/xmgl//userfiles/upload/files/201808061834294755.pdf";

    // 文件的存储路径
    private String BASE_PATH = Environment.getExternalStorageDirectory().toString() + "/00文件存储/";
    private String docName;


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

        // 在代码中添加布局,这个我也不知道什么原因,网上很多人都说在布局文件中加载会出错

        mTbsReaderView = new TbsReaderView(this, this);
        mRelativeLayout = findViewById(R.id.tbsView);
        mRelativeLayout.addView(mTbsReaderView, new RelativeLayout.LayoutParams(-1, -1));

        // 日期
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        String date = sdf.format(new java.util.Date());
        Log.d("success", "===" + date);

        // 给存储的文件添加后缀名,
        String fileType = getFileType(BASE_URL);
        BASE_PATH = BASE_PATH + date + "." + fileType;

        initDoc();


        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        web_bar = (ProgressBar) findViewById(R.id.web_bar);
        web_bar.getProgressDrawable().setColorFilter(Color.RED,
                android.graphics.PorterDuff.Mode.SRC_IN);


    }

    private void downloadFile(final String url, final String path) {
        RequestParams requestParams = new RequestParams(url);
        requestParams.setSaveFilePath(path);
        // 下载完成后自动为文件命名
        requestParams.setAutoRename(true);
        x.http().get(requestParams, new Callback.CacheCallback<File>() {
            @Override
            public boolean onCache(File result) {
                return false;
            }

            @Override
            public void onSuccess(File result) {
                Log.d("success", "下载成功" + path);
                // 下载成功后加载文件
                displayFile(BASE_PATH, docName);

            }

            @Override
            public void onError(Throwable ex, boolean isOnCallback) {
                Log.d("success", "下载失败" + ex.getMessage().toString());
                Toast.makeText(WebActivity.this, "文件下载失败", Toast.LENGTH_SHORT).show();
            }

            @Override
            public void onCancelled(CancelledException cex) {

            }

            @Override
            public void onFinished() {

            }
        });
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        mTbsReaderView.onStop();
    }

    private void initDoc() {
        int i = BASE_URL.lastIndexOf("/");
        docName = BASE_URL.substring(i, BASE_URL.length());
        Log.d("print", "---substring---" + docName);
        // 下载文件
        downloadFile(BASE_URL, BASE_PATH);


    }


    @Override
    public void onCallBackAction(Integer integer, Object o, Object o1) {
        Log.d("call", "==================+++++====-=-=++" + integer);
    }

    private void displayFile(String filePath, String fileName) {

        //增加下面一句解决没有TbsReaderTemp文件夹存在导致加载文件失败
        String bsReaderTemp = BASE_PATH;
        File bsReaderTempFile = new File(bsReaderTemp);
        if (!bsReaderTempFile.exists()) {
            Log.d("print", "准备创建/TbsReaderTemp!!");
            boolean mkdir = bsReaderTempFile.mkdir();
            if (!mkdir) {
                Log.d("print", "创建/TbsReaderTemp失败!!!!!");
            }
        }
        Bundle bundle = new Bundle();
        bundle.putString("filePath", filePath);
        bundle.putString("tempPath", BASE_PATH);
        boolean result = mTbsReaderView.preOpen(getFileType(fileName), false);
        Log.d("print", "查看文档---" + result);
        if (result) {
            mTbsReaderView.openFile(bundle);
        } else {

        }
    }

    /**
     * 后缀名的判断
     *
     * @param paramString
     * @return
     */
    private String getFileType(String paramString) {
        String str = "";

        if (TextUtils.isEmpty(paramString)) {
            Log.d("print", "paramString---->null");
            return str;
        }
        Log.d("print", "paramString:" + paramString);
        int i = paramString.lastIndexOf('.');
        if (i <= -1) {
            Log.d("print", "i <= -1");
            return str;
        }

        str = paramString.substring(i + 1);
        Log.d("print", "paramString.substring(i + 1)------>" + str);
        return str;
    }


}

好了,到这里就结束了,其中在文件存储路径这一块,要注意,因为如果加载的时候找不到该路径下的文件,就会加载不出来

谢谢~~

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值