情景
需要在Webview中打開系統文件選擇目錄。即網頁元素爲: < input tyoe=”file” />,點擊按鈕應該打開系統的文件選擇。
實現
1.重寫WebChromeClient 方法
在 Webview.setWebChromeClient() 方法傳入的參數 WebChromeClient 重寫 openFileChooser() 或者 onShowFileChooser() …,返回true,處理情景中的點擊事件,可以是打開系統文件、打開相機,比如下面的例子。
注意:這裏的重寫方法具體參照不同的SDK版本,下例只是適配了API 16+ 、API 21+,低版本應該現在也很少了。
/**
* 提供接口HTML調用系統相冊 API 16+
*
* @author fengzhen
* @version v1, 2017/4/5 18:10
*/
public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType, String capture) {
asw_file_message = uploadMsg;
Intent chooserIntent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
startActivityForResult(chooserIntent, asw_file_req);
}
/**
* 提供接口HTML調用系統相冊 API 21+
*
* @author fengzhen
* @version v1, 2017/4/5 18:10
*/
public boolean onShowFileChooser(WebView webView, ValueCallback<Uri[]> filePathCallback, WebChromeClient.FileChooserParams fileChooserParams) {
asw_file_path = filePathCallback;
// 直接調用系統相冊
Intent chooserIntent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
startActivityForResult(chooserIntent, asw_file_req);
return true;
}
});
2.處理選擇返回值
在onActivityResult()方法中處理返回值。
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode != Activity.RESULT_OK) return;
switch (requestCode) {
case asw_file_req:
// 結果處理
break;
}
}
3.Webview上傳文件沒有反應
單純像上面那樣處理,如果用戶在文件選擇按下返回鍵,會出現不能夠再次進入文件選擇的問題,需要在onActivityResult()添加如下代碼:
/**
* 文件選擇界面取消選擇圖片,解決返回之後不能選擇圖片的問題
*/
if (requestCode == asw_file_req && resultCode == RESULT_CANCELED) {
if (asw_file_path != null) {
asw_file_path.onReceiveValue(null);
asw_file_path = null;
}
if (asw_file_message != null) {
asw_file_message.onReceiveValue(null);
asw_file_message = null;
}
}