android webview中上传控件点击无效的解决办法 – CSDN博客

来源: android webview中上传控件点击无效的解决办法 – CSDN博客

一、介绍

当我们在使用webview控件打开一个web网页时,如果we页面中带有<input type=”file” …>的控件,在webview中能正常显示这个上传控件,但是你会发现无论你如何点击都无效果,这个是很让人恼火的,一时也不知道如何下手去改,这里阿汤哥会告诉你如何解决该问题,如果我的解决办法能帮到你,请给我点掌声,并给你自己点掌声。

二、解决办法

第一步:重写WebChromeClient

webview的坑比较多,在这个上传文件的坑中遇到一个问题:

Android 5.0+ 重写onShowFileChooser生效;

Android 4.4   重写openFileChooser没有生效;

Android 4.4- 重写openFileChooser生效;

  1. import android.net.Uri;
  2. import android.webkit.ValueCallback;
  3. import android.webkit.WebChromeClient;
  4. import android.webkit.WebView;
  5. /**
  6.  * Created by tangbin on 16/5/12.
  7.  */
  8. public class MyWebChromeClient extends WebChromeClient {
  9.     private WebCall webCall;
  10.     public void setWebCall(WebCall webCall) {
  11.         this.webCall = webCall;
  12.     }
  13.     // For Android 3.0+
  14.     public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType) {
  15.         if (webCall != null)
  16.             webCall.fileChose(uploadMsg);
  17.     }
  18.     // For Android < 3.0
  19.     public void openFileChooser(ValueCallback<Uri> uploadMsg) {
  20.         openFileChooser(uploadMsg, “”);
  21.     }
  22.     // For Android > 4.1.1
  23.     public void openFileChooser(ValueCallback<Uri> uploadMsg,
  24.             String acceptType, String capture) {
  25.         openFileChooser(uploadMsg, acceptType);
  26.     }
  27.     // For Android > 5.0
  28.     @Override
  29.     public boolean onShowFileChooser(WebView webView,
  30.             ValueCallback<Uri[]> filePathCallback,
  31.             FileChooserParams fileChooserParams) {
  32.         if (webCall != null)
  33.             webCall.fileChose5(filePathCallback);
  34.         return super.onShowFileChooser(webView, filePathCallback,
  35.                 fileChooserParams);
  36.     }
  37.     public interface WebCall {
  38.         void fileChose(ValueCallback<Uri> uploadMsg);
  39.         void fileChose5(ValueCallback<Uri[]> uploadMsg);
  40.     }
  41. }

 

第二步:监听ValueCallback

  1. WebSettings webSettings = mWebView.getSettings();
  2.         // 设置WebView属性,能够执行JavaScript脚本
  3.         webSettings.setJavaScriptEnabled(true);
  4.         // 设置可以访问文件
  5.         webSettings.setAllowFileAccess(true);
  6.         mWebView.setWebViewClient(new webViewClient());
  1. public final static int FILECHOOSER_RESULTCODE = 1;
  2. public final static int FILECHOOSER_RESULTCODE_FOR_ANDROID_5 = 2;
  3. public ValueCallback<Uri> mUploadMessage;
  4. public ValueCallback<Uri[]> mUploadMessageForAndroid5;

 

  1. @Override
  2. public void fileChose(ValueCallback<Uri> uploadMsg) {
  3.     openFileChooserImpl(uploadMsg);
  4. }
  5. @Override
  6. public void fileChose5(ValueCallback<Uri[]> uploadMsg) {
  7.     openFileChooserImplForAndroid5(uploadMsg);
  8. }
  9. private void openFileChooserImpl(ValueCallback<Uri> uploadMsg) {
  10.     mUploadMessage = uploadMsg;
  11.     Intent i = new Intent(Intent.ACTION_GET_CONTENT);
  12.     i.addCategory(Intent.CATEGORY_OPENABLE);
  13.     i.setType(“image/*”);
  14.     startActivityForResult(Intent.createChooser(i, “File Chooser”),
  15.             FILECHOOSER_RESULTCODE);
  16. }
  17. private void openFileChooserImplForAndroid5(ValueCallback<Uri[]> uploadMsg) {
  18.     mUploadMessageForAndroid5 = uploadMsg;
  19.     Intent contentSelectionIntent = new Intent(Intent.ACTION_GET_CONTENT);
  20.     contentSelectionIntent.addCategory(Intent.CATEGORY_OPENABLE);
  21.     contentSelectionIntent.setType(“image/*”);
  22.     Intent chooserIntent = new Intent(Intent.ACTION_CHOOSER);
  23.     chooserIntent.putExtra(Intent.EXTRA_INTENT, contentSelectionIntent);
  24.     chooserIntent.putExtra(Intent.EXTRA_TITLE, “Image Chooser”);
  25.     startActivityForResult(chooserIntent,
  26.             FILECHOOSER_RESULTCODE_FOR_ANDROID_5);
  27. }

 

第三步:创建onActivityResult

  1. @Override
  2. protected void onActivityResult(int requestCode, int resultCode,
  3.         Intent intent) {
  4.     if (requestCode == FILECHOOSER_RESULTCODE) {
  5.         if (null == mUploadMessage)
  6.             return;
  7.         Uri result = intent == null || resultCode != RESULT_OK ? null
  8.                 : intent.getData();
  9.         mUploadMessage.onReceiveValue(result);
  10.         mUploadMessage = null;
  11.     } else if (requestCode == FILECHOOSER_RESULTCODE_FOR_ANDROID_5) {
  12.         if (null == mUploadMessageForAndroid5)
  13.             return;
  14.         Uri result = (intent == null || resultCode != RESULT_OK) ? null
  15.                 : intent.getData();
  16.         if (result != null) {
  17.             mUploadMessageForAndroid5.onReceiveValue(new Uri[] { result });
  18.         } else {
  19.             mUploadMessageForAndroid5.onReceiveValue(new Uri[] {});
  20.         }
  21.         mUploadMessageForAndroid5 = null;
  22.     }
  23. }

搞定,最后就可以如愿以偿的完成文件上传了功能了

分享到: 更多 (0)