webview调取相机

  项目中有一个需求:用户购买完商品后评价,可以选择图片。评价的界面是一个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为你要加载的url

WebSettings 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中的接口

@Override
public void openFileChooserCallBack(ValueCallback<Uri> uploadMsg, String acceptType) {
    mUploadMsg = uploadMsg;
    showOptions();
}

@Override
public boolean openFileChooserCallBackAndroid5
        (WebView webView, ValueCallback<Uri[]> filePathCallback, WebChromeClient.FileChooserParams fileChooserParams) {
    mUploadMsgForAndroid5 = filePathCallback;
    showOptions(); 
    return true;
}

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值