WebView中input file的解决方法

public class MyWb extends Activity {
    /** Called when the activity is first created. */
    WebView web;
    ProgressBar progressBar;

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

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
        if (requestCode == FILECHOOSER_RESULTCODE) {
            if (null == mUploadMessage)
                return;
            Uri result = intent == null || resultCode != RESULT_OK ? null : intent.getData();
            mUploadMessage.onReceiveValue(result);
            mUploadMessage = null;
        }
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        web = (WebView) findViewById(R.id.webview01);
        progressBar = (ProgressBar) findViewById(R.id.progressBar1);

        web = new WebView(this);
        web.getSettings().setJavaScriptEnabled(true);
        web.loadUrl("http://www.script-tutorials.com/demos/199/index.html");
        web.setWebViewClient(new myWebClient());
        web.setWebChromeClient(new WebChromeClient() {
            // The undocumented magic method override
            // Eclipse will swear at you if you try to put @Override here
            // For Android 3.0+
            public void openFileChooser(ValueCallback<Uri> uploadMsg) {
                mUploadMessage = uploadMsg;
                Intent i = new Intent(Intent.ACTION_GET_CONTENT);
                i.addCategory(Intent.CATEGORY_OPENABLE);
                i.setType("image/*");
                MyWb.this.startActivityForResult(Intent.createChooser(i, "File Chooser"), FILECHOOSER_RESULTCODE);
            }

            // For Android 3.0+
            public void openFileChooser(ValueCallback uploadMsg, String acceptType) {
                mUploadMessage = uploadMsg;
                Intent i = new Intent(Intent.ACTION_GET_CONTENT);
                i.addCategory(Intent.CATEGORY_OPENABLE);
                i.setType("*/*");
                MyWb.this.startActivityForResult(Intent.createChooser(i, "File Browser"), FILECHOOSER_RESULTCODE);
            }

            // For Android 4.1
            public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType, String capture) {
                mUploadMessage = uploadMsg;
                Intent i = new Intent(Intent.ACTION_GET_CONTENT);
                i.addCategory(Intent.CATEGORY_OPENABLE);
                i.setType("image/*");
                MyWb.this.startActivityForResult(Intent.createChooser(i, "File Chooser"), MyWb.FILECHOOSER_RESULTCODE);
            }

        });
        setContentView(web);

    }

    public class myWebClient extends WebViewClient {
        @Override
        public void onPageStarted(WebView view, String url, Bitmap favicon) {
            // TODO Auto-generated method stub
            super.onPageStarted(view, url, favicon);
        }

        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            // TODO Auto-generated method stub
            view.loadUrl(url);
            return true;

        }

        @Override
        public void onPageFinished(WebView view, String url) {
            // TODO Auto-generated method stub
            super.onPageFinished(view, url);
            progressBar.setVisibility(View.GONE);
        }
    }

    // flipscreen not loading again
    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
    }

    // To handle "Back" key press event for WebView to go back to previous
    // screen.
    /*
     * @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if
     * ((keyCode == KeyEvent.KEYCODE_BACK) && web.canGoBack()) { web.goBack();
     * return true; } return super.onKeyDown(keyCode, event); }
     */
}

 

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

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

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

1.activity定义

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

2.扩展WebChromeClient

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

3.实现WebChromeClientImpl类

private class WebChromeClientImpl extends WebChromeClient{
  
 //扩展支持alert事件
 @Override
 public boolean onJsAlert(WebView view, String url, String message,JsResult result) {
    Builder builder = new Builder(view.getContext());
    builder.setTitle("商机通提示").setMessage(message).setPositiveButton("确定", null);
    builder.setCancelable(false);
    builder.setIcon(R.drawable.ic_launcher);
    AlertDialog dialog = builder.create();
    dialog.show();
    result.confirm();
    return true;
 }
 //扩展浏览器上传文件
 //3.0++版本
 public void openFileChooser(ValueCallback&lt;Uri&gt; uploadMsg, String acceptType) {
    mUploadMessage = uploadMsg;
    Intent i = new Intent(Intent.ACTION_GET_CONTENT);
    i.addCategory(Intent.CATEGORY_OPENABLE);
    i.setType("*/*");
    activity.startActivityForResult(Intent.createChooser(i, "File Chooser"), FILECHOOSER_RESULTCODE);
 }
 //3.0--版本
 public void openFileChooser(ValueCallback&lt;Uri&gt; uploadMsg) {
    mUploadMessage = uploadMsg;
    Intent i = new Intent(Intent.ACTION_GET_CONTENT);
    i.addCategory(Intent.CATEGORY_OPENABLE);
    i.setType("*/*");
    activity.startActivityForResult(Intent.createChooser(i, "file Browser"),FILECHOOSER_RESULTCODE);
   }
 }

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

