场景描述:
在WebView加载的界面,实现及时通讯功能。界面下方,有选择图片按钮,点击之后,进入系统图库,
选择好图片后,webView将此图片发送出去,及时通讯的对方,接受到此图片。
解决方案:(此处,忽略webView的漏洞问题,直接进行常规场景的考虑)
1、注册javascript方法,对点击按钮进行响应;
2、响应后,跳转到系统图库选择界面,进行图片选择;
3、选择完图片后,获取对应bitmap,并对它进行压缩;
4、将压缩的bitmap进行以字节流的形式,读入内存;
5、对bitmap的字节数组进行64位编码;
二、响应后,跳转到系统图库选择界面,进行图片选择:
三、选择完图片后,获取对应bitmap,并对它进行压缩;
四、将压缩的bitmap进行以字节流的形式,读入内存;
五、对bitmap的字节数组进行64位编码;
六、将编码后的字符串生成javascript格式的字符串,让webView进行加载,加载成功即上传图片完成。
在WebView加载的界面,实现及时通讯功能。界面下方,有选择图片按钮,点击之后,进入系统图库,
选择好图片后,webView将此图片发送出去,及时通讯的对方,接受到此图片。
解决方案:(此处,忽略webView的漏洞问题,直接进行常规场景的考虑)
1、注册javascript方法,对点击按钮进行响应;
2、响应后,跳转到系统图库选择界面,进行图片选择;
3、选择完图片后,获取对应bitmap,并对它进行压缩;
4、将压缩的bitmap进行以字节流的形式,读入内存;
5、对bitmap的字节数组进行64位编码;
6、将编码后的字符串生成javascript格式的字符串,让webView进行加载,加载成功即上传图片完成。
一、注册javascript方法,对点击按钮进行响应:
@Javascript
public void chooseImage(String successName) {
pickImage();
}
二、响应后,跳转到系统图库选择界面,进行图片选择:
/**
* 打开图库,调用选择图片
*/
public void pickImage(){
Intent intent = new Intent(Intent.ACTION_PICK);
intent.setType("image/*");
this.startActivityForResult(intent, REQUEST_PHOTO_STORE);
}
三、选择完图片后,获取对应bitmap,并对它进行压缩;
四、将压缩的bitmap进行以字节流的形式,读入内存;
五、对bitmap的字节数组进行64位编码;
六、将编码后的字符串生成javascript格式的字符串,让webView进行加载,加载成功即上传图片完成。
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if(RESULT_OK == resultCode){
if (requestCode == REQUEST_PHOTO_STORE) {
// 从图库回来;
if (null != data && null != data.getData()) {
Uri uri = data.getData();
try {
Bitmap photoBmp = null;
photoBmp = Utils.getBitpMap(this,uri);
//初始化一个流对象
ByteArrayOutputStream bos = new ByteArrayOutputStream();
//把bitmap100%高质量压缩 到 output对象里
photoBmp.compress(Bitmap.CompressFormat.PNG,100,bos);
//转换成功了
byte[] image = bos.toByteArray();
//生成webView加载的js字符串
String jsMethod = javascript.getSuccessMethod(image,"png");
webview.loadUrl(jsMethod);
}catch(Exception e){
e.printStackTrace();
}
}
}
}
}
/**
*根据资源uri获取对应的bitmap,并进行压缩处理
*/
public static Bitmap getBitpMap(Context context, Uri uri) {
ParcelFileDescriptor pfd;
try {
pfd = context.getContentResolver().openFileDescriptor(uri, "r");
} catch (IOException ex) {
return null;
}
java.io.FileDescriptor fd = pfd.getFileDescriptor();
BitmapFactory.Options options = new BitmapFactory.Options();
// 先指定原始大小
options.inSampleSize = 1;
// 只进行大小判断
options.inJustDecodeBounds = true;
// 调用此方法得到options得到图片的大小
BitmapFactory.decodeFileDescriptor(fd, null, options);
// 我们的目标是在800pixel的画面上显示。
// 所以需要调用computeSampleSize得到图片缩放的比例
options.inSampleSize = calculateInSampleSize(options, 480,800);
// OK,我们得到了缩放的比例,现在开始正式读入BitMap数据
options.inJustDecodeBounds = false;
options.inDither = false;
options.inPreferredConfig = Bitmap.Config.ARGB_8888;
// 根据options参数,减少所需要的内存
Bitmap sourceBitmap = BitmapFactory.decodeFileDescriptor(fd, null,
options);
return sourceBitmap;
}
//图片选择成功后调用此方法
public String getSuccessMethod(byte[] content,String suffix){
String resultBase64 = "data:image/" + suffix + ";base64," + Base64.encodeToString(content, Base64.DEFAULT);
String jsMethod = "javascript:" + successName + "('" + resultBase64 + "')";
//生成js调用方法后,使用webview.load(jsMethod);
return jsMethod;
}