在Android移动应用中,我们不止会使用本地原生的界面显示,嵌套网页显示也是一个基本需求。
在被调用的网页中,也许会用到本地相册选取的功能,但我们会发现这并不是一个可以直接使用的功能,需要我们添加一些方法。
不多说直接上代码:
在webview中,我们需要自定义一个ArcWebChromeClient继承WebChromeClient,并添加相应方法,然后在webview所在的activity中进行onActivityResult方法的重写。
private class ArcWebChromeClient extends WebChromeClient{
public void openFileChooser(ValueCallback
uploadMsg) {
((WebActivity) mContext).openFileChooserImpl(uploadMsg);
}
public void openFileChooser(ValueCallback uploadMsg, String acceptType ) {
((WebActivity) mContext).openFileChooserImpl(uploadMsg);
}
public void openFileChooser(ValueCallback
uploadMsg, String acceptType, String capture){
((WebActivity) mContext).openFileChooserImpl(uploadMsg);
}
// For Android 5.0+
public boolean onShowFileChooser (WebView webView, ValueCallback
uploadMsg, WebChromeClient.FileChooserParams fileChooserParams) {
// mUploadCallbackAboveL = uploadMsg;
// Intent i = newframe Intent(Intent.ACTION_GET_CONTENT);
// i.addCategory(Intent.CATEGORY_OPENABLE);
// i.setType("image/*");
// startActivityForResult(
// Intent.createChooser(i, "File Browser"), 0);
// return true;
// mUploadCallbackAboveL = uploadMsg;
((WebActivity) mContext).setUploadMsg(uploadMsg);
Intent contentSelectionIntent = new Intent(Intent.ACTION_GET_CONTENT);
contentSelectionIntent.addCategory(Intent.CATEGORY_OPENABLE);
contentSelectionIntent.setType("image/*");
Intent chooserIntent = new Intent(Intent.ACTION_CHOOSER);
chooserIntent.putExtra(Intent.EXTRA_INTENT, contentSelectionIntent);
chooserIntent.putExtra(Intent.EXTRA_TITLE, "Image Chooser");
((WebActivity) mContext).startActivityForResult(chooserIntent, 1);
return true;
}
}/**-------------------------------处理webview调用本地文件浏览-------------------------------------*/
private ValueCallback
mUploadMessage;
public void openFileChooserImpl(ValueCallback
uploadMsg) { mUploadMessage = uploadMsg; Intent i = new Intent(Intent.ACTION_GET_CONTENT); i.addCategory(Intent.CATEGORY_OPENABLE); i.setType("image/*"); startActivityForResult(Intent.createChooser(i, "File Chooser"), 0); } //onActivityResult回调 @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if(requestCode == 0) { if (null == mUploadMessage) return; Uri result = data == null || resultCode != RESULT_OK ? null : data.getData(); if (mUploadMessage != null) { mUploadMessage.onReceiveValue(result); mUploadMessage = null; } } if (requestCode == 1) { if (mUploadCallbackAboveL == null) { return; } Uri result = (data == null || resultCode != RESULT_OK) ? null: data.getData(); if (result != null) { mUploadCallbackAboveL.onReceiveValue(new Uri[]{result}); } else { mUploadCallbackAboveL.onReceiveValue(new Uri[]{}); } mUploadCallbackAboveL = null; } } private ValueCallback
mUploadCallbackAboveL; public void setUploadMsg(ValueCallback
uploadMsg){ mUploadCallbackAboveL = uploadMsg; } @SuppressLint("NewApi") private void onActivityResultAboveL(int requestCode, int resultCode, Intent data) { if (requestCode != 0 || mUploadCallbackAboveL == null) { return; } Uri[] results = null; if (resultCode == Activity.RESULT_OK) { if (data == null) { } else { String dataString = data.getDataString(); ClipData clipData = data.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)}; } } mUploadCallbackAboveL.onReceiveValue(results); mUploadCallbackAboveL = null; return; } /**-------------------------------处理webview调用本地文件浏览-------------------------------------*/