Webview中選擇本地圖片上傳(一)

原創(chuàng)文章,轉(zhuǎn)載請注明本文出處http://www.reibang.com/p/841bfa47b45c
這篇文章的已知bug窿侈,我已經(jīng)改好了念秧,在我另一篇博文里,地址:http://www.reibang.com/p/62f3750f72a8

前言

一周前做的項目中聊闯,要嵌入一個H5的頁面工猜,這個H5功能很簡單,主要就是給用戶提供預約申請菱蔬,其中需要上傳本人身份證篷帅。

在這里推薦一下github上面開源的小型AgentWeb
還有就是騰訊的TBS騰訊瀏覽服務
這兩個我都在項目中嘗試過,效果都還不錯拴泌,關于這兩個庫的具體使用方法魏身,我上面給出的github地址或官方技術接入指南講的都比較詳細,就不綴述了弛针,您要是有疑問可以在評論區(qū)留言叠骑,咱們可以互相探討。

正題

這是H5頁面中需要上傳圖片的截圖


H5頁面中需要上傳圖片的截圖.png

通過webview.loadUrl(“你要加載的地址”)加載網(wǎng)頁時削茁,在手持設備上點擊圖中上傳圖片時宙枷,用以上兩個庫不做任何處理的情況下,有以下問題:

    1. AgentWeb會出現(xiàn)彈出圖片選擇器掉房,本以為接下來點擊相冊會進入相冊,但是實際情況是(不同手機會有不同表現(xiàn))點擊相冊之后慰丛,閃退卓囚。
    1. 集成TBS騰訊瀏覽服務,不給webView設置一個webview.webviewClient()诅病,會從手機上已安裝的一個瀏覽器正常打開相冊哪亿,但是這樣就像是從你的應用進入到了其他應用,所以一般還是要webView.setWebViewClient()贤笆,寫上這個方法之后蝇棉,點擊上傳圖片會沒有任何響應。

解決

這個時候我們需要H5跟Android互調(diào)(js跟java互調(diào))
思路:在H5頁面上點擊這個上傳圖片時芥永,調(diào)用的是Android原生方法來打開相冊或者攝像頭篡殷,下面以打開相冊為例。
代碼片段:

//  js 調(diào)android 方法
        webView.addJavascriptInterface(new DemoJavaScriptInterface(), "demo");

這里的DemoJavaScriptInterface是你要定義給JS調(diào)用的方法的所屬類名埋涧,
下圖中的demo.chickOnAndroid就是js中要拼接而成的方法


