文档章节

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

 若沙
发布于 2016/08/30 09:09
字数 748
阅读 47
收藏 0

三星、华为等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

本文转载自:

粉丝 0
博文 42
码字总数 10695
作品 0
深圳
网页/平面设计
私信 提问
android调用js上传文件异常问题

需求: 在android客户端内用webview加载服务url, 类似一个壳,实现上传文件功能。 web代码片段 点击 input触发文件选择器。 android代码片段: 显示文件选择器 将需要上传的文件交给 ValueC...

lufengdie
2015/06/04
1K
1
驰骋工作流引擎-CCMobile与安卓、IOS集成过程中的问题与解决方案

CCMobile与安卓、IOS集成过程中的问题与解决方案 前言: CCMobile(2019版本)是CCFlow&JFlow 的一款移动端审批的产品。系统基于mui框架开发,是一款可以兼容Android与IOS的移动端工作流审批...

孟娟
06/26
76
0
android WebView总结

浏览器控件是每个开发环境都具备的,这为马甲神功提供了用武之地,windows的有webbrowser,android和ios都有webview。只是其引擎不同,相对于微软的webbrowser,android及ios的webview的引擎...

迷途d书童
2012/03/28
8.6K
1
有关WebView开发问题

如何创建WebView: 1、添加权限:AndroidManifest.xml中必须使用许可"android.permission.INTERNET",否则会出Web page not available错误。 2、在要Activity中生成一个WebView组件:WebView w......

无鸯
2011/11/09
761
0
android WebView详解

浏览器控件是每个开发环境都具备的,这为马甲神功提供了用武之地,windows的有webbrowser,android和ios都有webview。只是其引擎不同,相对于微软的webbrowser,android及ios的webview的引擎...

amigos_wu
2012/06/25
9.4K
1

没有更多内容

加载失败,请刷新页面

加载更多

Activity启动模式二

上篇文章Activity启动模式一主要介绍了Activity的四种启动模式,这些启动模式都是在AndroidManifest中进行配置的。除此之外,Android系统还通过Intent类提供了一些标志位,同样可以指定Activ...

ltlovezh
12分钟前
4
0
三原色还原

1、Color Filter Array — CFA 随着数码相机、手机的普及,CCD/CMOS 图像传感器近年来得到广泛的关注和应用。 图像传感器一般都采用一定的模式来采集图像数据,常用的有 BGR 模式和 CFA 模式...

天王盖地虎626
23分钟前
3
0
kubernetes pod exec接口调用

正文 一般生产环境上由于网络安全策略,大多数端口是不能为集群外部访问的。多个集群之间一般都是通过k8s的ApiServer组件提供的接口通信,如https://192.168.1.101:6443。所以在做云平台时,...

码农实战
今天
8
0
3_数组

3_数组

行者终成事
今天
8
0
经典系统设计面试题解析:如何设计TinyURL(二)

原文链接:https://www.educative.io/courses/grokking-the-system-design-interview/m2ygV4E81AR 编者注:本文以一道经典的系统设计面试题:《如何设计TinyURL》的参考答案和解析为例,帮助...

APEMESH
今天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部