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

本文详细描述了如何在AndroidWebView中实现相机拍照、视频录制以及选择文件的功能,涉及权限请求、Intent使用和回调处理。开发者需确保正确配置WebChromeClient以适配前端程序并处理权限问题。
摘要由CSDN通过智能技术生成

前言

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

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

{
        webView.setWebChromeClient(new WebChromeClient(){
            @TargetApi(Build.VERSION_CODES.LOLLIPOP)
            @Override
            public boolean onShowFileChooser(WebView webView, ValueCallback<Uri[]> 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);
    }

需求三:选择文件

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

总结

以上内容可以通过查资料或者chatgpt或者百度来查看,自己记录下,方便以后查看

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值