小工具知识网

当前位置: 首页 > 行业知识 > webview 嵌入H5网页支持 拍照、录像、文件选择等功能

行业知识

webview 嵌入H5网页支持 拍照、录像、文件选择等功能

2026-11-07 03:23:52 来源:互联网转载

前言

在���常开发中,app中经常有嵌入前端网页的需求,里面如果有一些调用相机拍照、录视频、查看本地图片功能时,需要Android WebView端做一些配置、来保证能顺利调起相应的Intent,来适配前端程序

()

需求一:webView端调用相机拍照,同时回传给前端程序

{        webView.setWebChromeClient(new WebChromeClient(){            @TargetApi(Build.VERSION_CODES.LOLLIPOP)            @Override            public boolean onShowFileChooser(WebView webView, ValueCallback filePathCallback, FileChooserParams fileChooserParams) {                Log.e(TAG,"onShowFileChooser fileChooserParams:"+fileChooserParams.getAcceptTypes()[0]);                mUploadCallbackAboveL = filePathCallback;//数据回传会用到,记录成全局                WebViewTestUI.this.fileChooserParams=fileChooserParams;                if (fileChooserParams != null) {                    //最终通过fileChooserParams.isCaptureEnabled()方法来解决你的困惑 官方解释是否为设备                    if (fileChooserParams.isCaptureEnabled()) {                        //所以这里写调用相机逻辑                        if (ContextCompat.checkSelfPermission(WebViewTestUI.this, android.Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {                            // If camera permission is not granted, request it                            ActivityCompat.requestPermissions(WebViewTestUI.this, new String[]{android.Manifest.permission.CAMERA}, CAMERA_PERMISSION_REQUEST);                        } else {                            // Camera permission is already granted, launch camera                            takePhoto();                        }                  }                  return true;            }        });}    private void takePhoto() {        String filePath = Environment.getExternalStorageDirectory() + File.separator                + File.separator                + Environment.DIRECTORY_PICTURES + File.separator;        String fileName = "IMG_" + DateFormat.format("yyyyMMdd_hhmmss", Calendar.getInstance(Locale.CHINA)) + ".jpg";        imageUri = Uri.fromFile(new File(filePath + fileName));        //相册相机选择窗        Intent captureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);        if(captureIntent.resolveActivity(getPackageManager()) != null){            captureIntent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);            startActivityForResult(captureIntent, 2);        }    }//Intent的回调   @Override    protected void onActivityResult(int requestCode, int resultCode, Intent data) {        super.onActivityResult(requestCode,resultCode,data);        if (Build.VERSION.SDK_INT >= 21) {            chooseAbove(resultCode, data);        }    }  public void chooseAbove(int resultCode, Intent data) {        Log.e("Base", "调用方法  chooseAbove   " +data+" resultCode:"+resultCode);        if (Activity.RESULT_OK == resultCode) {            updatePhotos();            if (data != null) {                // 这里是针对从文件中选图片的处理                Uri[] results;                Uri uriData = data.getData();                Log.e("Base", "uriData:" + uriData);                if (uriData != null) {                    results = new Uri[]{uriData};                    for (Uri uri : results) {                        Log.e("Base", "系统里取到的图片:" + uri.toString());                    }                    mUploadCallbackAboveL.onReceiveValue(results);//回传给前端                } else {                    mUploadCallbackAboveL.onReceiveValue(null);                }            } else {                Log.e("Base", "自己命名的图片:" + imageUri.toString());                mUploadCallbackAboveL.onReceiveValue(new Uri[]{imageUri});            }        } else {            mUploadCallbackAboveL.onReceiveValue(null);        }        mUploadCallbackAboveL = null;    }
()

需求二:拍摄视频

{//根据参数   if(fileChooserParams.getAcceptTypes()[0].equals("video/*")){                    if (ContextCompat.checkSelfPermission(WebViewTestUI.this, android.Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {                        // If camera permission is not granted, request it                        ActivityCompat.requestPermissions(WebViewTestUI.this, new String[]{android.Manifest.permission.CAMERA}, CAMERA_PERMISSION_VIDEOREQUEST);                    } else {                        // Camera permission is already granted, launch camera                        takeVideo();                    }                    return true;                }}    private void takeVideo() {        //相册相机选择窗        Intent captureIntent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE);        startActivityForResult(captureIntent, 1);    }

需求三:选择文件

也是根据入参类型做不同处理、同时注意存储权限问题

总结

上一篇:mc服务器怎么卡op?

下一篇:五步解决 Android Studio 模拟器启动失败问题