隨着現在混合開發非常的普遍,很多html界面上會進行圖片和文件等的上傳,界面嵌套進android後,會發現無法調出手機本地圖片,這個時候需要我們主動進入圖庫調用圖片反饋給頁面。主要步驟就是重寫WebChromeClient中的onShowFileChooser方法
當前AgentWeb,或者是原生的webView設置自己寫的WebViewClient
private ValueCallback<Uri> mValueCallback;
private ValueCallback<Uri[]> mFilePathCallback;
private final static int RESULT_CODE = 10000;
mAgentWeb = AgentWeb.with(this)
.setAgentWebParent(linWeb, new LinearLayout.LayoutParams(-1, -1))
.useDefaultIndicator()
.setWebChromeClient(mWebChromeClient)
.setWebViewClient(mWebViewClient)
.interceptUnkownUrl()
.createAgentWeb()
.ready()
.go(url);
下面就是WebViewClient了,目前市面上android版本應該大部分都是5.0以上了,不過爲了保證萬無一失記得要適配多個android版本,所以要寫多個方法
private WebChromeClient mWebChromeClient = new WebChromeClient() {
@Override
public void onProgressChanged(WebView view, int newProgress) {
}
// 3.0以下版本
public void openFileChooser(ValueCallback<Uri> valueCallback) {
mValueCallback = valueCallback;
openImageActivity();
}
//3.0以上版本
public void openFileChooser(ValueCallback valueCallback, String acceptType) {
mValueCallback = valueCallback;
openImageActivity();
}
//4.1以上版本
public void openFileChooser(ValueCallback<Uri> valueCallback, String acceptType, String capture) {
mValueCallback = valueCallback;
openImageActivity();
}
// 5.0以上版本 主要版本
@Override
public boolean onShowFileChooser(WebView webView, ValueCallback<Uri[]> filePathCallback, WebChromeClient.FileChooserParams fileChooserParams) {
mFilePathCallback = filePathCallback;
openImageActivity();
return true;
}
};
private void openImageActivity() {
Intent i = new Intent(Intent.ACTION_GET_CONTENT);
i.addCategory(Intent.CATEGORY_OPENABLE);
i.setType("image/*");
//調起手機圖庫
startActivityForResult(Intent.createChooser(i, "Image Chooser"), RESULT_CODE);
}
//處理手機返回的圖片
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == RESULT_CODE) {
if (null == mValueCallback && null == mFilePathCallback) return;
Uri result = data == null || resultCode != RESULT_OK ? null : data.getData();
if (mFilePathCallback != null) {
onActivityResultAboveL(requestCode, resultCode, data);
} else if (mValueCallback != null) {
mValueCallback.onReceiveValue(result);
mValueCallback = null;
}
}
}
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
private void onActivityResultAboveL(int requestCode, int resultCode, Intent intent) {
if (requestCode != RESULT_CODE || mFilePathCallback == null)
return;
Uri[] results = null;
if (resultCode == Activity.RESULT_OK) {
if (intent != null) {
String dataString = intent.getDataString();
ClipData clipData = intent.getClipData();
if (clipData != null) {
results = new Uri[clipData.getItemCount()];
for (int i = 0; i < clipData.getItemCount(); i++) {
ClipData.Item item = clipData.getItemAt(i);
results[i] = item.getUri();
}
}
if (dataString != null)
results = new Uri[]{Uri.parse(dataString)};
}
}
mFilePathCallback.onReceiveValue(results);
mFilePathCallback = null;
}
到此應該就能順利上傳圖片了,上傳文件的話,也是類似這種方式。