js中調(diào)用安卓方法.png
  /**
     * 定義的給js調(diào)的方法
     */
    final class DemoJavaScriptInterface{
        DemoJavaScriptInterface(){
        }

        @JavascriptInterface
        public void clickOnAndroid(String s){
           //這里執(zhí)行你用Android原生方法打開相冊或攝像頭的操作
           //用intent打開即可
       startActivityForResult(把intent傳進來)板辽;
  }```
**clickOnAndroid(String s)中的String類型的參數(shù)s,
就是js中window.demo.clickOnAndroid(getJson())方法中棘催,getJson()返回的值**

要打開手機中的文件還需要

//用來接收下面ValueCallback<Uri> 回調(diào)

   private ValueCallback<Uri> mUploadMessage;
   private ValueCallback<Uri[]> uploadMessageAboveL;
..........................................................................................................................
webView.setWebChromeClient(new WebChromeClient(){
           //Android 3.0 以下
           public void openFileChooser(ValueCallback<Uri> valueCallback) {
               mUploadMessage = valueCallback;
               selectImage();//就是上面
           }
           // Android 3~4.1
           public void openFileChooser(ValueCallback valueCallback, String acceptType) {
               mUploadMessage = valueCallback;
               selectImage();
           }
           // Android  4.1以上
           public void openFileChooser(ValueCallback<Uri> valueCallback, String acceptType, String capture) {
               mUploadMessage = valueCallback;
               selectImage();
           }
           // Android 5.0以上 
           @Override
           public boolean onShowFileChooser(WebView webView, ValueCallback<Uri[]> filePathCallback,
                   WebChromeClient.FileChooserParams fileChooserParams ) {
               uploadMessageAboveL = filePathCallback;
               selectImage();
               return true;
           }
})劲弦;

openFileChooser是WebChromeClient中的隱藏方法需要你手動去寫
5.0之后就變成了onShowFileChooser
selectImage()就是你選擇圖片的一些操作

private void selectImage() {
        FileUtils.delFile(compressPath);
        Intent intent;
        if (Build.VERSION.SDK_INT < 19) {
            intent = new Intent(Intent.ACTION_GET_CONTENT);
            intent.setType("image/*");
        } else {
            intent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
         Intent wrapperIntent = Intent.createChooser(intent, null);
        //REQ_CHOOSE是定義的一個常量
        startActivityForResult(wrapperIntent, REQ_CHOOSE);
        }

在Activity中還要重寫onActivityResult()來處理你選擇圖片之后的操作

@Override
    protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
        super.onActivityResult(requestCode, resultCode, intent);
        if(null == intent){
            //為了避免  彈出  相冊選擇器 之后 點擊取消  閃退
            mUploadMessage.onReceiveValue(null);
            return;
        }
        if (null== mUploadMessage){
            mUploadMessage.onReceiveValue(null);
            return;
        }
        Uri uri = null;
        if (requestCode ==REQ_CHOOSE){
            uri = afterChosePic(intent);
     //afterChosePic()這是選擇照片之后要處理的
        }
        mUploadMessage.onReceiveValue(uri);
        mUploadMessage = null;
    }```

afterChosePic()方法代碼

private Uri afterChosePic(Intent data) {

    // 獲取圖片的路徑:
    String[] proj = { MediaStore.Images.Media.DATA };
    // 好像是android多媒體數(shù)據(jù)庫的封裝接口,具體的看Android文檔
    Cursor cursor = managedQuery(data.getData(), proj, null, null, null);
    if(cursor == null ){
        Toast.makeText(this, "上傳的圖片僅支持png或jpg格式",Toast.LENGTH_SHORT).show();
        return null;
    }
    // 按我個人理解 這個是獲得用戶選擇的圖片的索引值
    int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
    // 將光標移至開頭 醇坝,這個很重要邑跪,不小心很容易引起越界
    cursor.moveToFirst();
    // 最后根據(jù)索引值獲取圖片路徑
    String path = cursor.getString(column_index);
    if(path != null && (path.endsWith(".png")||path.endsWith(".PNG")||path.endsWith(".jpg")||path.endsWith(".JPG"))){
        File newFile = FileUtils.compressFile(path, compressPath);
        return Uri.fromFile(newFile);
    }else{
        Toast.makeText(this, "上傳的圖片僅支持png或jpg格式",Toast.LENGTH_SHORT).show();
    }
    return null;
}
#####到此,webview加載h5頁面(也就是js)選擇圖片的操作就基本完成了
(噓纲仍,上班期間躲著寫的呀袱,可能思路有點亂,沒看明白的可以留言郑叠,我看到了就會回)
最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末夜赵,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子乡革,更是在濱河造成了極大的恐慌寇僧,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,183評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件沸版,死亡現(xiàn)場離奇詭異嘁傀,居然都是意外死亡,警方通過查閱死者的電腦和手機视粮,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評論 3 399
  • 文/潘曉璐 我一進店門细办,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事笑撞〉盒ィ” “怎么了?”我有些...
    開封第一講書人閱讀 168,766評論 0 361
  • 文/不壞的土叔 我叫張陵茴肥,是天一觀的道長坚踩。 經(jīng)常有香客問我,道長瓤狐,這世上最難降的妖魔是什么瞬铸? 我笑而不...
    開封第一講書人閱讀 59,854評論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮础锐,結果婚禮上嗓节,老公的妹妹穿的比我還像新娘。我一直安慰自己皆警,他們只是感情好赦政,可當我...
    茶點故事閱讀 68,871評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著耀怜,像睡著了一般。 火紅的嫁衣襯著肌膚如雪桐愉。 梳的紋絲不亂的頭發(fā)上财破,一...
    開封第一講書人閱讀 52,457評論 1 311
  • 那天,我揣著相機與錄音从诲,去河邊找鬼左痢。 笑死,一個胖子當著我的面吹牛系洛,可吹牛的內(nèi)容都是我干的俊性。 我是一名探鬼主播,決...
    沈念sama閱讀 40,999評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼描扯,長吁一口氣:“原來是場噩夢啊……” “哼定页!你這毒婦竟也來了?” 一聲冷哼從身側響起绽诚,我...
    開封第一講書人閱讀 39,914評論 0 277
  • 序言:老撾萬榮一對情侶失蹤典徊,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后恩够,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體卒落,經(jīng)...
    沈念sama閱讀 46,465評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,543評論 3 342
  • 正文 我和宋清朗相戀三年蜂桶,在試婚紗的時候發(fā)現(xiàn)自己被綠了儡毕。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,675評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡扑媚,死狀恐怖腰湾,靈堂內(nèi)的尸體忽然破棺而出雷恃,到底是詐尸還是另有隱情,我是刑警寧澤檐盟,帶...
    沈念sama閱讀 36,354評論 5 351
  • 正文 年R本政府宣布褂萧,位于F島的核電站,受9級特大地震影響葵萎,放射性物質(zhì)發(fā)生泄漏导犹。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,029評論 3 335
  • 文/蒙蒙 一羡忘、第九天 我趴在偏房一處隱蔽的房頂上張望谎痢。 院中可真熱鬧,春花似錦卷雕、人聲如沸节猿。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽滨嘱。三九已至,卻和暖如春浸间,著一層夾襖步出監(jiān)牢的瞬間太雨,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評論 1 274
  • 我被黑心中介騙來泰國打工魁蒜, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留囊扳,地道東北人。 一個月前我還...
    沈念sama閱讀 49,091評論 3 378
  • 正文 我出身青樓兜看,卻偏偏與公主長得像锥咸,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子细移,可洞房花燭夜當晚...
    茶點故事閱讀 45,685評論 2 360

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

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,305評論 25 707
  • 發(fā)現(xiàn) 關注 消息 iOS 第三方庫搏予、插件、知名博客總結 作者大灰狼的小綿羊哥哥關注 2017.06.26 09:4...
    肇東周閱讀 12,121評論 4 61
  • 最基礎的使用方法 最簡單的布局: 在Activity中使用WebView: 但只是這樣的話葫哗,在模擬器上是會直接調(diào)到...
    HolenZhou閱讀 7,806評論 12 33
  • 《寫給這一場大雪》 雖然留戀你的溫柔 但不要依仗得寵 普天蓋地的賴著不走 推遲了春天刪刪來遲的腳步 冷了人們的期許...
    一葉飛揚閱讀 208評論 0 0
  • 2016年9月27日 星期二 一缔刹、本周最新就業(yè)快報: UIUE54班呂*業(yè)渤海船舶職業(yè)學院輪機管理大專-目前就職于...
    UIUE設計師早報閱讀 938評論 0 0