【Android进阶】Android里webview不支持input file的解决方法(上传按钮点击失效的原因)...

本文详细介绍了在Android系统中,尤其是三星、华为设备上,WebView不支持input file类型的解决方法,包括如何扩展WebChromeClient,覆盖onActivityResult方法,以及处理不同Android版本的上传逻辑。同时提到,对于部分手机品牌可能需要查看其官方文档来寻找特定解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

三星、华为等android里webview不支持input file的解决方法

原文地址:http://camnpr.com/archives/1093.html

由于安全因素android webview屏蔽了文件上传控件,但是他并没有完全封掉。

 

[html] view plain copy

 在CODE上查看代码片派生到我的代码片

  1. <form method="POST" enctype="multipart/form-data">  
  2. File to upload: <input type="file" name="uploadfile">    
  3. <input type="submit" value="Press to Upload..."> to upload the file!  
  4. </form>  

 

1.activity定义

 

[java] view plain copy

 在CODE上查看代码片派生到我的代码片

  1. private ValueCallback mUploadMessage;  
  2. private final static int FILECHOOSER_RESULTCODE = 1;  

 

 

2.扩展WebChromeClient

 

[java] view plain copy

 在CODE上查看代码片派生到我的代码片

  1. WebChromeClient chromeClient = new WebChromeClientImpl();  
  2. webView.setWebChromeClient(chromeClient);  


3.实现WebChromeClientImpl类

 

 

[java] view plain copy

 在CODE上查看代码片派生到我的代码片

  1. public class WebChromeClientImpl extends WebChromeClient {  
  2.         @Override  
  3.         public boolean onJsAlert(WebView view, String url, String message, JsResult result) {  
  4.             AlertDialog.Builder builder = new AlertDialog.Builder(view.getContext());  
  5.             builder.setTitle("提示").setMessage(message).setPositiveButton("确定", null);  
  6.             builder.setCancelable(false);  
  7.             AlertDialog dialog = builder.create();  
  8.             dialog.show();  
  9.             result.confirm();  
  10.             return true;  
  11.         }  
  12.   
  13.         public void openFileChooser(ValueCallback uploadMsg) {  
  14.             mUploadMessage = uploadMsg;  
  15.             Intent i = new Intent(Intent.ACTION_GET_CONTENT);  
  16.             i.addCategory(Intent.CATEGORY_OPENABLE);  
  17.             i.setType("image/*");  
  18.             startActivityForResult(Intent.createChooser(i, "File Chooser"), FILECHOOSER_RESULTCODE);  
  19.         }  
  20.   
  21.         //扩展浏览器上传文件  
  22.         //3.0++版本  
  23.         public void openFileChooser( ValueCallback uploadMsg, String acceptType ) {  
  24.             mUploadMessage = uploadMsg;  
  25.             Intent i = new Intent(Intent.ACTION_GET_CONTENT);  
  26.             i.addCategory(Intent.CATEGORY_OPENABLE);  
  27.             i.setType("*/*");  
  28.             startActivityForResult(  
  29.                     Intent.createChooser(i, "File Browser"),  
  30.                     FILECHOOSER_RESULTCODE);  
  31.         }  
  32.   
  33.         //For Android 4.1  
  34.         public void openFileChooser(ValueCallback uploadMsg, String acceptType, String capture) {  
  35.             mUploadMessage = uploadMsg;  
  36.             Intent i = new Intent(Intent.ACTION_GET_CONTENT);  
  37.             i.addCategory(Intent.CATEGORY_OPENABLE);  
  38.             i.setType("image/*");  
  39.             startActivityForResult(Intent.createChooser(i, "File Chooser"), FILECHOOSER_RESULTCODE);  
  40.         }  
  41. }  


4.解决选择文件后按钮失效问题,需要覆写onActivityResult方法

 

 

[java] view plain copy

 在CODE上查看代码片派生到我的代码片

  1. @Override  
  2. public void onActivityResult(int requestCode, int resultCode, Intent data) {  
  3.     if(requestCode == FILECHOOSER_RESULTCODE){  
  4.         if(null == mUploadMessage)  
  5.         return;  
  6.         Uri result = data ==null || resultCode != Activity.RESULT_OK ?null:data.getData();  
  7.         mUploadMessage.onReceiveValue(result);  
  8.         mUploadMessage = null;  
  9.     }  
  10. }  

 

 

下面是原文的一个完整案例,很有参考价值

 

