国产探花免费观看_亚洲丰满少妇自慰呻吟_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ā)表
主站蜘蛛池模板: 晴隆县| 重庆市| 萨迦县| 修水县| 邵东县| 攀枝花市| 罗平县| 堆龙德庆县| 灵山县| 唐山市| 行唐县| 吉安市| 湖南省| 桦甸市| 泾阳县| 峨边| 安泽县| 高碑店市| 安阳市| 田阳县| 祁阳县| 沐川县| 临洮县| 会理县| 阳西县| 屯昌县| 方正县| 罗源县| 盐源县| 融水| 高青县| 永德县| 丹阳市| 剑河县| 宁夏| 天水市| 澎湖县| 金沙县| 高陵县| 灵宝市| 新晃|