Android WebView支持input file启用相机/选取照片功能

前端之家收集整理的这篇文章主要介绍了Android WebView支持input file启用相机/选取照片功能前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

webview要调起input-file拍照或者选取文件功能,可以在webview.setWebChromeClient方法中重写指定的方法,来拦截webview的input事件,并做我们相应的操作。

Android代码

  1. webView.setWebChromeClient(new WebChromeClient() {
  2. @Override
  3. public void onProgressChanged(WebView view,int newProgress) {
  4. if (newProgress == 100) {
  5. progressBar.setVisibility(View.GONE);//加载完网页进度条消失
  6. } else {
  7. progressBar.setProgress(newProgress);//设置进度值
  8. progressBar.setVisibility(View.VISIBLE);//开始加载网页时显示进度条
  9. }
  10. }
  11.  
  12. /**
  13. * 8(Android 2.2) <= API <= 10(Android 2.3)回调此方法
  14. */
  15. private void openFileChooser(android.webkit.ValueCallback<Uri> uploadMsg) {
  16. Log.e("WangJ","运行方法 openFileChooser-1");
  17. // (2)该方法回调时说明版本API < 21,此时将结果赋值给 mUploadCallbackBelow,使之 != null
  18. mUploadCallbackBelow = uploadMsg;
  19. takePhoto();
  20. }
  21.  
  22. /**
  23. * 11(Android 3.0) <= API <= 15(Android 4.0.3)回调此方法
  24. */
  25. public void openFileChooser(android.webkit.ValueCallback<Uri> uploadMsg,String acceptType) {
  26. Log.e("WangJ","运行方法 openFileChooser-2 (acceptType: " + acceptType + ")");
  27. // 这里我们就不区分input的参数了,直接用拍照
  28. openFileChooser(uploadMsg);
  29. }
  30.  
  31. /**
  32. * 16(Android 4.1.2) <= API <= 20(Android 4.4W.2)回调此方法
  33. */
  34. public void openFileChooser(android.webkit.ValueCallback<Uri> uploadMsg,String acceptType,String capture) {
  35. Log.e("WangJ","运行方法 openFileChooser-3 (acceptType: " + acceptType + "; capture: " + capture + ")");
  36. // 这里我们就不区分input的参数了,直接用拍照
  37. openFileChooser(uploadMsg);
  38. }
  39.  
  40. /**
  41. * API >= 21(Android 5.0.1)回调此方法
  42. */
  43. @Override
  44. public boolean onShowFileChooser(WebView webView,ValueCallback<Uri[]> valueCallback,FileChooserParams fileChooserParams) {
  45. Log.e("WangJ","运行方法 onShowFileChooser");
  46. // (1)该方法回调时说明版本API >= 21,此时将结果赋值给 mUploadCallbackAboveL,使之 != null
  47. mUploadCallbackAboveL = valueCallback;
  48. takePhoto();
  49. return true;
  50. }
  51. });

这里的java代码是来拦截input事件的,里面做了很多api版本的判断,不同版本的api调用不同的方法,下面是一些其他方法

调起相机/选择文件方法:takePhoto();

  1. /**
  2. * 调用相机
  3. */
  4. private void takePhoto() {
  5. // 指定拍照存储位置的方式调起相机
  6. String filePath = Environment.getExternalStorageDirectory() + File.separator
  7. + Environment.DIRECTORY_PICTURES + File.separator;
  8. String fileName = "IMG_" + DateFormat.format("yyyyMMdd_hhmmss",Calendar.getInstance(Locale.CHINA)) + ".jpg";
  9. imageUri = Uri.fromFile(new File(filePath + fileName));
  10.  
  11. // Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
  12. // intent.putExtra(MediaStore.EXTRA_OUTPUT,imageUri);
  13. // startActivityForResult(intent,REQUEST_CODE);
  14.  
  15. // 选择图片(不包括相机拍照),则不用成功后发刷新图库的广播
  16. // Intent i = new Intent(Intent.ACTION_GET_CONTENT);
  17. // i.addCategory(Intent.CATEGORY_OPENABLE);
  18. // i.setType("image/*");
  19. // startActivityForResult(Intent.createChooser(i,"Image Chooser"),REQUEST_CODE);
  20.  
  21. Intent captureIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
  22. captureIntent.putExtra(MediaStore.EXTRA_OUTPUT,imageUri);
  23.  
  24. Intent Photo = new Intent(Intent.ACTION_PICK,android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
  25.  
  26. Intent chooserIntent = Intent.createChooser(Photo,"Image Chooser");
  27. chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS,new Parcelable[]{captureIntent});
  28.  
  29. startActivityForResult(chooserIntent,REQUEST_CODE);
  30. }
  31. onActivityResult回调:
  32. @Override
  33. protected void onActivityResult(int requestCode,int resultCode,Intent data) {
  34. super.onActivityResult(requestCode,resultCode,data);
  35. if (requestCode == REQUEST_CODE) {
  36. // 经过上边(1)、(2)两个赋值操作,此处即可根据其值是否为空来决定采用哪种处理方法
  37. if (mUploadCallbackBelow != null) {
  38. chooseBelow(resultCode,data);
  39. } else if (mUploadCallbackAboveL != null) {
  40. chooseAbove(resultCode,data);
  41. } else {
  42. Toast.makeText(this,"发生错误",Toast.LENGTH_SHORT).show();
  43. }
  44. }
  45. }

