国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 系統(tǒng) > Android > 正文

淺談關(guān)于Android WebView上傳文件的解決方案

2019-10-22 18:27:17
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

我們?cè)陂_(kāi)發(fā)需求的時(shí)候,難免會(huì)接入一下第三方的H5頁(yè)面,有些H5頁(yè)面是具有上傳照片的功能,Android 中的 WebView是不能直接打開(kāi)文件選擇彈框的

接下來(lái)我講簡(jiǎn)單提供一下解決方案,先說(shuō)一下思路

1.接收WebView打開(kāi)文件選擇器的通知

2.收到通知后,打開(kāi)文件選擇器等待用戶(hù)選擇需要上傳的文件

3.在onActivityResult中得到用戶(hù)選擇的文件的Uri

4.然后把Uri傳遞給Html5

這樣就完成了一次H5選擇文件的過(guò)程,下面我把代碼貼出來(lái)自習(xí)看一下

首先,WebView必須要支持JS交互,所以要打開(kāi)JS交互

mWebView.getSettings().setJavaScriptEnabled(true);

當(dāng)H5在調(diào)用上傳文件的Api的時(shí)候,WebView會(huì)回調(diào) openFileChooser和onShowFileChooser 方法來(lái)通知我們,我們這個(gè)時(shí)候要做的就是重寫(xiě)這個(gè)方法

需要注意的是這個(gè)方法在不同的Api上會(huì)回調(diào)不同行參方法

mWebView.setWebChromeClient(new WebChromeClient() {   @Override   public void onProgressChanged(WebView view, int newProgress) {    if (newProgress == 100) {     mBar.setVisibility(View.GONE);    } else {     mBar.setVisibility(View.VISIBLE);     mBar.setProgress(newProgress);    }    super.onProgressChanged(view, newProgress);   }   //For Android API < 11 (3.0 OS)   public void openFileChooser(ValueCallback<Uri> valueCallback) {    uploadMessage = valueCallback;    openImageChooserActivity();   }   //For Android API >= 11 (3.0 OS)   public void openFileChooser(ValueCallback<Uri> valueCallback, String acceptType, String capture) {    uploadMessage = valueCallback;    openImageChooserActivity();   }   //For Android API >= 21 (5.0 OS)   @Override   public boolean onShowFileChooser(WebView webView, ValueCallback<Uri[]> filePathCallback, WebChromeClient.FileChooserParams fileChooserParams) {    uploadMessageAboveL = filePathCallback;    openImageChooserActivity();    return true;   }  }); 

我們?cè)趏penFileChooser方法中先保存了一下ValueCallback的回調(diào)對(duì)象,這個(gè)對(duì)象最后用來(lái)通知H5文件地址,我們之后在調(diào)用openFileChooser方法來(lái)打開(kāi)文件選擇器

private void openImageChooserActivity() {  Intent i = new Intent(Intent.ACTION_GET_CONTENT);  i.addCategory(Intent.CATEGORY_OPENABLE);  i.setType("image/*");  startActivityForResult(Intent.createChooser(i, "Image Chooser"), FILE_CHOOSER_RESULT_CODE); } 

當(dāng)用戶(hù)選擇完文件后,會(huì)調(diào)用onActivityResult方法,我們重寫(xiě)并等待回調(diào)

@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) {  super.onActivityResult(requestCode, resultCode, data);  if (requestCode == FILE_CHOOSER_RESULT_CODE) {   if (null == uploadMessage && null == uploadMessageAboveL) return;   Uri result = data == null || resultCode != RESULT_OK ? null : data.getData();   if (uploadMessageAboveL != null) {    onActivityResultAboveL(requestCode, resultCode, data);   } else if (uploadMessage != null) {    uploadMessage.onReceiveValue(result);    uploadMessage = null;   }  } } @TargetApi(Build.VERSION_CODES.LOLLIPOP) private void onActivityResultAboveL(int requestCode, int resultCode, Intent intent) {  if (requestCode != FILE_CHOOSER_RESULT_CODE || uploadMessageAboveL == 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)};   }  }  uploadMessageAboveL.onReceiveValue(results);  uploadMessageAboveL = null; } 

onActivityResult就是用來(lái)通知H5用戶(hù)選擇的文件地址,在這個(gè)方法里,用我們之前保存的ValueCallback對(duì)象,調(diào)用onReceiveValue方法,H5就可以收到我們傳遞給它的地址信息了!

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持VEVB武林網(wǎng)。


注:相關(guān)教程知識(shí)閱讀請(qǐng)移步到Android開(kāi)發(fā)頻道。
發(fā)表評(píng)論 共有條評(píng)論
用戶(hù)名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 南雄市| 遵义市| 信阳市| 娱乐| 青铜峡市| 大埔县| 巴塘县| 长阳| 榆林市| 交口县| 错那县| 稷山县| 秭归县| 永福县| 临武县| 新绛县| 平定县| 墨竹工卡县| 渝北区| 屏边| 凉山| 开平市| 安顺市| 长治市| 武定县| 乾安县| 专栏| 尼玛县| 福安市| 高台县| 阿克| 于都县| 辉县市| 库尔勒市| 黄大仙区| 康平县| 新乡市| 光泽县| 绥江县| 乐昌市| 黄浦区|