没知识点 纯操作 交互直接使用
一、权限和变量说明
manifest说明--网络权限
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
// 引用实例说明
private static final int FILE_CHOOSER_RESULT_CODE = 2000; // 响应码
private ValueCallback<Uri> uploadMessage; // android 3.0- 上传回调类
private ValueCallback<Uri[]> uploadMessageAboveL; // android 3.0+ 上传回调类
// settings基本设置(必选)
WebSettings webSettings = webview.getSettings();
// 其余setting根据自身设置 以下是必要的
webSettings.setJavaScriptEnabled(true);
webSettings.setUserAgentString("User-Agent:Android");
webview.setWebViewClient(new WebViewClient()); // 防止跳转到本地浏览器
二、设置文件上传setting
webview.setWebChromeClient(new WebChromeClient() {
@Override
public void onReceivedTitle(WebView view, String title) {
super.onReceivedTitle(view, title);
// 获取H5标题
}
@Override
public void onProgressChanged(WebView view, int newProgress) {
//TODO 可以在这里添加UI
if (newProgress == 100) {
} else {
}
super.onProgressChanged(view, newProgress);
}
//For Android API < 11 (3.0 OS)
public void openFileChooser(ValueCallback<Uri> valueCallback) {
uploadMessage = valueCallback;
openFileChooserActivity();
}
//For Android API >= 11 (3.0 OS)
public void openFileChooser(ValueCallback<Uri> valueCallback, String acceptType, String capture) {
uploadMessage = valueCallback;
openFileChooserActivity();
}
//For Android API >= 21 (5.0 OS)
@Override
public boolean onShowFileChooser(WebView webView, ValueCallback<Uri[]> filePathCallback, WebChromeClient.FileChooserParams fileChooserParams) {
//TODO 可以在这里添加判断 如果没有读取存储权限 就不给进 如果有就进入
uploadMessageAboveL = filePathCallback;
openFileChooserActivity();
return true;
}
});
三、打开本机文件内容并选择
/**
* 打开文件选择列表
*/
private void openFileChooserActivity() {
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType("*/*"); // 所有文件
intent.addCategory(Intent.CATEGORY_OPENABLE);
startActivityForResult( Intent.createChooser(intent, "Select a File to Upload"), FILE_CHOOSER_RESULT_CODE); // 响应码
}
四、获取本地文件并上传
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == FILE_CHOOSER_RESULT_CODE) {
if (null == uploadMessage && null == uploadMessageAboveL) return;
Uri result = data == null || resultCode != RESULT_OK ? null : data.getData();
if (uploadMessageAboveL != null) { // > android 3.0
onActivityResultAboveL(requestCode, resultCode, data);
} else if (uploadMessage != null) {// < android 3.0
uploadMessage.onReceiveValue(result);
uploadMessage = null;
}
}
}
**
* 5.0以上解析文件并回调上传
* @param requestCode
* @param resultCode
* @param intent
*/
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
private void onActivityResultAboveL(int requestCode, int resultCode, Intent intent) {
if (requestCode != FILE_CHOOSER_RESULT_CODE || uploadMessageAboveL == 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)};
}
}
}
//回调上传 并置空
uploadMessageAboveL.onReceiveValue(results);
uploadMessageAboveL = null;
}