其他一些方法

  1. /**
  2. * Android API < 21(Android 5.0)版本的回调处理
  3. * @param resultCode 选取文件或拍照的返回码
  4. * @param data 选取文件或拍照的返回结果
  5. */
  6. private void chooseBelow(int resultCode,Intent data) {
  7. Log.e("WangJ","返回调用方法--chooseBelow");
  8.  
  9. if (RESULT_OK == resultCode) {
  10. updatePhotos();
  11.  
  12. if (data != null) {
  13. // 这里是针对文件路径处理
  14. Uri uri = data.getData();
  15. if (uri != null) {
  16. Log.e("WangJ","系统返回URI:" + uri.toString());
  17. mUploadCallbackBelow.onReceiveValue(uri);
  18. } else {
  19. mUploadCallbackBelow.onReceiveValue(null);
  20. }
  21. } else {
  22. // 以指定图像存储路径的方式调起相机,成功后返回data为空
  23. Log.e("WangJ","自定义结果:" + imageUri.toString());
  24. mUploadCallbackBelow.onReceiveValue(imageUri);
  25. }
  26. } else {
  27. mUploadCallbackBelow.onReceiveValue(null);
  28. }
  29. mUploadCallbackBelow = null;
  30. }
  31.  
  32. /**
  33. * Android API >= 21(Android 5.0) 版本的回调处理
  34. * @param resultCode 选取文件或拍照的返回码
  35. * @param data 选取文件或拍照的返回结果
  36. */
  37. private void chooseAbove(int resultCode,"返回调用方法--chooseAbove");
  38.  
  39. if (RESULT_OK == resultCode) {
  40. updatePhotos();
  41.  
  42. if (data != null) {
  43. // 这里是针对从文件中选图片的处理
  44. Uri[] results;
  45. Uri uriData = data.getData();
  46. if (uriData != null) {
  47. results = new Uri[]{uriData};
  48. for (Uri uri : results) {
  49. Log.e("WangJ","系统返回URI:" + uri.toString());
  50. }
  51. mUploadCallbackAboveL.onReceiveValue(results);
  52. } else {
  53. mUploadCallbackAboveL.onReceiveValue(null);
  54. }
  55. } else {
  56. Log.e("WangJ","自定义结果:" + imageUri.toString());
  57. mUploadCallbackAboveL.onReceiveValue(new Uri[]{imageUri});
  58. }
  59. } else {
  60. mUploadCallbackAboveL.onReceiveValue(null);
  61. }
  62. mUploadCallbackAboveL = null;
  63. }
  64.  
  65. private void updatePhotos() {
  66. // 该广播即使多发(即选取照片成功时也发送)也没有关系,只是唤醒系统刷新媒体文件
  67. Intent intent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
  68. intent.setData(imageUri);
  69. sendBroadcast(intent);
  70. }

相关的全局变量

  1. private android.webkit.ValueCallback<Uri[]> mUploadCallbackAboveL;
  2. private android.webkit.ValueCallback<Uri> mUploadCallbackBelow;
  3. private Uri imageUri;
  4. private int REQUEST_CODE = 1234;

总结

以上所述是小编给大家介绍的Android WebView支持input file启用相机/选取照片功能,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

猜你在找的Android相关文章