筆者最近兩個項目裏頭都有須要展現文件的功能,因而作了一番調研,發現asce1885給出一份方案,不過都是關於pdf的展現:www.jianshu.com/p/1bf49af65… 顯然不符合筆者的要求,筆者的項目裏須要展現的文件格式並不單一,後來通過一番搜索最後敲定使用騰訊的Tbs,能夠在應用內打開各種型文件。不過這過程也有點坑。html
騰訊瀏覽服務(TBS,Tencent Browsing Service)整合騰訊底層瀏覽技術和騰訊平臺資源及能力,提供總體瀏覽服務解決方案。TBS更多詳細的介紹,請移步:x5.tencent.com/tbs/android
關於接入Tbs服務官網給出了接入文檔:x5.tencent.com/tbs/guide/s… 很搞笑的是我找了好久也沒有發現具備打開文件能力demo工程,官網sdk裏頭的demo工程竟然都沒有展現文件功能,後來我發現官網論壇裏有很多朋友留言,不知如何使用SdK打開文件,所以本文主要將的是如何使用SDK打開文件,以及對sdk打開文件的功能的簡單封裝。git
參考:x5.tencent.com/tbs/guide/s…github
下載 SDK jar 包放到工程的libs目錄下bash
x5暫時不提供64位so文件,爲了保證64位手機能正常加載x5內核,進行如下兩項設置:
(1)打開對應module中的build.gradle文件,在文件的android{}中的defaultConfig{}裏(若是沒有defaultConfig{}則手動添加)添加以下配置: ndk{abiFilters "armeabi"}網絡
顯示文件關鍵代碼,例如:ide
Bundle localBundle = new Bundle();
localBundle.putString("filePath", mFile.toString());
localBundle.putString("tempPath", Environment.getExternalStorageDirectory() + "/" + "TbsReaderTemp");
if (this.mTbsReaderView == null)
this.mTbsReaderView = getTbsReaderView(context);
boolean bool = this.mTbsReaderView.preOpen(getFileType(mFile.toString()), false);
if (bool) {
this.mTbsReaderView.openFile(localBundle);
}複製代碼
TbsReaderView是封裝的用於展現文件的View,繼承與FramLayout,首先調用mTbsReaderView.preOpen(getFileType(mFile.toString()), false)進行文件打開以前的初始化工做,而後調用的mTbsReaderView.openFile(localBundle)打開文件,localBundle裏包含有文件在本地的路徑,加載文件步驟十分簡單,其中的加載任務所有交由tbs內核完成。gradle
有時候可能須要加載網絡文件,可是tbs目前是暫時不支持在線預覽的,所以是須要使用網絡將文件下載下來以後在展現,所以筆者這裏對獲取文件路徑這一部分進行封裝,以下:ui
public void show() {
if(mOnGetFilePathListener!=null){
mOnGetFilePathListener.onGetFilePath(this);
}
}
/***
* 將獲取File路徑的工做,「外包」出去
*/
public interface OnGetFilePathListener {
void onGetFilePath(SuperFileView2 mSuperFileView2);
}複製代碼
TbsReaderView是上面的SuperFileView2的子View,完整使用以下:this
mSuperFileView = (SuperFileView2) findViewById(R.id.mSuperFileView);
//設置獲取文件路徑監聽
mSuperFileView.setOnGetFilePathListener(new SuperFileView2.OnGetFilePathListener() {
@Override
public void onGetFilePath(SuperFileView2 mSuperFileView2) {
getFilePathAndShowFile(mSuperFileView2);
}
});
Intent intent = this.getIntent();
String path = (String) intent.getSerializableExtra("path");
if (!TextUtils.isEmpty(path)) {
TLog.d(TAG, "文件path:" + path);
setFilePath(path);
}
mSuperFileView.show();複製代碼