webview适配(一):文件选择,相机拍照,相册选择

说起来android适配webview就是比较烦人,本人遇到过很多坑,但是之前从来没有过记录,例如:文件选择框,toast弹框,视频不正常播放,视频各种不全屏(网上说的方法都不行时候就崩溃了,有机会说),两端方法互调,视频和语音播放不停止问题,http和https切换时图片不显示问题,等等

在这里我要说一嘴,一个很重要的东西:QQ,微信等腾讯系列软件一般都用的是腾讯X5内核的webview,并非原生的webview,如果看到和微信,QQ,还有大部分浏览器打开页面效果展示不同,请不必在意。因为内核不一样,你也可以继承腾讯X5的内核,它的某些效果封装的略强于原生webview,有的不如webview,各有利弊,国内好多手机都自定制webview,导致原生浏览器打开效果也略有不同,不必在意,我不推荐使用腾讯X5的webview,因为我比较懒,而且并没有感觉到明显的优点,好像腾讯X5内核的webview还并不是完全免费

说到这我在来说下关于webview的轻量级框架,AgentWeb,当然基于腾讯X5内核的也有,但是不做说明了,你们可自行百度AgentWeb的用法,确实比较简单,封装效果比较好。个人并不喜欢集成,1.因为不如自己写的灵活。2.有什么bug也不在自己的控制之内。3.感觉自己封装一个也很速度哈,无非是把那常用的几点适配好就可以了

以前解决的时候没有去特意记录,今天又遇到一个正好记录一下,关于webview选择文件,先看效果

先看一个在微信上打开的效果:

再看一个在app内部打开的效果:

最后的是咱们想要的效果:

还有几种效果就不一一列举了,还有就是直接到选择文件界面,还有的是微信,QQ和app内部不一样,其实很简单的,h5的小伙伴调用的是文件选择,至于如何选择就要咱们这边的壳子做处理了,因为嵌套的是h5页面,这个webview控件就暂且称作壳子吧。需要新建CustomWebChromeClient类的对象,并且重写打开文件的方法,各个版本之间的方法还不一样,对现在来说其实只考虑5.0以上就行了,为了安全起见就都写一下吧,附上代码

// For Android 3.0+
        public void openFileChooser(ValueCallback uploadMsg, String acceptType) {
            if (activity.getClass() == WebViewNewActivity.class) {
                ((WebViewNewActivity) activity).mUploadMessage = uploadMsg;
            }
            mUploadMessage = uploadMsg;

            getPicture();
        }

        //For Android 4.1
        public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType, String capture) {
            if (activity.getClass() == WebViewNewActivity.class) {
                ((WebViewNewActivity) activity).mUploadMessage = uploadMsg;
            }

            mUploadMessage = uploadMsg;

            getPicture();

        }
        // For >= Lollipop 5.0

        @TargetApi(Build.VERSION_CODES.LOLLIPOP)
        public boolean onShowFileChooser(WebView mWebView, ValueCallback<Uri[]> filePathCallback, WebChromeClient.FileChooserParams fileChooserParams) {
            /*
            * lk改,webview打开图片
            * */
            uploadMessage = filePathCallback;
            getPicture();
            return true;
        }

getPicture()这个方法中写处理,我写的是弹出自定义的弹框,至于是拍照,还是选择照片,或者选择文件都可以自己添加的,很简单,一定注意,要加权限判断啊

/*
        * 获取照片的方法
        * */
    public void getPicture() {
        SetUpDialogPictureH5 dialogPicture = new SetUpDialogPictureH5(WebViewNewActivity.this, new SetUpDialogPictureH5.ArticlePcutureOnClickListener() {
            @Override
            public void btnTakePicListener() {
//                        拍照
                // 拍照
                if (Build.VERSION.SDK_INT >= 23) {
                    if (ContextCompat.checkSelfPermission(WebViewNewActivity.this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED
                            ||ContextCompat.checkSelfPermission(WebViewNewActivity.this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED
                            || ContextCompat.checkSelfPermission(WebViewNewActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
                        ActivityCompat.requestPermissions(WebViewNewActivity.this, new String[]{Manifest.permission.CAMERA,Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE}, Constants.PERMISSION_CAMERA);
                    } else {
                        cameraPic();
                    }
                } else {
                    cameraPic();
                }
            }

            @Override
            public void btnGetAlbumPicListener() {
                //相册
                if (Build.VERSION.SDK_INT >= 23) {
                    if (ContextCompat.checkSelfPermission(WebViewNewActivity.this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED
                            || ContextCompat.checkSelfPermission(WebViewNewActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED
                            ) {
                        ActivityCompat.requestPermissions(WebViewNewActivity.this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE}
                                , Constants.READ_WRITE_STORAGE);
                    } else {
                        startImagePick();
                    }
                } else {
                    startImagePick();
                }
            }

            @Override
            public void btnCancelListener() {
                restoreNeiRong();
            }
        },true);
    }

 至于是否授予权限的处理结果的代码我就不贴了,自己写就行了,我主要是提供一下思路,别忘记对图片进行压缩处理。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值