Android:让WebView支持<input type=”file”…>元素

在Android中,当我们通过WebView打开一个页面时,如果里面有元素是<input type=”file”…>类型的,WebView只能正常的显示样式,但是是无法点击的。要解决这个问题,我们需要重写WebChromeClient。

下面直接给出Demo代码:

Activity文件:

public class MainActivity extends Activity {

    private final String host = "demo.com";
    private final String urlAddress = "http://" + host;

    private WebView web;
    private 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;
        }
    }

    /**
     * Called when the activity is first created.
     */
    @SuppressLint("SetJavaScriptEnabled")
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

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

        WebSettings settings = web.getSettings();
        settings.setJavaScriptEnabled(true);
        web.loadUrl(urlAddress);
        web.setWebViewClient(new MyWebViewClient());

        web.setWebChromeClient(new WebChromeClient() {
            //关键代码,以下函数是没有API文档的,所以在Eclipse中会报错,如果添加了@Override关键字在这里的话。

            // 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/*");
                MainActivity.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("*/*");
                MainActivity.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/*");
                MainActivity.this.startActivityForResult(Intent.createChooser(i, "File Chooser"), MainActivity.FILECHOOSER_RESULTCODE);

            }
        });

//        setContentView(web);
    }

    private class MyWebViewClient extends WebViewClient {
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            if (Uri.parse(url).getHost().equals(host)) {
                // This is my web site, so do not override; let my WebView load the page
                return false;
            }
            // Otherwise, the link is not for a page on my site, so launch another Activity that handles URLs
            Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
            startActivity(intent);
            return true;
        }

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

        @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);
    }

    // 捕捉“回退”按键,让WebView能回退到上一页,而不是直接关闭Activity。
    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if ((keyCode == KeyEvent.KEYCODE_BACK) && web.canGoBack()) {
            web.goBack();
            return true;
        }
        return super.onKeyDown(keyCode, event);
    }
}

Layout代码就不贴出来了,就是很简单的一个WebView和一个Progress。通过以上代码,我们就能够在WebView中上传文件了。

PS: 和iOS比起来,这不是一个完美的解决方案,因为它不支持直接拍照上传文件,如果需要这个功能的话,那么还需要做进一步的开发才行。

Android:让WebView支持<input type=”file”…>元素,布布扣,bubuko.com

时间: 2024-10-07 07:04:39

Android:让WebView支持<input type=”file”…>元素的相关文章

手机QQ浏览器和微信内置webview对input type="file" 的change事件不灵

做一个H5页面,选中图片后上传,遇到手机QQ浏览器时   不能及时识别change事件,真是日了狗了,下面是针对这一现象的解决办法,不用change事件: <!DOCTYPE> <html>     <head>         <title></title>         <meta charset="utf-8"/>         <meta Content-Type="applicatio

让Android的WebView支持html里面的文件上传

默认情况下,Android的webview是不支持<input type=file>的,点击没有任何反应,如果希望点击上传,弹出选择文件.图片的窗口,那就需要自定义一个WebChromeClient public class MyChromeClient extends WebChromeClient { public ValueCallback<Uri> UploadMsg; public ValueCallback<Uri[]> UploadMsg2; privat

html中,文件上传时使用的&lt;input type=&quot;file&quot;&gt;的样式自定义

Web页面中,在需要上传文件时基本都会用到<input type="file">元素,它的默认样式: chrome下: IE下: 不管是上面哪种,样式都比较简单,和很多网页的风格都不太协调. 根据用户的需求,设计风格,改变其显示样式的场合就比较多了. 如果,要像下面一样做一个bootstrap风格的上传按钮该如何实现. 搭建上传按钮所需的基本元素 <span class=""> <span>上传</span> <

webview 不支持文件上传 &lt;input type=&quot;file&quot; /&gt;

项目中遇到文件上传的需求,IOS直接是支持的,安卓端却没反应,有些机型甚至闪退. 找了很多原因,在网上找的办法,实测可行,做个记录,知识分享. Html文件上传 <input type="file" class="uploadBtn" multiple="multiple" accept="image/jpeg"> 手机端WebView重写方法 // 1.设置WebChromeClient,重写文件上传回调 mWe

将html中的&lt;input type=&quot;file&quot; /&gt;(选择文件) 元素隐藏,并通过其它方式触发点击。

file input的默认外观实在不好看,所以我们要搞定它.. 1. 首先,我们把file input放入一个label,并且将这个label显示为一定的宽高,比如显示为(bootstrap)btn的样式; 2. 为此input增加样式,内联或css文件内写都可以:style="left:-9999px;position:absolute;" 3. 在label内增加文本(作为label btn的显示文本),比如下方示例中的span; <label id="realBt

HTML5学习笔记(2):input type file的特性

一. input type=file与文件上传 本文所说的input type=file指的是type类型是file的input元素,最简HTML代码如下: <input type=file> 但是,为了习惯,我们多写成: <input type="file"> 在HTML5出现之前(XHTML),我们的闭合规则则有些出入: <input type="file" /> 顾名思义,选择文件,并上传文件. 在HTML5还没有出现之前,

有关图片上传的相关知识input type=file,HTML5的 input:file上传类型控制

遇到项目,要求做一个影像系统,对于前端开发需要了解file的相关属性,以及如何开发.工欲善其事,必先利器嘛.度娘一阵子搜索,找资料.这年头,需要的是你解决问题的能力啊! 参考应用:https://www.cnblogs.com/sunliyuan/p/5737928.html http://blog.okbase.net/jquery2000/archive/1296.html(解释的也很清楚) http://blog.csdn.net/qingyjl/article/details/52003

css input[type=file] 样式美化,input上传按钮美化

我们在做input文本上传的时候,html自带的上传按钮比较丑,如何对其进行美化呢?同理:input checkbox美化,input radio美化是一个道理的,后面文章会总结. 思路: input file上传按钮的美化思路是,先把之前的按钮透明度opacity设置为0,然后,外层用div包裹,就实现了美化功能. 代码如下: DOM结构: <a href="javascript:;" class="a-upload"> <input type=

自定义input[type=&quot;file&quot;]的样式

input[type="file"]的样式在各个浏览器中的表现不尽相同: 1. chrome: 2. firefox: 3. opera: 4. ie: 5. edge: 另外,当我们规定 input[type="file"] 的高度,并把它的行高设置成与其高度相等后,chrome中难看的样式出现了: “未选择任何文件”这一行并没有竖直居中. 似乎在 firefox 中好看一些,嗯,我比较喜欢用 firefox.但是这些浏览器中的表现不一致,我们必须做兼容处理. 思