WebView控件之文件上傳(打開圖庫和拍照)

android webview在默認(rèn)情況下是不支持網(wǎng)頁中的文件上傳功能的;

如果在網(wǎng)頁中有<input type="file" />,在android webview中訪問時(shí)也會(huì)出現(xiàn)瀏覽文件的按鈕

但是點(diǎn)擊按鈕之后沒有反應(yīng)...

那么如何能夠讓android的webview能夠響應(yīng),這個(gè)瀏覽按鈕呢喉钢?

我們需要為webview設(shè)置WebChromeClient严望,在WebChromeClient的實(shí)現(xiàn)類中覆蓋文件選擇的方法:

      private ValueCallback<Uri> mUploadMessage;
    /**
     * 適配5.0系統(tǒng)
     */
    private ValueCallback<Uri[]> mUploadMessage5;
// 上傳事件處理
        mWebView.setWebChromeClient(new WebChromeClient() {
            // Andorid 4.1+
            public void openFileChooser(ValueCallback<Uri> uploadFile,
                    String acceptType, String capture) {
                openFileChooser(uploadFile);
            }

            // Andorid 3.0 +
            public void openFileChooser(ValueCallback<Uri> uploadFile,
                    String acceptType) {
                openFileChooser(uploadFile);
            }

            // Android 3.0
            public void openFileChooser(ValueCallback<Uri> uploadFile) {
                mUploadMessage = uploadFile;
                OpenUpLoadFolder();
            }

            // 適配5.0系統(tǒng)
            @TargetApi(Build.VERSION_CODES.LOLLIPOP)
            public boolean onShowFileChooser(WebView webView,
                    ValueCallback<Uri[]> filePathCallback,
                    FileChooserParams fileChooserParams) {
                mUploadMessage5 = filePathCallback;
                OpenUpLoadFolder();
                return true;
            }
        });
/***  上傳文件對(duì)話框****/
    private void OpenUpLoadFolder() {
        final CharSequence[] items = { "拍照", "相冊(cè)", "取消" };
        AlertDialog dlg = new AlertDialog.Builder(SencondActivity.this)
                .setTitle("選擇圖片").setCancelable(false)
                .setItems(items, new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int item) {
                        // 這里item是根據(jù)選擇的方式,
                        if (item == 0) {
                            startActivityForResult(Intent.createChooser(
                                    CameracaptuIntent(), "File Chooser"),
                                    FILECHOOSER_CameraCapture);
                        } else if (item == 1) {
                            startActivityForResult(Intent.createChooser(
                                    createCameraIntent(), "File Chooser"),
                                    FILECHOOSER_RESULTCODE);
                        } else if (item == 2) {
                            if (mUploadMessage5 != null) {
                                mUploadMessage5.onReceiveValue(null);
                                mUploadMessage5 = null;
                            }
                            if (mUploadMessage != null) {
                                mUploadMessage.onReceiveValue(null);
                                mUploadMessage = null;
                            }
                        }
                    }
                }).create();
        dlg.show();
    }
/***  選擇圖片文件 ****/
    private Intent createCameraIntent() {
        Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
        //intent.addCategory(Intent.CATEGORY_OPENABLE);
        intent.setType("image/*");
        return intent;
    }
    Uri cameraUri=null;

    /*** 拍照 ****/
    private Intent CameracaptuIntent() {
        Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);// 拍照
        String sdStatus = Environment.getExternalStorageState();
        if (!sdStatus.equals(Environment.MEDIA_MOUNTED)) { // 檢測(cè)sd是否可用
            // return;
        }
        File out = new File(
                Environment.getExternalStorageDirectory().getPath(), ImageName);
        if (!out.exists()) {
            out.mkdirs();
        }
        String Picname = new DateFormat().format("yyyyMMdd_hhmmss",
                Calendar.getInstance(Locale.CHINA))
                + ".jpg";
        out = new File(Environment.getExternalStorageDirectory().getPath(),
                ImageName + "/" + Picname);
        cameraUri = Uri.fromFile(out);
        cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, cameraUri);
        return cameraIntent;
    }
