|
|
@@ -1,6 +1,9 @@
|
|
|
package com.qingdaofushan.home.weiview;
|
|
|
|
|
|
import android.Manifest;
|
|
|
+import android.annotation.TargetApi;
|
|
|
+import android.app.Activity;
|
|
|
+import android.content.ClipData;
|
|
|
import android.content.ContentValues;
|
|
|
import android.content.Intent;
|
|
|
import android.content.pm.PackageManager;
|
|
|
@@ -15,6 +18,7 @@ import android.provider.MediaStore;
|
|
|
import android.util.Base64;
|
|
|
import android.util.Log;
|
|
|
import android.view.KeyEvent;
|
|
|
+import android.webkit.ValueCallback;
|
|
|
import android.webkit.WebSettings;
|
|
|
import android.webkit.WebView;
|
|
|
import android.widget.LinearLayout;
|
|
|
@@ -84,6 +88,10 @@ public class WebViewActivity extends AppCompatActivity {
|
|
|
*/
|
|
|
private boolean isAndroidQ = Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q;
|
|
|
|
|
|
+ private ValueCallback<Uri> uploadMessage;
|
|
|
+ private ValueCallback<Uri[]> uploadMessageAboveL;
|
|
|
+ private final static int FILE_CHOOSER_RESULT_CODE = 10000;
|
|
|
+
|
|
|
@Override
|
|
|
protected void onCreate(@Nullable Bundle savedInstanceState) {
|
|
|
super.onCreate(savedInstanceState);
|
|
|
@@ -100,8 +108,8 @@ public class WebViewActivity extends AppCompatActivity {
|
|
|
mAgentWeb = AgentWeb.with(this)
|
|
|
.setAgentWebParent(linearLayout, new LinearLayout.LayoutParams(-1, -1))
|
|
|
.closeIndicator()
|
|
|
-// .setWebChromeClient(mWebChromeClient)
|
|
|
-// .setWebViewClient(mWebViewClient)
|
|
|
+ .setWebChromeClient(mWebChromeClient)
|
|
|
+ .setWebViewClient(mWebViewClient)
|
|
|
// .setPermissionInterceptor(mPermissionInterceptor)
|
|
|
.createAgentWeb()
|
|
|
.go(url);
|
|
|
@@ -152,8 +160,51 @@ public class WebViewActivity extends AppCompatActivity {
|
|
|
public void onProgressChanged(WebView view, int newProgress) {
|
|
|
//do you work
|
|
|
}
|
|
|
+ // For Android < 3.0
|
|
|
+ public void openFileChooser(ValueCallback<Uri> valueCallback) {
|
|
|
+ uploadMessage = valueCallback;
|
|
|
+ openImageChooserActivity();
|
|
|
+ }
|
|
|
+
|
|
|
+ // For Android >= 3.0
|
|
|
+ public void openFileChooser(ValueCallback valueCallback, String acceptType) {
|
|
|
+ uploadMessage = valueCallback;
|
|
|
+ openImageChooserActivity();
|
|
|
+ }
|
|
|
+
|
|
|
+ //For Android >= 4.1
|
|
|
+ public void openFileChooser(ValueCallback<Uri> valueCallback, String acceptType, String capture) {
|
|
|
+ uploadMessage = valueCallback;
|
|
|
+ openImageChooserActivity();
|
|
|
+ }
|
|
|
+
|
|
|
+ // For Android >= 5.0
|
|
|
+ @Override
|
|
|
+ public boolean onShowFileChooser(WebView webView, ValueCallback<Uri[]> filePathCallback, WebChromeClient.FileChooserParams fileChooserParams) {
|
|
|
+ uploadMessageAboveL = filePathCallback;
|
|
|
+ openImageChooserActivity();
|
|
|
+ return true;
|
|
|
+ }
|
|
|
};
|
|
|
|
|
|
+ // 2.回调方法触发本地选择文件
|
|
|
+ private void openImageChooserActivity() {
|
|
|
+ //调用系统相机
|
|
|
+ Intent intentCamera = new Intent();
|
|
|
+ if (Build.VERSION.SDK_INT >= 24) {
|
|
|
+ intentCamera.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); //添加这一句表示对目标应用临时授权该Uri所代表的文件
|
|
|
+ }
|
|
|
+ intentCamera.setAction(MediaStore.ACTION_IMAGE_CAPTURE);
|
|
|
+ startActivityForResult(intentCamera, FILE_CHOOSER_RESULT_CODE);
|
|
|
+
|
|
|
+// Intent i = new Intent(Intent.ACTION_GET_CONTENT);
|
|
|
+// i.addCategory(Intent.CATEGORY_OPENABLE);
|
|
|
+// i.setType("image/*");//图片上传
|
|
|
+//// i.setType("file/*");//文件上传
|
|
|
+//// i.setType("*/*");//文件上传
|
|
|
+// startActivityForResult(Intent.createChooser(i, "File Chooser"), FILE_CHOOSER_RESULT_CODE);
|
|
|
+ }
|
|
|
+
|
|
|
@Override
|
|
|
public boolean onKeyDown(int keyCode, KeyEvent event) {
|
|
|
if (mAgentWeb.handleKeyEvent(keyCode, event)) {
|
|
|
@@ -172,26 +223,78 @@ public class WebViewActivity extends AppCompatActivity {
|
|
|
|
|
|
}
|
|
|
|
|
|
+// @Override
|
|
|
+// protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
|
|
|
+// super.onActivityResult(requestCode, resultCode, data);
|
|
|
+// /**
|
|
|
+// * 处理二维码扫描结果
|
|
|
+// */
|
|
|
+// if (resultCode == RESULT_OK) {
|
|
|
+// switch (requestCode) {
|
|
|
+// case 200:
|
|
|
+// Bundle bundle = data.getExtras();
|
|
|
+// String scanResult = bundle.getString(Constant.INTENT_EXTRA_KEY_QR_SCAN);
|
|
|
+//// String result = CameraScan.parseScanResult(data);
|
|
|
+// mAgentWeb.getJsAccessEntrace().quickCallJs("QRCode", scanResult);
|
|
|
+// break;
|
|
|
+// case CAMERA_REQUEST_CODE:
|
|
|
+// String uploadpath = Uri2PathUtil.getRealPathFromUri(this, mCameraUri);
|
|
|
+// mAgentWeb.getJsAccessEntrace().quickCallJs("Camera", uploadpath);
|
|
|
+// break;
|
|
|
+// }
|
|
|
+// }
|
|
|
+// }
|
|
|
+ // 3.选择图片后处理
|
|
|
@Override
|
|
|
- protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
|
|
|
+ protected void onActivityResult(int requestCode, int resultCode, Intent data) {
|
|
|
super.onActivityResult(requestCode, resultCode, data);
|
|
|
- /**
|
|
|
- * 处理二维码扫描结果
|
|
|
- */
|
|
|
- if (resultCode == RESULT_OK) {
|
|
|
- switch (requestCode) {
|
|
|
- case 200:
|
|
|
- Bundle bundle = data.getExtras();
|
|
|
- String scanResult = bundle.getString(Constant.INTENT_EXTRA_KEY_QR_SCAN);
|
|
|
-// String result = CameraScan.parseScanResult(data);
|
|
|
- mAgentWeb.getJsAccessEntrace().quickCallJs("QRCode", scanResult);
|
|
|
- break;
|
|
|
- case CAMERA_REQUEST_CODE:
|
|
|
- String uploadpath = Uri2PathUtil.getRealPathFromUri(this, mCameraUri);
|
|
|
- mAgentWeb.getJsAccessEntrace().quickCallJs("Camera", fileToBase64(new File(uploadpath)));
|
|
|
- break;
|
|
|
+ if (requestCode == FILE_CHOOSER_RESULT_CODE) {
|
|
|
+ if (null == uploadMessage && null == uploadMessageAboveL) return;
|
|
|
+ Uri result = data == null || resultCode != RESULT_OK ? null : data.getData();
|
|
|
+ // Uri result = (((data == null) || (resultCode != RESULT_OK)) ? null : data.getData());
|
|
|
+ if (uploadMessageAboveL != null) {
|
|
|
+ onActivityResultAboveL(requestCode, resultCode, data);
|
|
|
+ } else if (uploadMessage != null) {
|
|
|
+ uploadMessage.onReceiveValue(result);
|
|
|
+ uploadMessage = null;
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ //这里uploadMessage跟uploadMessageAboveL在不同系统版本下分别持有了
|
|
|
+ //WebView对象,在用户取消文件选择器的情况下,需给onReceiveValue传null返回值
|
|
|
+ //否则WebView在未收到返回值的情况下,无法进行任何操作,文件选择器会失效
|
|
|
+ if (uploadMessage != null) {
|
|
|
+ uploadMessage.onReceiveValue(null);
|
|
|
+ uploadMessage = null;
|
|
|
+ } else if (uploadMessageAboveL != null) {
|
|
|
+ uploadMessageAboveL.onReceiveValue(null);
|
|
|
+ uploadMessageAboveL = null;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 4. 选择内容回调到Html页面
|
|
|
+ @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;
|
|
|
}
|
|
|
|
|
|
@Subscribe(threadMode = ThreadMode.MAIN)
|