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);
    }

 至於是否授予權限的處理結果的代碼我就不貼了,自己寫就行了,我主要是提供一下思路,別忘記對圖片進行壓縮處理。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章