首页 > 代码库 > WebView中input file的解决方法

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=http://www.mamicode.com/"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;  } } @Overridepublic 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@Overridepublic void onConfigurationChanged(Configuration newConfig){ super.onConfigurationChanged(newConfig);}// To handle "Back" key press event for WebView to go back to previous screen./*@Overridepublic 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

 

WebView中input file的解决方法