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

分类:软件问题| 发布:佚名| 查看:14776 | 发表时间:2014/5/16

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

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

1.activity定义

1public ValueCallback<Uri> mUploadMessage;
2public final static int FILECHOOSER_RESULTCODE = 1;

2.扩展WebChromeClient

1WebChromeClient chromeClient = new WebChromeClientImpl();view.setWebChromeClient(chromeClient);

3.实现WebChromeClientImpl类

01private class WebChromeClientImpl extends WebChromeClient{
02  
03 //扩展支持alert事件
04 @Override
05 public boolean onJsAlert(WebView view, String url, String message,JsResult result) {
06    Builder builder = new Builder(view.getContext());
07    builder.setTitle("商机通提示").setMessage(message).setPositiveButton("确定", null);
08    builder.setCancelable(false);
09    builder.setIcon(R.drawable.ic_launcher);
10    AlertDialog dialog = builder.create();
11    dialog.show();
12    result.confirm();
13    return true;
14 }
15 //扩展浏览器上传文件
16 //3.0++版本
17 public void openFileChooser(ValueCallback&lt;Uri&gt; uploadMsg, String acceptType) {
18    mUploadMessage = uploadMsg;
19    Intent i = new Intent(Intent.ACTION_GET_CONTENT);
20    i.addCategory(Intent.CATEGORY_OPENABLE);
21    i.setType("*/*");
22    activity.startActivityForResult(Intent.createChooser(i, "File Chooser"), FILECHOOSER_RESULTCODE);
23 }
24 //3.0--版本
25 public void openFileChooser(ValueCallback&lt;Uri&gt; uploadMsg) {
26    mUploadMessage = uploadMsg;
27    Intent i = new Intent(Intent.ACTION_GET_CONTENT);
28    i.addCategory(Intent.CATEGORY_OPENABLE);
29    i.setType("*/*");
30    activity.startActivityForResult(Intent.createChooser(i, "file Browser"),FILECHOOSER_RESULTCODE);
31   }
32 }

以下是所有的android版本的一个完整的解决方案

001public class MyWb extends Activity {
002/** Called when the activity is first created. */
003 
004WebView web;
005ProgressBar progressBar;
006 
007private ValueCallback mUploadMessage;
008 private final static int FILECHOOSER_RESULTCODE=1;
009 
010 @Override
011 protected void onActivityResult(int requestCode, int resultCode,
012 Intent intent) {
013  if(requestCode==FILECHOOSER_RESULTCODE)
014  {
015    if (null == mUploadMessage) return;
016    Uri result = intent == null || resultCode != RESULT_OK ? null
017    : intent.getData();
018    mUploadMessage.onReceiveValue(result);
019    mUploadMessage = null;
020  }
021 }
022 
023@Override
024public void onCreate(Bundle savedInstanceState) {
025 super.onCreate(savedInstanceState);
026 setContentView(R.layout.main);
027 
028 web = (WebView) findViewById(R.id.webview01);
029 progressBar = (ProgressBar) findViewById(R.id.progressBar1);
030 
031 web = new WebView(this);
032 web.getSettings().setJavaScriptEnabled(true);
034 web.setWebViewClient(new myWebClient());
035 web.setWebChromeClient(new WebChromeClient()
036 {
037    //The undocumented magic method override
038    //Eclipse will swear at you if you try to put @Override here
039    // For Android 3.0+
040    public void openFileChooser(ValueCallback uploadMsg) {
041 
042      mUploadMessage = uploadMsg;
043      Intent i = new Intent(Intent.ACTION_GET_CONTENT);
044      i.addCategory(Intent.CATEGORY_OPENABLE);
045      i.setType("image/*");
046      MyWb.this.startActivityForResult(Intent.createChooser(i,"File Chooser"), FILECHOOSER_RESULTCODE);
047 
048 }
049 
050 // For Android 3.0+
051 public void openFileChooser( ValueCallback uploadMsg, String acceptType ) {
052    mUploadMessage = uploadMsg;
053    Intent i = new Intent(Intent.ACTION_GET_CONTENT);
054    i.addCategory(Intent.CATEGORY_OPENABLE);
055    i.setType("*/*");
056    MyWb.this.startActivityForResult(
057    Intent.createChooser(i, "File Browser"),
058    FILECHOOSER_RESULTCODE);
059 }
060 
061 //For Android 4.1
062 public void openFileChooser(ValueCallback uploadMsg, String acceptType, String capture){
063    mUploadMessage = uploadMsg;
064    Intent i = new Intent(Intent.ACTION_GET_CONTENT);
065    i.addCategory(Intent.CATEGORY_OPENABLE);
066    i.setType("image/*");
067    MyWb.this.startActivityForResult( Intent.createChooser( i, "File Chooser" ), MyWb.FILECHOOSER_RESULTCODE );
068 
069 }
070 
071 });
072 
073 
074 setContentView(web);
075 
076 
077}
078 
079public class myWebClient extends WebViewClient
080{
081 @Override
082 public void onPageStarted(WebView view, String url, Bitmap favicon) {
083    // TODO Auto-generated method stub
084    super.onPageStarted(view, url, favicon);
085 }
086 
087 @Override
088 public boolean shouldOverrideUrlLoading(WebView view, String url) {
089    // TODO Auto-generated method stub
090 
091    view.loadUrl(url);
092    return true;
093 
094 }
095 
096 @Override
097 public void onPageFinished(WebView view, String url) {
098    // TODO Auto-generated method stub
099   super.onPageFinished(view, url);
100 
101   progressBar.setVisibility(View.GONE);
102 }
103}
104 
105//flipscreen not loading again
106@Override
107public void onConfigurationChanged(Configuration newConfig){
108 super.onConfigurationChanged(newConfig);
109}
110 
111// To handle "Back" key press event for WebView to go back to previous screen.
112/*@Override
113public boolean onKeyDown(int keyCode, KeyEvent event)
114{
115 if ((keyCode == KeyEvent.KEYCODE_BACK) &amp;&amp; web.canGoBack()) {
116 web.goBack();
117 return true;
118 }
119 return super.onKeyDown(keyCode, event);
120}*/
121}

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

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

365据说看到好文章不转的人,服务器容易宕机
原创文章如转载,请注明:转载自郑州网建-前端开发 http://camnpr.com/
本文链接:http://camnpr.com/archives/1093.html