Android、H5混合開發(fā)中關(guān)于無法識別H5中camera參數(shù)

因為android的webview無法像ios一樣弃甥,自動識別camera字段爽室,從而彈出對應(yīng)的照相選項框,這就要我們自己實現(xiàn)了淆攻。

實現(xiàn)方式網(wǎng)絡(luò)上很詳盡阔墩,這里主要記錄一個坑,就是在自定義的彈框選擇取消卜录,或者拍照撤銷戈擒,回到webview界面,再次點擊發(fā)現(xiàn)艰毒,自定義的底部彈框不會再次彈出了筐高,這是怎回事呢?主要是因為valueCallback沒有在取消的情況下沒有將它的onReceiveValue賦為null丑瞧,所以他就不會再次調(diào)用它的onActivityResult以及onActivityResultAboveL方法柑土,也就導(dǎo)致了再次點擊無反應(yīng)。

最后貼一下代碼:

    //低版本選取回來的是Uri
    private ValueCallback uploadFile;
    //高版本選取回來的是Uri數(shù)組
    private ValueCallback uploadFileAboveL;

    /**
     *識別camera字段方法
     */
    web_insurance.setWebChromeClient(new
    WebChromeClient() {
        //For Android  >= 4.1
        @Override
        public void openFileChooser (ValueCallback valueCallback, String acceptType, String capture)
        {
            LogUtils.e("openFileChooser", "For Android  >= 4.1");
            uploadFile = valueCallback;
            openImageChooserActivity();

        }
        // For Android >= 5.0

        @Override
        public boolean onShowFileChooser (WebView webView, ValueCallback valueCallback, FileChooserParams fileChooserParams){
            LogUtils.e("openFileChooser", "For Android >= 5.0");
            uploadFileAboveL = valueCallback;
            openImageChooserActivity();
            return true;
        }

    });


    /**
     * 打開選取的方法
     */
    private void openImageChooserActivity() {
        showPopWin();
    }
    
    
    private void showPopWin() {
        // 利用layoutInflater獲得View
        if (window == null) {
            LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            @SuppressLint("InflateParams") final
            View popview = inflater.inflate(R.layout.pop_window_choose_headportrait, null);
            // 得到寬度和高度
            window = new PopupWindow(popview,
                    WindowManager.LayoutParams.MATCH_PARENT,
                    WindowManager.LayoutParams.MATCH_PARENT);
            // 設(shè)置popWindow彈出窗體可點擊绊汹,這句話必須添加稽屏,并且是true
            window.setFocusable(true);
            window.setOutsideTouchable(false);
            // 實例化一個ColorDrawable顏色為半透明
            // noinspection deprecationP
            window.setBackgroundDrawable(new BitmapDrawable());
            backgroundAlpha(0.8f);
            // 設(shè)置popWindow的顯示和消失動畫
            window.setAnimationStyle(R.style.mypopwindow_anim_style);
            window.setOnDismissListener(new PopupWindow.OnDismissListener() {
                @Override
                public void onDismiss() {
                    backgroundAlpha(1f);
                }
            });
            TextView tvPhoto = (TextView) popview.findViewById(R.id.tv_photograph);
            tvAlbum = (TextView) popview.findViewById(R.id.tv_select_from_album);
            //
            tvSave = (TextView) popview.findViewById(R.id.tv_save_photo);
            tvSave.setVisibility(View.GONE);
            //
            cancel = (Button) popview.findViewById(R.id.cancel);
            // 調(diào)用相機的按鈕監(jiān)聽
            tvPhoto.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    callCamera();
                }
            });

            // 調(diào)用相冊的按鈕監(jiān)聽
            tvAlbum.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    //noinspection deprecation
                    tvAlbum.setTextColor(getResources().getColor(R.color.yunda_text_new));
                    callAlbum();
                }
            });

            // 取消
            cancel.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    if (CommonUtil.notNull(window) && window.isShowing()) {
                        //noinspection deprecation
                        // cancel.setTextColor(getResources().getColor(R.color.yunda_text_new));
                        window.dismiss();
                        //取消的時候回調(diào)參數(shù)賦為null
                        if (uploadFileAboveL != null) {
                            uploadFileAboveL.onReceiveValue(null);
                            uploadFileAboveL = null;
                        } else if (uploadFile != null) {
                            uploadFile.onReceiveValue(null);
                            uploadFile = null;
                        }
                    }
                }
            });
        }
        // 在底部顯示
        window.showAtLocation(this.findViewById(R.id.common_webview),
                Gravity.BOTTOM, 0, 0);

    }


    /**
     * 相機選取回執(zhí)
     */

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == FILE_CHOOSER_RESULT_CODE) {
            if (null == uploadFile && null == uploadFileAboveL) return;
            Uri result = data == null || resultCode != Activity.RESULT_OK ? null : data.getData();
            if (uploadFileAboveL != null) {
                onActivityResultAboveL(requestCode, resultCode, data);
            } else if (uploadFile != null) {
                uploadFile.onReceiveValue(result);
                uploadFile = null;
            }
        }
    }
    
    //這里intent.getClipData()方法需要在api16以上才能使用這個
    @TargetApi(Build.VERSION_CODES.JELLY_BEAN)
    private void onActivityResultAboveL(int requestCode, int resultCode, Intent intent) {
        if (requestCode != FILE_CHOOSER_RESULT_CODE || uploadFileAboveL == null)
            return;
        Uri[] results = null;
        if (resultCode == Activity.RESULT_OK) {
            if (intent != null) {
                String dataString = intent.getDataString();
                ClipData clipData = intent.getClipData();
                if (clipData != null) {
                    results = new Uri[clipData.getItemCount()];
                    for (int i = 0; i < clipData.getItemCount(); i++) {
                        ClipData.Item item = clipData.getItemAt(i);
                        results[i] = item.getUri();
                    }
                }
                if (dataString != null)
                    results = new Uri[]{Uri.parse(dataString)};
            }
        }
        uploadFileAboveL.onReceiveValue(results);
        uploadFileAboveL = null;
    }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市西乖,隨后出現(xiàn)的幾起案子狐榔,更是在濱河造成了極大的恐慌,老刑警劉巖获雕,帶你破解...
    沈念sama閱讀 211,423評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件薄腻,死亡現(xiàn)場離奇詭異,居然都是意外死亡届案,警方通過查閱死者的電腦和手機庵楷,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,147評論 2 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人尽纽,你說我怎么就攤上這事咐蚯。” “怎么了弄贿?”我有些...
    開封第一講書人閱讀 157,019評論 0 348
  • 文/不壞的土叔 我叫張陵春锋,是天一觀的道長。 經(jīng)常有香客問我差凹,道長看疙,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,443評論 1 283
  • 正文 為了忘掉前任直奋,我火速辦了婚禮能庆,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘脚线。我一直安慰自己搁胆,他們只是感情好,可當我...
    茶點故事閱讀 65,535評論 6 385
  • 文/花漫 我一把揭開白布邮绿。 她就那樣靜靜地躺著渠旁,像睡著了一般。 火紅的嫁衣襯著肌膚如雪船逮。 梳的紋絲不亂的頭發(fā)上顾腊,一...
    開封第一講書人閱讀 49,798評論 1 290
  • 那天,我揣著相機與錄音挖胃,去河邊找鬼杂靶。 笑死,一個胖子當著我的面吹牛酱鸭,可吹牛的內(nèi)容都是我干的吗垮。 我是一名探鬼主播,決...
    沈念sama閱讀 38,941評論 3 407
  • 文/蒼蘭香墨 我猛地睜開眼凹髓,長吁一口氣:“原來是場噩夢啊……” “哼烁登!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起蔚舀,我...
    開封第一講書人閱讀 37,704評論 0 266
  • 序言:老撾萬榮一對情侶失蹤饵沧,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后赌躺,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體狼牺,經(jīng)...
    沈念sama閱讀 44,152評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,494評論 2 327
  • 正文 我和宋清朗相戀三年寿谴,在試婚紗的時候發(fā)現(xiàn)自己被綠了锁右。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片失受。...
    茶點故事閱讀 38,629評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡讶泰,死狀恐怖咏瑟,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情痪署,我是刑警寧澤码泞,帶...
    沈念sama閱讀 34,295評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站狼犯,受9級特大地震影響余寥,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜悯森,卻給世界環(huán)境...
    茶點故事閱讀 39,901評論 3 313
  • 文/蒙蒙 一宋舷、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧瓢姻,春花似錦祝蝠、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,742評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽粗俱。三九已至竞穷,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間芜飘,已是汗流浹背恍风。 一陣腳步聲響...
    開封第一講書人閱讀 31,978評論 1 266
  • 我被黑心中介騙來泰國打工蹦狂, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人朋贬。 一個月前我還...
    沈念sama閱讀 46,333評論 2 360
  • 正文 我出身青樓鸥咖,卻偏偏與公主長得像,于是被迫代替她去往敵國和親兄世。 傳聞我的和親對象是個殘疾皇子啼辣,可洞房花燭夜當晚...
    茶點故事閱讀 43,499評論 2 348

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,761評論 25 707
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫、插件御滩、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,060評論 4 62
  • 有時候我會哭泣 但并不悲傷 有時候搞砸事情 也并不自責(zé) 有時候捧腹大笑 其實笑話乏味至極 每次見到小孩都夸可愛 其...
    不野話閱讀 98評論 2 3
  • 文/村草 前段時間削解,朋友郁悶富弦,一個人在飯店喝悶酒,讓我碰到了氛驮。 我吃過晚飯腕柜,也一起坐下了。 剛開始不說話,就一個勁...
    村草視角閱讀 264評論 0 1