[java] view plain copy

 在CODE上查看代码片派生到我的代码片

  1. public class MyWb extends Activity {  
  2.     /** Called when the activity is first created. */  
  3.   
  4.     WebView web;  
  5.     ProgressBar progressBar;  
  6.   
  7.     private ValueCallback mUploadMessage;  
  8.     private final static int FILECHOOSER_RESULTCODE = 1;  
  9.   
  10.     @Override  
  11.     protected void onActivityResult(int requestCode, int resultCode,  
  12.             Intent intent) {  
  13.         if (requestCode == FILECHOOSER_RESULTCODE) {  
  14.             if (null == mUploadMessage)  
  15.                 return;  
  16.             Uri result = intent == null || resultCode != RESULT_OK ? null  
  17.                     : intent.getData();  
  18.             mUploadMessage.onReceiveValue(result);  
  19.             mUploadMessage = null;  
  20.         }  
  21.     }  
  22.   
  23.     @Override  
  24.     public void onCreate(Bundle savedInstanceState) {  
  25.         super.onCreate(savedInstanceState);  
  26.         setContentView(R.layout.main);  
  27.   
  28.         web = (WebView) findViewById(R.id.webview01);  
  29.         progressBar = (ProgressBar) findViewById(R.id.progressBar1);  
  30.   
  31.         web = new WebView(this);  
  32.         web.getSettings().setJavaScriptEnabled(true);  
  33.         web.loadUrl("http://www.script-tutorials.com/demos/199/index.html");  
  34.         web.setWebViewClient(new myWebClient());  
  35.         web.setWebChromeClient(new WebChromeClient() {  
  36.             // The undocumented magic method override  
  37.             // Eclipse will swear at you if you try to put @Override here  
  38.             // For Android 3.0+  
  39.             public void openFileChooser(ValueCallback uploadMsg) {  
  40.   
  41.                 mUploadMessage = uploadMsg;  
  42.                 Intent i = new Intent(Intent.ACTION_GET_CONTENT);  
  43.                 i.addCategory(Intent.CATEGORY_OPENABLE);  
  44.                 i.setType("image/*");  
  45.                 MyWb.this.startActivityForResult(  
  46.                         Intent.createChooser(i, "File Chooser"),  
  47.                         FILECHOOSER_RESULTCODE);  
  48.             }  
  49.   
  50.             // For Android 3.0+  
  51.             public void openFileChooser(ValueCallback uploadMsg,  
  52.                     String acceptType) {  
  53.                 mUploadMessage = uploadMsg;  
  54.                 Intent i = new Intent(Intent.ACTION_GET_CONTENT);  
  55.                 i.addCategory(Intent.CATEGORY_OPENABLE);  
  56.                 i.setType("*/*");  
  57.                 MyWb.this.startActivityForResult(  
  58.                         Intent.createChooser(i, "File Browser"),  
  59.                         FILECHOOSER_RESULTCODE);  
  60.             }  
  61.   
  62.             // For Android 4.1  
  63.             public void openFileChooser(ValueCallback uploadMsg,  
  64.                     String acceptType, String capture) {  
  65.                 mUploadMessage = uploadMsg;  
  66.                 Intent i = new Intent(Intent.ACTION_GET_CONTENT);  
  67.                 i.addCategory(Intent.CATEGORY_OPENABLE);  
  68.                 i.setType("image/*");  
  69.                 MyWb.this.startActivityForResult(  
  70.                         Intent.createChooser(i, "File Chooser"),  
  71.                         MyWb.FILECHOOSER_RESULTCODE);  
  72.             }  
  73.   
  74.         });  
  75.   
  76.         // 这句干啥的(⊙o⊙)?  
  77.         setContentView(web);  
  78.   
  79.     }  
  80.   
  81.     public class myWebClient extends WebViewClient  
  82.   
  83.     {  
  84.   
  85.         @Override  
  86.         public void onPageStarted(WebView view, String url, Bitmap favicon) {  
  87.             // TODO Auto-generated method stub  
  88.             super.onPageStarted(view, url, favicon);  
  89.         }  
  90.   
  91.         @Override  
  92.         public boolean shouldOverrideUrlLoading(WebView view, String url) {  
  93.             // TODO Auto-generated method stub  
  94.             view.loadUrl(url);  
  95.             return true;  
  96.   
  97.         }  
  98.   
  99.         @Override  
  100.         public void onPageFinished(WebView view, String url) {  
  101.   
  102.             // TODO Auto-generated method stub  
  103.   
  104.             super.onPageFinished(view, url);  
  105.   
  106.             progressBar.setVisibility(View.GONE);  
  107.   
  108.         }  
  109.   
  110.     }  
  111.   
  112.     // flipscreen not loading again  
  113.   
  114.     @Override  
  115.     public void onConfigurationChanged(Configuration newConfig) {  
  116.   
  117.         super.onConfigurationChanged(newConfig);  
  118.   
  119.     }  
  120.   
  121.     // To handle "Back" key press event for WebView to go back to previous  
  122.     // screen.  
  123.   
  124.     @Override  
  125. public boolean onKeyDown(int keyCode, KeyEvent event)  
  126.   
  127. {  
  128.   
  129.  if ((keyCode == KeyEvent.KEYCODE_BACK) && web.canGoBack()) {  
  130.   
  131.  web.goBack();  
  132.  return true;  
  133.   
  134.  }  
  135.   
  136.  return super.onKeyDown(keyCode, event);  
  137.   
  138. }  
  139. }  

 

 

此外,我想补充一点, “上传页面”像在这个例子中, < 4个版本不会工作,因为它有一个图像预览功能,如果你想使它工作使用一个简单的php上传无预览。

对于一些手机品牌修改了android浏览器,比如:三星,我们可以查看他们官网找到解决办法的。samsung developers

转载于:https://my.oschina.net/u/2558718/blog/739613

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值