android TBS预览文件

xiaoxiao2021-03-01  23

由于项目的需求,要求在手机端预览附件(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" }

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

<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; } }

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

谢谢~~

转载请注明原文地址: https://www.6miu.com/read-4200050.html

最新回复(0)