由于项目的需求,要求在手机端预览附件(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 Status工程。
其中有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" }
三:添加如下的权限:(没有权限可是不行的)
四:接下来就是代码了,直接拷贝就可以了
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() {
@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;
}
}
好了,到这里就结束了,其中在文件存储路径这一块,要注意,因为如果加载的时候找不到该路径下的文件,就会加载不出来
谢谢~~