Android Native支持H5打开相册以及相机

第一步:重写WebChromeClient方法,基本上适配5.0以上就ok了。

protected ValueCallback<Uri> mUploadMessage;
protected ValueCallback<Uri[]> mUploadMessages;
//重写WebChromeClient方法
 // For Android 3.0+
        public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType) {
            Log.i("test", "openFileChooser 1");
            mUploadMessage = uploadMsg;
            choosePicture();
        }
        // For Android < 3.0
        public void openFileChooser(ValueCallback<Uri> uploadMsgs) {
            Log.i("test", "openFileChooser 2");
            mUploadMessage = uploadMsgs;
            choosePicture();
        }
        // For Android  > 4.1.1
        public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType, String capture) {
            Log.i("test", "openFileChooser 3");
            mUploadMessage = uploadMsg;
            choosePicture();
        }
        // For Android  >= 5.0
        @Override
        public boolean onShowFileChooser(WebView webView,
                                         ValueCallback<Uri[]> filePathCallback,
                                         FileChooserParams fileChooserParams) {
            if (mUploadMessages != null) {
                mUploadMessages.onReceiveValue(null);
                mUploadMessages = null;
            }
            mUploadMessages = filePathCallback;
            choosePicture();

            return true;
        }

第二步, choosePicture()声明权限,并且动态申请权限

RxPermissionsUtils.requestPermission(this, Manifest.permission.CAMERA, new RxPermissionsUtils.PermissionCallBack() {
            @Override
            public void isSuccess(boolean isTrue) {
                if(isTrue) _pickPhoto();
                else LSToast.getInstance(context).show("获取权限失败",Toast.LENGTH_SHORT);
            }
        });

第三步,进行相册以及拍照的功能实现

 /**
     * 选择图片
     */
    public void takePhotos(Activity activity, DialogInterface.OnClickListener listener,DialogInterface.OnCancelListener cancelListener) {
        String[] selectPicTypeStr = {"相机", "文件/图片"};
        AlertDialog alertDialog = new AlertDialog.Builder(activity)
                .setTitle("请选择操作")
                .setItems(selectPicTypeStr,listener).setOnCancelListener(cancelListener).show();
        //放在show()之后,不然有些属性是没有效果的,比如height和width
        Window dialogWindow = alertDialog.getWindow();
        WindowManager m = activity.getWindowManager();
        Display d = m.getDefaultDisplay(); // 获取屏幕宽、高
        WindowManager.LayoutParams p = dialogWindow.getAttributes(); // 获取对话框当前的参数值
        // 设置宽度
        p.width = (int) (d.getWidth() * 0.95); // 宽度设置为屏幕的0.95
        p.gravity = Gravity.CENTER;//设置位置
        //p.alpha = 0.8f;//设置透明度
        dialogWindow.setAttributes(p);

    }
//选择图片
    private void _pickPhoto() {
        webViewRequestModel.takePhotos(this, new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                switch (which) {
                    // 相机拍摄
                    case 0:
                        openCarcme();
                        break;
                    // 手机相册
                    case 1:
                        openFileChooseProcess();
                        break;
                    default:
                        break;
                }
            }
        }, new DialogInterface.OnCancelListener() {
            @Override
            public void onCancel(DialogInterface dialog) {
                if (mUploadMessages != null) {
                    Uri[] uris = new Uri[1];
                    uris[0] = Uri.parse("");
                    mUploadMessages.onReceiveValue(uris);
                    mUploadMessages = null;
                } else {
                    if(mUploadMessages!=null) {
                        mUploadMessages.onReceiveValue(null);
                    }
                    mUploadMessages = null;
                }
            }
        });
    }
 /**
     * 打开照相机
     */
    Uri cameraUri;
    // 必须确保文件夹路径存在,否则拍照后无法完成回调
    File vFile ;
    private void openCarcme() {
        vFile = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES)
                ,System.currentTimeMillis() + ".jpg");
        Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        cameraUri= FileProvider.getUriForFile(this, this.getPackageName(), vFile);
        intent.putExtra(MediaStore.EXTRA_OUTPUT, cameraUri);
        startActivityForResult(intent, 11);
    }
onActivityResult中写入回调
 case 11:
                    if (mUploadMessages == null) {
                        return;
                    }
                    afterOpenCamera();
                    Uri[] uris = new Uri[1];
                    uris[0] =  Uri.fromFile(vFile);
                    mUploadMessages.onReceiveValue(uris);
                    mUploadMessages = null;
                    break;
 /**
     * 拍照结束后
     */
    private void afterOpenCamera() {
        addImageGallery(vFile);
    }

    /**
     * 解决拍照后在相册中找不到的问题
     */
    private void addImageGallery(File file) {
        ContentValues values = new ContentValues();
        values.put(MediaStore.Images.Media.DATA, file.getAbsolutePath());
        values.put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg");
        getContentResolver().insert(
                MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
    }
//打开相册
   private void openFileChooseProcess() {
        Intent i = new Intent(Intent.ACTION_GET_CONTENT);
        i.addCategory(Intent.CATEGORY_OPENABLE);
        i.setType("*/*");
        startActivityForResult(Intent.createChooser(i, "Chooser"), 10);
    }
     if (null != mUploadMessage) {
                        Uri result = data == null || resultCode != RESULT_OK ? null
                                : data.getData();
                        mUploadMessage.onReceiveValue(result);
                        mUploadMessage = null;
                    }
                    if (null != mUploadMessages) {
                        Uri result = data == null || resultCode != RESULT_OK ? null
                                : data.getData();
                        mUploadMessages.onReceiveValue(new Uri[]{result});
                        mUploadMessages = null;
                    }
  if (resultCode != RESULT_OK)
            if (mUploadMessages != null) {
                Uri[] uris = new Uri[1];
                uris[0] = Uri.parse("");
                mUploadMessages.onReceiveValue(uris);
                mUploadMessages = null;
            } else {
                if(mUploadMessages!=null) {
                    mUploadMessages.onReceiveValue(null);
                }
                mUploadMessages = null;
            }
        

最后附上,Android 7.0以上别忘了添加provider的配置。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值