做android聊天时,遇到过一个问题,h5的页面发送的图片在android端不能响应,ios那边一路畅通。也是相当无奈,目前发现了好多android端与ios端webView的异同。
android端与ios确的不同大致包括:
1:android不能直接打开html的下载文件,需要先下载保存本地在打开本地文件
2:android不能直接打开pdf文件,同样要下载再打开
3:如题,h5页面的发送图片按钮点击没反应,ios却可以
4:android可以postUrl,ios不行,需要js混合开发

下面简单说下第三点。
1:出现的原因:
H5 访问本地文件的时候,使用的 ,WebView 出于安全性的考虑,限制了以上操作

2:解决方法
重写 WebviewChromeClient 中的 openFileChooser() 和 onShowFileChooser()方法响应,然后使用原生代码来实现调用本地相册和拍照的功能,最后在 onActiivtyResult 把选择的图片 URI 回传给 WebviewChromeClient。

3:大致步骤
1.弹出对话框选择相机或相册
2.调用系统相册的实现代码
3.调用系统相机拍照的实现代码
4.需要兼容 6.0 的动态权限问题和 7.0 的文件管理问题。
5.相机拍照后的图片上传后要进行删除,以免占用手机存储空间

chatWebView.setWebChromeClient(new WebChromeClient() {                                           @Override                                           public boolean onShowFileChooser(WebView webView, ValueCallback<Uri[]> filePathCallback, FileChooserParams fileChooserParams) {                                               Log.d("ChatFragment", "filePathCallback>>>>>" + filePathCallback);                                               mUploadCallbackAboveL = filePathCallback;                                               uploadPicture();                                               return true;                                           }                                           //For Android  >= 4.1                                           public void openFileChooser(ValueCallback<Uri> valueCallback, String acceptType, String capture) {                                               mUploadMessage = valueCallback;                                               //调用系统相机或者相册                                               uploadPicture();                                           }                                       }        );

upload()方法是打开打开相册等系列操作,常规操作就省略了,其中两个参数mUploadMessage和mUploadCallbackAboveL是用来处理获取图片等文件的Uri之后传递给Js操作的。之后再onActivityResult()方法里处理结果

  @Override    public void onActivityResult(int requestCode, int resultCode, Intent data) {        super.onActivityResult(requestCode, resultCode, data);        switch (requestCode) {            case CHOOSE_PHOTO:                if (resultCode == RESULT_OK) {                    Uri uri = data.getData();                    if (uri != null) {                        uploadImage(uri);                    }                } else{                    uploadImage(null);                }                break;            case TAKE_PHOTO:                if (resultCode == RESULT_OK) {                    Uri uri = Uri.fromFile(mTmpFile);                    if (uri != null) {                        uploadImage(uri);                    }                }else{                    uploadImage(null);                }                break;            default:                break;        }    }    private void uploadImage(Uri uri) {        if (mUploadMessage != null) {            mUploadMessage.onReceiveValue(uri);            mUploadMessage = null;        }        if (mUploadCallbackAboveL != null) {            if(uri!=null){                mUploadCallbackAboveL.onReceiveValue(new Uri[]{uri});            }else{                mUploadCallbackAboveL.onReceiveValue(null);            }            mUploadCallbackAboveL = null;        }    }

upLoadImage(Uri uri)方法是将图片传递给JS,之后的逻辑交给Js处理。注意取消选择文件操作的时候同样要调该方法,但是参数传null.

更多相关文章

  1. Android的配置文件操作的完美封装(使用注解 反射让配置文件操作如
  2. Android 你不知道的调试技巧(Debug操作汇总)
  3. Android高手进阶教程(二十)---Android中的日历读写操作!!!
  4. Android、iPhone和Java三个平台一致的加密方法
  5. Android 操作串口 (android serial port api)

随机推荐

  1. Android数据的四种存储方式SharedPrefere
  2. Android中EditText中文英文长度控制
  3. 安卓图表引擎AChartEngine(一) - 简介
  4. 如何解决ADT17下Android第三方jar包NoCla
  5. android jni 实现
  6. 分享一个 Android(安卓)全局获取 Context
  7. android 6.0 权限崩溃分析:android.system
  8. Android(安卓)知识体系学习目录
  9. Android(安卓)SDK离线安装方法详解(加速
  10. Android(安卓)Handler.removeMessage移除