最近在集成live800客服系统遇到了这样的问题:在h5页面点击“传送文件”按钮,没有任何反应。经过大量的资料查询,并与live800售后妹子沟通后,发现是Android原生webview控件的缺陷导致的。在Android中,当我们通过WebView打开一个页面时,如果里面有元素是类型的,WebView只能正常的显示样式,但是是无法点击的。要解决这个问题,我们需要重写WebChromeClient。 

下面直接给出Demo代码:

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 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 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 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中上传文件了。

原文地址:http://www.szlive800.com/faq/20150323-allen/

更多相关文章

  1. 安全新手入坑——HTML标签
  2. 没有一行代码,「2020 新冠肺炎记忆」这个项目却登上了 GitHub 中
  3. Nginx系列教程(四)| 一文带你读懂Nginx的动静分离
  4. android EventBus学习记录
  5. Android移动安全(一)Android混淆机制
  6. Android(安卓)Launcher研究(一)-----------图文详解手把手教你在
  7. Android(安卓)源码下载编译
  8. Android中Context的详细使用
  9. android 手把手教你打造万能的ListView GridView的适配器

随机推荐

  1. Android之模拟网易新闻客户端
  2. android音乐播放器开发 SweetMusicPlayer
  3. Android关于BuildToolVersion与ComplieSd
  4. react-native打包android
  5. Android中AsyncTask线程的使用
  6. 如何通过简历和面试找到好工作?
  7. Android刮奖控件,需要的直接拿去用
  8. Android通知栏颜色改变方法
  9. Android笔记1——开发前奏1开发环境搭建
  10. Android(安卓)创世纪 第二天