/*** 回調(diào)****/
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {

        if (requestCode == FILECHOOSER_CameraCapture) {
            if (null == mUploadMessage && null == mUploadMessage5) 
                return;
            Uri result = data == null || resultCode != RESULT_OK ? null : data.getData();
            if (mUploadMessage5 != null) {  
                Uri[] results = null;
           if (resultCode == Activity.RESULT_OK) {
            if (data == null) {
                results = new Uri[]{cameraUri};
            } else {
                String dataString = data.getDataString();
                ClipData clipData = data.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)};
            }
        }           mUploadMessage5.onReceiveValue(results);    
        mUploadMessage5= null;
        } else if (mUploadMessage != null) {  
            mUploadMessage.onReceiveValue(result);  
            mUploadMessage = null;}
        }
    
        
        if (requestCode == FILECHOOSER_RESULTCODE) {

            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                if (null == mUploadMessage5) {
                    mUploadMessage5.onReceiveValue(null);  
                    mUploadMessage5=null;
                    return;
                }
                if (resultCode == RESULT_CANCELED) {
                    if (mUploadMessage5 != null) {
                        mUploadMessage5.onReceiveValue(null);  
                        mUploadMessage5=null;
                        return;
                    }
                }

            } else {
                if (null == mUploadMessage) {
                    mUploadMessage.onReceiveValue(null);
                    mUploadMessage = null;
                    return;
                }

                if (resultCode == RESULT_CANCELED) {
                    if (mUploadMessage != null) {
                        mUploadMessage.onReceiveValue(null);
                        mUploadMessage = null;
                        return;
                    }
                }
            }

            if (data == null)
                return;

            Uri result = data == null || resultCode != RESULT_OK ? null : data
                    .getData();
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                mUploadMessage5.onReceiveValue(new Uri[] { result });
                mUploadMessage5=null;
            } else {
                mUploadMessage.onReceiveValue(result);
                mUploadMessage=null;
            }
        } 
    }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末笆环,一起剝皮案震驚了整個(gè)濱河市攒至,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌躁劣,老刑警劉巖嗓袱,帶你破解...
    沈念sama閱讀 212,383評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異习绢,居然都是意外死亡渠抹,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,522評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門闪萄,熙熙樓的掌柜王于貴愁眉苦臉地迎上來梧却,“玉大人,你說我怎么就攤上這事败去》藕剑” “怎么了?”我有些...
    開封第一講書人閱讀 157,852評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵圆裕,是天一觀的道長(zhǎng)广鳍。 經(jīng)常有香客問我,道長(zhǎng)吓妆,這世上最難降的妖魔是什么赊时? 我笑而不...
    開封第一講書人閱讀 56,621評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮行拢,結(jié)果婚禮上祖秒,老公的妹妹穿的比我還像新娘。我一直安慰自己舟奠,他們只是感情好竭缝,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,741評(píng)論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著沼瘫,像睡著了一般抬纸。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上耿戚,一...
    開封第一講書人閱讀 49,929評(píng)論 1 290
  • 那天湿故,我揣著相機(jī)與錄音,去河邊找鬼溅话。 笑死晓锻,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的飞几。 我是一名探鬼主播,決...
    沈念sama閱讀 39,076評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼独撇,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼屑墨!你這毒婦竟也來了躁锁?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,803評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤卵史,失蹤者是張志新(化名)和其女友劉穎战转,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體以躯,經(jīng)...
    沈念sama閱讀 44,265評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡槐秧,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,582評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了忧设。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片刁标。...
    茶點(diǎn)故事閱讀 38,716評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖址晕,靈堂內(nèi)的尸體忽然破棺而出膀懈,到底是詐尸還是另有隱情,我是刑警寧澤谨垃,帶...
    沈念sama閱讀 34,395評(píng)論 4 333
  • 正文 年R本政府宣布启搂,位于F島的核電站,受9級(jí)特大地震影響刘陶,放射性物質(zhì)發(fā)生泄漏胳赌。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,039評(píng)論 3 316
  • 文/蒙蒙 一匙隔、第九天 我趴在偏房一處隱蔽的房頂上張望匈织。 院中可真熱鬧,春花似錦牡直、人聲如沸缀匕。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,798評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽乡小。三九已至,卻和暖如春饵史,著一層夾襖步出監(jiān)牢的瞬間满钟,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,027評(píng)論 1 266
  • 我被黑心中介騙來泰國(guó)打工胳喷, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留湃番,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,488評(píng)論 2 361
  • 正文 我出身青樓吭露,卻偏偏與公主長(zhǎng)得像吠撮,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子讲竿,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,612評(píng)論 2 350

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