大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。
Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺
做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 filePathCallback, FileChooserParams fileChooserParams) {
Log.d(“ChatFragment”, “filePathCallback>>>>>” + filePathCallback);
mUploadCallbackAboveL = filePathCallback;
uploadPicture();
return true;
}
//For Android >= 4.1
public void openFileChooser(ValueCallback 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.
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/190619.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...