public class MyWb extends Activity {
 /** Called when the activity is first created. */
 WebView web;
 ProgressBar progressBar;
 private ValueCallback mUploadMessage;
 private final static int FILECHOOSER_RESULTCODE=1;
 
 @Override
 protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
  if(requestCode==FILECHOOSER_RESULTCODE) {
    if (null == mUploadMessage) return;
    Uri result = intent == null || resultCode != RESULT_OK ? null : intent.getData();
    mUploadMessage.onReceiveValue(result);
    mUploadMessage = null;
  }
 }
 
@Override
public void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.main);

 web = (WebView) findViewById(R.id.webview01);
 progressBar = (ProgressBar) findViewById(R.id.progressBar1);
 
 web = new WebView(this);
 web.getSettings().setJavaScriptEnabled(true);
 web.loadUrl("http://www.script-tutorials.com/demos/199/index.html");
 web.setWebViewClient(new myWebClient());
 web.setWebChromeClient(new WebChromeClient() {
    //The undocumented magic method override
    //Eclipse will swear at you if you try to put @Override here
    // For Android 3.0+
    public void openFileChooser(ValueCallback uploadMsg) {
      mUploadMessage = uploadMsg;
      Intent i = new Intent(Intent.ACTION_GET_CONTENT);
      i.addCategory(Intent.CATEGORY_OPENABLE);
      i.setType("image/*");
      MyWb.this.startActivityForResult(Intent.createChooser(i,"File Chooser"), FILECHOOSER_RESULTCODE);
 }

 // For Android 3.0+
 public void openFileChooser( ValueCallback uploadMsg, String acceptType ) {
    mUploadMessage = uploadMsg;
    Intent i = new Intent(Intent.ACTION_GET_CONTENT);
    i.addCategory(Intent.CATEGORY_OPENABLE);
    i.setType("*/*");
    MyWb.this.startActivityForResult(Intent.createChooser(i, "File Browser"), FILECHOOSER_RESULTCODE);
 }

 //For Android 4.1
 public void openFileChooser(ValueCallback uploadMsg, String acceptType, String capture){
    mUploadMessage = uploadMsg;
    Intent i = new Intent(Intent.ACTION_GET_CONTENT);
    i.addCategory(Intent.CATEGORY_OPENABLE);
    i.setType("image/*");
    MyWb.this.startActivityForResult( Intent.createChooser( i, "File Chooser" ), MyWb.FILECHOOSER_RESULTCODE );
 }
 });

 setContentView(web);
}

public class myWebClient extends WebViewClient {
 @Override
 public void onPageStarted(WebView view, String url, Bitmap favicon) {
    // TODO Auto-generated method stub
    super.onPageStarted(view, url, favicon);
 }

 @Override
 public boolean shouldOverrideUrlLoading(WebView view, String url) {
    // TODO Auto-generated method stub
    view.loadUrl(url);
    return true;
 }

 @Override
 public void onPageFinished(WebView view, String url) {
    // TODO Auto-generated method stub
   super.onPageFinished(view, url);
   progressBar.setVisibility(View.GONE);
 }
}

//flipscreen not loading again
@Override
public void onConfigurationChanged(Configuration newConfig){
 super.onConfigurationChanged(newConfig);
}

// To handle "Back" key press event for WebView to go back to previous screen.
/*@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
 if ((keyCode == KeyEvent.KEYCODE_BACK) &amp;&amp; web.canGoBack()) {
 web.goBack();
 return true;
 }
 return super.onKeyDown(keyCode, event);
}*/
}

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

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

 

转载自郑州网建-前端开发 http://camnpr.com/
本文链接:http://camnpr.com/archives/1093.html

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。