筆者最近兩個專案裡頭都有需要展示檔案的功能,於是做了一番調研,發現asce1885給出一份方案,不過都是關於pdf的展示:www.jianshu.com/p/1bf49af65… 顯然不符合筆者的要求,筆者的專案裡需要展示的檔案格式並不單一,後來經過一番搜尋最後敲定使用騰訊的Tbs,可以在應用內開啟各型別檔案。不過這過程也有點坑。
什麼是Tbs
騰訊瀏覽服務(TBS,Tencent Browsing Service)整合騰訊底層瀏覽技術和騰訊平臺資源及能力,提供整體瀏覽服務解決方案。TBS更多詳細的介紹,請移步:x5.tencent.com/tbs/
關於官網接入的坑
關於接入Tbs服務官網給出了接入文件:x5.tencent.com/tbs/guide/s… 很搞笑的是我找了很久也沒有發現具有開啟檔案能力demo工程,官網sdk裡頭的demo工程居然都沒有展示檔案功能,後來我發現官網論壇裡有不少朋友留言,不知如何使用SdK開啟檔案,因此本文主要將的是如何使用SDK開啟檔案,以及對sdk開啟檔案的功能的簡單封裝。
如何接入
參考:x5.tencent.com/tbs/guide/s…
- 第一步
下載 SDK jar 包放到工程的libs目錄下
- 第二步
x5暫時不提供64位so檔案,為了保證64位手機能正常載入x5核心,進行以下兩項設定:
(1)開啟對應module中的build.gradle檔案,在檔案的android{}中的defaultConfig{}裡(如果沒有defaultConfig{}則手動新增)新增如下配置: ndk{abiFilters "armeabi"}
(2)新增對應目錄下的liblbs.so檔案
如何展示檔案
顯示檔案關鍵程式碼,例如:
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核心完成。
簡單封裝
有時候可能需要載入網路檔案,但是tbs目前是暫時不支援線上預覽的,因此是需要使用網路將檔案下載下來之後在展示,因此筆者這裡對獲取檔案路徑這一部分進行封裝,如下:
public void show() {
if(mOnGetFilePathListener!=null){
mOnGetFilePathListener.onGetFilePath(this);
}
}
/***
* 將獲取File路徑的工作,“外包”出去
*/
public interface OnGetFilePathListener {
void onGetFilePath(SuperFileView2 mSuperFileView2);
}複製程式碼
TbsReaderView是上面的SuperFileView2的子View,完整使用如下:
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();複製程式碼