什么是TBS
依托 X5 內核強大的能力,致力於提供優化移動端瀏覽體驗的整套解決方案(官網介紹)。我們可利用其做文件瀏覽功能,支持多種文件格式,完全可以滿足需求。更多介紹請看官網:http://x5.tencent.com/
接入TBS
TBS只能瀏覽本地文件,對於遠程文件需要先進行下載,我們先看瀏覽本地文件如何實現。
1. 下載SDK:http://x5.tencent.com/tbs/sdk.html,將示例中lib下的jar文件 和 jniLibs下的so文件 copy至自己的項目中。
注:
如果jar包沒有加載成功,則File–>Project Structure,點擊+號加入jar包
如果so文件是放置於 libs 目錄下,需要在 app/build.gradle中指定路徑:
android { ... sourceSets { main { jniLibs.srcDirs = ['libs'] } } }
2. 使用
這里主要使用到了TbsReaderView類,並且給Activity實現ReaderCallback接口,並且實現其接口方法(可以不處理,但是需實現)。初始化TbsReaderView需要動態構建,如下:
mTbsReaderView = new TbsReaderView(this, this); //rl_tbsView為裝載TbsReaderView的視圖
rl_tbsView.addView(mTbsReaderView, new RelativeLayout.LayoutParams( ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
打開本地文件:通過 Bundle 類型參數的形式向 TbsReaderView 對象傳遞文件地址和另一個臨時目錄地址。
Bundle bundle = new Bundle(); bundle.putString("filePath", getLocalFile().getPath()); bundle.putString("tempPath", Environment.getExternalStorageDirectory() .getPath()); boolean result = mTbsReaderView.preOpen(parseFormat(mFileName), false); if (result) { mTbsReaderView.openFile(bundle); }
3. 添加權限
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.DOWNLOAD_WITHOUT_NOTIFICATION"/> <uses-permission android:name="android.permission.ACCESS_DOWNLOAD_MANAGER"/> <uses-permission android:name="android.permission.WRITE_SETTINGS"/> <uses-permission android:name="android.permission.READ_PHONE_STATE"/>
下載遠程文件
利用系統提供的 DownloadManager 類來實現下載,並使用 ContentObserver 類監聽下載進度,在其回調方法 onChange() 中可查詢下載進度:
private class DownloadObserver extends ContentObserver { @Override public void onChange(boolean selfChange, Uri uri) { //查詢下載進度,使用DownloadManager.Query
} }
效果圖



注:某些機型可能預覽失敗, 可能是so文件無法適應64位機型,需在build.gradle下的defaultConfig{}中加入:
ndk { abiFilters "armeabi", "armeabi-v7a", "x86", "mips" }
某些機型可能無法下載含有中文路徑的文件,可進行轉碼處理:
/** * 將url進行encode,解決部分手機無法下載含有中文url的文件的問題(如OPPO R9) * * @param url * @return * @author xch */
private String toUtf8String(String url) { StringBuffer sb = new StringBuffer(); for (int i = 0; i < url.length(); i++) { char c = url.charAt(i); if (c >= 0 && c <= 255) { sb.append(c); } else { byte[] b; try { b = String.valueOf(c).getBytes("utf-8"); } catch (Exception ex) { System.out.println(ex); b = new byte[0]; } for (int j = 0; j < b.length; j++) { int k = b[j]; if (k < 0) k += 256; sb.append("%" + Integer.toHexString(k).toUpperCase()); } } } return sb.toString(); }
源碼已上傳至GitHub,需要的可以下載:https://github.com/yangxch/TBSFileBrowsing
轉載請注明:https://www.cnblogs.com/xch-yang/p/9361305.html
更多技術干貨,歡迎關注我的公眾號:ChaoYoung