Android中webview无法弹出文件选择框,点击按钮没反应的问题

以前写的项目时,遇到过这样一个问题,在ios和微信都可以,就是android不行,尴尬的,无论你多使劲点都发现无法弹出安卓原生文件选择界面,简直要崩溃了尴尬最后通过一番资料查询,发现要重写WebChromeClient类里面的方法--


先说一下执行的步骤:

       1.通过webview.setWebChromeClient(),传入一个WebChromeClient的实现类,在WebChromeClient实现类里面我们要重写里面的openFileChooser方法,这个方法会在文件准备上传时进行回调。

       2.在openFileChooser这个方法里面我们设置Intent打开支持第三方文件的应用

       3.然后在ActivityResult将第三方应用提供的内容通过ValueCallback的存储形式回传给webview。

   一言不合直接贴代码..

[java]  view plain  copy
  1. <span style="color:#ff6666;font-size:24px;">  </span><span style="font-size:18px;">public void openFileChooser(ValueCallback<Uri> uploadMsg) {  
  2.             Log.d(TAG, "openFileChoose(ValueCallback<Uri> uploadMsg)");  
  3.             mUploadMessage = uploadMsg;  
  4.             Intent i = new Intent(Intent.ACTION_GET_CONTENT);  
  5.             i.addCategory(Intent.CATEGORY_OPENABLE);  
  6.             i.setType("*/*");  
  7.             MainActivity.this.startActivityForResult(Intent.createChooser(i, "File Chooser"), FILECHOOSER_RESULTCODE);  
  8.       }  
  9.       public void openFileChooser( ValueCallback uploadMsg, String acceptType ) {  
  10.             Log.d(TAG, "openFileChoose( ValueCallback uploadMsg, String acceptType )");  
  11.             mUploadMessage = uploadMsg;  
  12.             Intent i = new Intent(Intent.ACTION_GET_CONTENT);  
  13.             i.addCategory(Intent.CATEGORY_OPENABLE);  
  14.             i.setType("*/*");  
  15.             MainActivity.this.startActivityForResult(  
  16.                     Intent.createChooser(i, "File Browser"),  
  17.                     FILECHOOSER_RESULTCODE);  
  18.       }  
  19.       public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType, String capture){  
  20.             Log.d(TAG, "openFileChoose(ValueCallback<Uri> uploadMsg, String acceptType, String capture)");  
  21.             mUploadMessage = uploadMsg;  
  22.             Intent i = new Intent(Intent.ACTION_GET_CONTENT);  
  23.             i.addCategory(Intent.CATEGORY_OPENABLE);  
  24.             i.setType("*/*");  
  25.             MainActivity.this.startActivityForResult( Intent.createChooser( i, "File Browser" ), MainActivity.FILECHOOSER_RESULTCODE );  
  26.         }</span>  
因为openFileChooser有多个重载方法,所以我们都帮它复写..

接下来是ActivityForResult的方法实现

[java]  view plain  copy
  1. if(requestCode==FILECHOOSER_RESULTCODE)  
  2.          {  
  3.                 if (null == mUploadMessage && null == mUploadCallbackAboveL) return;  
  4.                  Uri result = data == null || resultCode != RESULT_OK ? null : data.getData();  
  5.                  if (mUploadMessage != null) {  
  6.                     mUploadMessage.onReceiveValue(result);  
  7.                     mUploadMessage = null;  
  8.                }  
  9.           }  
这样大致就可以实现webview文件上传功能了, 但是问题来了!! 微笑 微笑

你会发现安卓5.0以上的机器还是没有反应,后来发现它回调的不是openFileChooser而是onShowFileChooser!!挖槽,挖槽,挖槽。

这简直是一个大坑啊!!!~~~~再见直接看代码

[java]  view plain  copy
  1. // For Android 5.0+  
  2. public boolean onShowFileChooser (WebView webView, ValueCallback<Uri[]> filePathCallback, WebChromeClient.FileChooserParams fileChooserParams) {  
  3.          mUploadCallbackAboveL = filePathCallback;  
  4.          Intent i = new Intent(Intent.ACTION_GET_CONTENT);  
  5.          i.addCategory(Intent.CATEGORY_OPENABLE);  
  6.          i.setType("*/*");  
  7.          MainActivity.this.startActivityForResult(  
  8.                     Intent.createChooser(i, "File Browser"),  
  9.                     FILECHOOSER_RESULTCODE);  
  10.          return true;  
  11.         }  
  12. });  
ActivityForResult的方法也需要改下,应该它现在回调的是ValueCallback(Uri[])类型而不是ValueCallback(Uri)类型了、

[java]  view plain  copy
  1. @Override  
  2. protected void onActivityResult(int requestCode, int resultCode, Intent data) {  
  3.     super.onActivityResult(requestCode, resultCode, data);  
  4.     if(requestCode==FILECHOOSER_RESULTCODE)  
  5.     {  
  6.         if (null == mUploadMessage && null == mUploadCallbackAboveL) return;  
  7.         Uri result = data == null || resultCode != RESULT_OK ? null : data.getData();  
  8.         if (mUploadCallbackAboveL != null) {  
  9.             onActivityResultAboveL(requestCode, resultCode, data);  
  10.         }  
  11.         else  if (mUploadMessage != null) {  
  12.             mUploadMessage.onReceiveValue(result);  
  13.             mUploadMessage = null;  
  14.         }  
  15.     }  
  16. }  

[java]  view plain  copy
  1. @TargetApi(Build.VERSION_CODES.LOLLIPOP)  
  2. private void onActivityResultAboveL(int requestCode, int resultCode, Intent data) {  
  3.     if (requestCode != FILECHOOSER_RESULTCODE  
  4.             || mUploadCallbackAboveL == null) {  
  5.         return;  
  6.     }  
  7.     Uri[] results = null;  
  8.     if (resultCode == Activity.RESULT_OK) {  
  9.         if (data == null) {  
  10.         } else {  
  11.             String dataString = data.getDataString();  
  12.             ClipData clipData = data.getClipData();  
  13.             if (clipData != null) {  
  14.                 results = new Uri[clipData.getItemCount()];  
  15.                 for (int i = 0; i < clipData.getItemCount(); i++) {  
  16.                     ClipData.Item item = clipData.getItemAt(i);  
  17.                     results[i] = item.getUri();  
  18.                 }  
  19.             }  
  20.             if (dataString != null)  
  21.                 results = new Uri[]{Uri.parse(dataString)};  
  22.         }  
  23.     }  
  24.     mUploadCallbackAboveL.onReceiveValue(results);  
  25.     mUploadCallbackAboveL = null;  
  26.     return;  
  27. }  

猜你喜欢

转载自blog.csdn.net/qq_34650238/article/details/79923661