webview调取相机

来源:互联网 发布:2017年旅游大数据分析 编辑:程序博客网 时间:2024/06/06 00:44
  项目中有一个需求:用户购买完商品后评价,可以选择图片。评价的界面是一个web页面。刚开始跟着网上的代码弄完后,在测试机上运行正常,可是他们说自己的手机不行,就去百度了一下,奶奶个球,才发现安卓webview打开本地文件在3x、4x、5x上都不一样。甚至有些说因为安全原因,安卓4.4不支持webview打开本地文件(未验证)。我也是醉了,爱不一样就不一样吧,谁叫俺还要完成任务呢。下面就说说填坑的过程。 首先为了在多个Activity不用写重复的代码,新建一个 MyWebChomeClient 继承自 WebChomeClient
public class MyWebChomeClient extends WebChromeClient {    public MyWebChomeClient(OpenFileChooserCallBack  openFileChooserCallBack) {    }}

其次,写一个接口提供给Activity,让他来处理照片选择的逻辑

public interface OpenFileChooserCallBack {    // api低于 5.0 的回调    void openFileChooserCallBack(ValueCallback<Uri> uploadMsg, String acceptType);    // api高于 5.0 的回调    boolean openFileChooserCallBackAndroid5(WebView webView, ValueCallback<Uri[]> filePathCallback,                                            FileChooserParams fileChooserParams);}

接下来为了适配不同版本的安卓,我们在这里添加不同版本webview掉用本地文件系统的方法

//3.0--版本public void openFileChooser(ValueCallback<Uri> uploadMsg){    openFileChooser(uploadMsg, "");}//3.0++版本public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType) {    mOpenFileChooserCallBack.openFileChooserCallBack(uploadMsg, acceptType);}//4.1.1++版本public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType, String capture){    openFileChooser(uploadMsg, acceptType);}//5.0++版本public boolean onShowFileChooser(WebView webView, ValueCallback<Uri[]> filePathCallback,                                FileChooserParams fileChooserParams) {    Log.e("fileChooserParams","fileChooserParams");    mOpenFileChooserCallBack.openFileChooserCallBackAndroid5(webView, filePathCallback, fileChooserParams);    return true;}

再来说说Activity:
首先设置webview

mWebView .loadUrl(url);//url为你要加载的urlWebSettings webSettings = mWebView.getSettings();webSettings.setJavaScriptEnabled(true);webSettings.setAllowFileAccess(true);webSettings.setAllowContentAccess(true);webSettings.setBuiltInZoomControls(false);

其次在设置 webview 的 WebChromeClient 为我们新建的 MyWebChomeClient

mWebView.setWebChromeClient(new MyWebChomeClient(this));

在activity中实现MyWebChomeClient中的接口

@Overridepublic void openFileChooserCallBack(ValueCallback<Uri> uploadMsg, String acceptType) {    mUploadMsg = uploadMsg;    showOptions();}@Overridepublic boolean openFileChooserCallBackAndroid5        (WebView webView, ValueCallback<Uri[]> filePathCallback, WebChromeClient.FileChooserParams fileChooserParams) {    mUploadMsgForAndroid5 = filePathCallback;    showOptions();     return true;}

注:showOptions()方法为你想要的操作
还有就是注意当权限不足,或者其他原因导致返回为空时要设置相应的参数为空,否则将导致webview的等待,其他控件不能点击。
还有很多权限问题的操作本文并未涉,如果有需要可以去下载 demo 查看

这就是webview调用本地相机,相册的方法,当然,调用本地文件也一样。

0 0