前言
鵝廠的東西確實是好東西席爽,文檔也確實真的爛
x5WebView加載本地文檔
x5是騰訊用來替代Andorid系統(tǒng)webview,具備打開本地文檔的功能戳晌。具體文檔請移步:https://x5.tencent.com/tbs/index.html
首先接入x5
打開文檔的核心代碼
public void openFile(Activity activity, String path) {
if (tbsReaderView == null) {
tbsReaderView = new TbsReaderView(activity, new TbsReaderView.ReaderCallback() {
@Override
public void onCallBackAction(Integer integer, Object o, Object o1) {
}
});
addView(tbsReaderView, new LinearLayout.LayoutParams(-1, -1));
}
String bsReaderTemp = "/storage/emulated/0/TbsReaderTemp";
File bsReaderTempFile = new File(bsReaderTemp);
if (!bsReaderTempFile.exists()) {
boolean mkdir = bsReaderTempFile.mkdir();
if (!mkdir) {
Toast.makeText(getContext(), "發(fā)生了錯誤秒旋,請稍后重試", Toast.LENGTH_SHORT).show();
return;
}
}
//加載文件
Bundle localBundle = new Bundle();
localBundle.putString("filePath", path);
localBundle.putString("tempPath", Environment.getExternalStorageDirectory() + "/" +
"TbsReaderTemp");
boolean canOpen = tbsReaderView.preOpen(getFileType(path), false);
if (canOpen) {
tbsReaderView.openFile(localBundle);
} else {
Toast.makeText(getContext(), "無法打開此文件", Toast.LENGTH_SHORT).show();
}
}
注意 SDK提供的TbsReaderView無法在xml中直接使用,如果在xml中實例化會報錯裳涛,其構(gòu)造方法要求context必須是Activity
源碼如下:
public TbsReaderView(Context var1, TbsReaderView.ReaderCallback var2) {
super(var1.getApplicationContext());
if (!(var1 instanceof Activity)) {
throw new RuntimeException("error: unexpect context(none Activity)");
} else {
this.d = var2;
this.a = var1;
this.e = new bg(this);
}
}
我封裝了一個view
上代碼
public class DocPreview extends FrameLayout {
private TbsReaderView tbsReaderView;
public DocPreview(Context context) {
this(context, null);
}
public DocPreview(Context context, AttributeSet attrs) {
this(context, attrs, -1);
}
public DocPreview(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
public static void init(final Context context) {
QbSdk.initX5Environment(context, new QbSdk.PreInitCallback() {
@Override
public void onCoreInitFinished() {
}
@Override
public void onViewInitFinished(boolean b) {
Toast.makeText(context, "加載" + b, Toast.LENGTH_SHORT).show();
}
});
}
public void openFile(Activity activity, String path) {
if (tbsReaderView == null) {
tbsReaderView = new TbsReaderView(activity, new TbsReaderView.ReaderCallback() {
@Override
public void onCallBackAction(Integer integer, Object o, Object o1) {
}
});
addView(tbsReaderView, new LinearLayout.LayoutParams(-1, -1));
}
String bsReaderTemp = "/storage/emulated/0/TbsReaderTemp";
File bsReaderTempFile = new File(bsReaderTemp);
if (!bsReaderTempFile.exists()) {
boolean mkdir = bsReaderTempFile.mkdir();
if (!mkdir) {
Toast.makeText(getContext(), "發(fā)生了錯誤木张,請稍后重試", Toast.LENGTH_SHORT).show();
return;
}
}
//加載文件
Bundle localBundle = new Bundle();
localBundle.putString("filePath", path);
localBundle.putString("tempPath", Environment.getExternalStorageDirectory() + "/" +
"TbsReaderTemp");
boolean canOpen = tbsReaderView.preOpen(getFileType(path), false);
if (canOpen) {
tbsReaderView.openFile(localBundle);
} else {
Toast.makeText(getContext(), "無法打開此文件", Toast.LENGTH_SHORT).show();
}
}
/***
* 獲取文件類型
*
* @param paramString
* @return
*/
private String getFileType(String paramString) {
String str = "";
if (TextUtils.isEmpty(paramString)) {
return str;
}
int i = paramString.lastIndexOf('.');
if (i <= -1) {
return str;
}
str = paramString.substring(i + 1);
return str;
}
public void onDestroy() {
if (tbsReaderView != null) {
tbsReaderView.onStop();
}
}
}
在使用前請先調(diào)用init 初始化 ,還有注意關(guān)閉頁面的時候調(diào)用onDestroy()
這里有幾個坑,使用的時候一定要注意已經(jīng)申請了讀寫權(quán)限端三,第一次加載的時候需要下載文檔插件也要注意一定要在可以上網(wǎng)的環(huán)境舷礼,我在集成的時候做測試的時候一遍就通了完全沒問題,但是集成到項目里的時候初始化總是失敗郊闯,后來反復刪了幾遍有稀里糊涂好了妻献。
我把DocPreview做成了一個module,如果集成過程中出現(xiàn)各種奇怪錯誤团赁,可以直接下載DocPreview然后依賴育拨。
相關(guān)資料
Android應用內(nèi)展示word、excel欢摄、pdf熬丧、ppt等文件
superFileView
Android 展示本地或網(wǎng)絡(luò)pdf文件