安卓手機中採用webview訪問OA系統,當OA中使用input=file的方式時,點選擇文件沒有反應,須要在WebChromeClient中增長openFileChooser方法;chrome瀏覽器input=file文件路徑出現c:\fakepath\,smartUpload上傳不成功的解決辦法;在WebView經過addView方式打開附件不能關閉的解決辦法android
在MainActivity中定義ValueCallback變量web
//在MainActivity中定義ValueCallback變量chrome
public ValueCallback<Uri> mUploadMessage;瀏覽器
//在MainActivity中增長setUploadMessage方法,提供給WebChromeClient調用服務器
public void setUploadMessage(ValueCallback<Uri> uploadMessage) {ide
mUploadMessage = uploadMessage;函數
}測試
在WebChromeClient實現類MyWebChromeClient中增長MainActivity變量this
//在MyWebChromeClient中增長MainActivity變量搜索引擎
public MainActivity mainActivity = null;
//增長MyWebChromeClient構造函數,傳入MainActivity
public MyWebChromeClient(MainActivity activity) {
mainActivity = activity;
}
修改MainActivity中新建WebChromeClient的方法
//onCreateView中,新建MyWebChromeClient時,傳入MainActivity
webView1.setWebChromeClient(
new MyWebChromeClient((MainActivity)this.getActivity()));
在MyWebChromeClient中實現openFileChooser
//For Android > 4.1.1
public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType, String capture) {
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.addCategory(Intent.CATEGORY_OPENABLE);
intent.setType("image/*");
//必需要把uploadMsg傳給MainActivity,不然沒法接收選中的文件
mainActivity.setUploadMessage(uploadMsg);
//打開選擇文件的窗口
mainActivity.startActivityForResult(Intent.createChooser(intent, "文件上傳"), 1);
}
//For Android 3.0+
public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType) {
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.addCategory(Intent.CATEGORY_OPENABLE);
intent.setType("image/*");
mainActivity.setUploadMessage(uploadMsg);
mainActivity.startActivityForResult(Intent.createChooser(intent, "文件上傳"), 1);
}
//For Android < 3.0
public void openFileChooser(ValueCallback<Uri> uploadMsg) {
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.addCategory(Intent.CATEGORY_OPENABLE);
intent.setType("image/*");
mainActivity.setUploadMessage(uploadMsg);
mainActivity.startActivityForResult(Intent.createChooser(intent, "文件上傳"), 1);
}
在MainActivity中增長onActivityResult
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
if (requestCode == 1) {
if (null == mUploadMessage) {
return;
}
Uri result = intent == null || resultCode != RESULT_OK ? null : intent.getData();
//接收選中的文件路徑
mUploadMessage.onReceiveValue(result);
mUploadMessage = null;
}
}
完成以上步驟已經,能夠實現選擇文件
使用SmartUpload保存文件沒有上傳到服務器的問題
這個功能採用IE瀏覽器訪問並上傳圖片是正常的,採用手機webview上傳文字能夠保存,圖片不能保存,在電腦上用chrome瀏覽器測試也不能保存。
測試發現chrome中使用input=file選擇文件時,只顯示文件名稱,用js獲取file的路徑是「c:\fakepath\」開頭,沒有顯示文件的真實路徑。雖然沒有顯示文件的真實路徑,其實沒有影響文件上傳的,問題出在SmartUpload的upload方法。
採用IE時獲取的filePath是完整的,smartUpload解析到文件名fileName,若是沒有fileName就continue。採用chrome時獲取的filePath就是文件名,相同的方法解析fileName就會爲空,天然就放棄上傳了。
如下是SmartUpload中update的相關部分。雖然SmartUpload原始版本有很多bug,這些年修修補補仍是很耐用的。
filePath = fileItem.getName();
if (filePath.equals("")) {
continue;
}
iLastIndex = filePath.lastIndexOf('\\');
if (filePath.length() > iLastIndex && iLastIndex > 0) {
fileName = filePath.substring(iLastIndex+1, filePath.length());// 獲取到文件的全名
}
if (fileName.equals("")) {
//continue;
//註釋掉continue,空時將filePath賦給fileName,修改後支持chrome
fileName = filePath;
}
在WebView中查看附件後關閉的問題
以前在MyWebChromeClient中實現了onCreateWindow方法,用來實現採用WebView的方式實現window.open彈出窗口,我打開附件是用_blank的鏈接方式,一樣被onCreateWindow攔截,而且採用WebView打開。悲劇的是window.open的頁面都有window.close的按鈕,附件卻沒有,打開的附件就一直在。
我用setOnLongClickListener方式,當長按時自動關閉。在MyWebChromeClient的onCreateWindow方法裏,實現:
newWebView.setOnLongClickListener(new WebView.OnLongClickListener() {
public boolean onLongClick(View v) {
newWebView.setVisibility(View.GONE);
newWebView.clearView();
return true;
}
});
我是用ADT,android4.0環境,測試機是三星Galaxy S4。網上的資料,你們都是抄來抄去,特別是中國的博客,搜索引擎搜出來的技術文章都大同小異。手機APP研究系列從1到8都是我本身通過代碼和測試機驗證後總結下來的,只是寫了一些要點,不過對於相關問題的解決應該能帶來一些幫助。