问题
我的app在集成企业微信分享,在提供图片类型分享时,使用发现有一个fileData的参数,当我使用这个参数后,发现点击发送之后,图片根本就没有发送出去。(注:ios和android都有此问题)
最后没办法,只能按照官网的示例代码,使用filePath参数,才正常使用图片分享。
为什么想使用fileData
说说我为什么一开始想用fileData参数吧,应为js层传递的图片数据分为两种:1.url链接;2.base64。在第二种情况下,通常是转成 byte[] 的,然后传给data参数的(参考微信的图片分享)
解决方案
使用filePath参数
具体实现
将js层传过来的图片参数,通过相关方法,保存图片到本地,然后获取路径,传递给filePath参数
相关方法
一些 xxxUtils 的对象是安卓通用工具库中的对象,比如LogUtils
BitmapUtils.java
/**
* 根据图片的网络地址获得Bitmap对象
* <br> 注:请在子线程使用本方法
*
* @param url
* @return 可能返回null
*/
public static Bitmap getBitmapByUrl(String url) {
URL fileUrl = null;
Bitmap bitmap = null;
try {
fileUrl = new URL(url);
} catch (MalformedURLException e) {
e.printStackTrace();
}
try {
HttpURLConnection conn = (HttpURLConnection) fileUrl.openConnection();
conn.setDoInput(true);
conn.connect();
InputStream is = conn.getInputStream();
bitmap = BitmapFactory.decodeStream(is);
is.close();
} catch (IOException e) {
e.printStackTrace();
}
return bitmap;
}
/**
* base64字符串转bitmap
* <br> 注:请在子线程使用本方法
*
* @param base64String
* @return
*/
public static Bitmap base64StringToBitmap(String base64String) {
byte[] data = Base64.decode(base64String, Base64.DEFAULT);
return BitmapFactory.decodeByteArray(data, 0, data.length);
}
getImageFile方法
/**
* 将图片保存到本地相册的缓存目录
*
* @param type
* @param image
* @return
*/
private static File getImageFile(String type, final String image) {
Bitmap bitmap = null;
if ("image".equals(type)) {
bitmap = BitmapUtils.getBitmapByUrl(image);
} else {
bitmap = BitmapUtils.base64StringToBitmap(image);
}
String imageCacheFileName = "myApp";
// 清除之前缓存的图片
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) {
File picDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM);
File destFile = new File(picDir, imageCacheFileName);
FileUtils.deleteAllInDir(destFile);
} else {
// 从媒体库中移除之前缓存的图片
int numImagesRemoved = reactContext.getContentResolver()
.delete(MediaStore.Images.Media.EXTERNAL_CONTENT_URI
, MediaStore.Images.Media.RELATIVE_PATH + "=\""
+ Environment.DIRECTORY_DCIM + "/"
+ imageCacheFileName + "/" + "\""
, null);
LogUtils.d("删除图片的数量:" + numImagesRemoved);
}
// 保存图片的相册缓存
File file = ImageUtils.save2Album(bitmap, imageCacheFileName
, Bitmap.CompressFormat.JPEG, true);
if (file == null) {
// todo:此处直接返回错误代码和信息给js层
promise.resolve(-100, "缓存图片失败");
return null;
}
return file;
}
补充 网页类型分享
企业微信分享网页类型,中的缩略图(android是thumb,ios是icon),在使用时也会有thumbData参数,同上,不要使用,有问题,使用官网示例的thumbUrl参数