700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > android微信照片未发送成功 解决Android整合微信分享无法发送图片问题

android微信照片未发送成功 解决Android整合微信分享无法发送图片问题

时间:2022-06-15 09:39:06

相关推荐

android微信照片未发送成功 解决Android整合微信分享无法发送图片问题

正在做的android app有微信分享功能,下载了官方的SDK后按照里面的代码做了,我主要用的是分享网页url,发现文字和网页URL都可以发送,唯独带图片的消息有时成功有时失败,于是对比了成功和失败的图片,发现成功的图片尺寸都比较小,再看官方DEMO的实例代码:

WXWebpageObject webpage = new WXWebpageObject();

webpage.webpageUrl = "";

WXMediaMessage msg = new WXMediaMessage(webpage);

msg.title = "WebPage Title WebPage Title WebPage Title WebPage Title WebPage Title WebPage Title WebPage Title WebPage Title WebPage Title Very Long Very Long Very Long Very Long Very Long Very Long Very Long Very Long Very Long Very Long";

msg.description = "WebPage Description WebPage Description WebPage Description WebPage Description WebPage Description WebPage Description WebPage Description WebPage Description WebPage Description Very Long Very Long Very Long Very Long Very Long Very Long Very Long";

Bitmap thumb = BitmapFactory.decodeResource(getResources(), R.drawable.send_music_thumb);

msg.thumbData = Util.bmpToByteArray(thumb, true);

SendMessageToWX.Req req = new SendMessageToWX.Req();

req.transaction = buildTransaction("webpage");

req.message = msg;

req.scene = isTimelineCb.isChecked() ? SendMessageToWX.Req.WXSceneTimeline : SendMessageToWX.Req.WXSceneSession;

api.sendReq(req);其中msg.thumbData赋值为要发送的图片,其用到的bmpToByteArray方法官方版如下:

public static byte[] bmpToByteArray(final Bitmap bmp, final boolean needRecycle) {

ByteArrayOutputStream output = new ByteArrayOutputStream();

press(CompressFormat.PNG, 100, output);

if (needRecycle) {

bmp.recycle();

}

byte[] result = output.toByteArray();

try {

output.close();

} catch (Exception e) {

e.printStackTrace();

}

return result;

}其中

press(CompressFormat.PNG, 100, output);为压缩图片格式,100为按原尺寸的100%压缩,也就是不压缩,若数值为90,则压缩后尺寸为原来的90%.

但是用这个方法执行虽然没报错,但是总是点击后没反应,在网上搜索了很久,最后在这位博主的文章中找到答案,不过这位博主是转发,但是没有注明源地址,所以只能贴出这位博主的地址:解决微信开放平台分享图片失败问题,原因是微信规定分享尺图片尺寸不能大于32kb,但是DEMO中又没有注释.读了博主文章后受到启发,将博主所用方法中100改为32后,方法如下:

private Bitmap compressImage(Bitmap image) {

ByteArrayOutputStream baos = new ByteArrayOutputStream();

press(pressFormat.JPEG, 100, baos);//质量压缩方法,这里100表示不压缩,把压缩后的数据存放到baos中

int options = 100;

while ( baos.toByteArray().length / 1024>32) { //循环判断如果压缩后图片是否大于32kb,大于继续压缩

baos.reset();//重置baos即清空baos

press(pressFormat.JPEG, options, baos);//这里压缩options%,把压缩后的数据存放到baos中

options -= 1;//每次都减少1

}

ByteArrayInputStream isBm = new ByteArrayInputStream(baos.toByteArray());//把压缩后的数据baos存放到ByteArrayInputStream中

Bitmap bitmap = BitmapFactory.decodeStream(isBm, null, null);//把ByteArrayInputStream数据生成图片

return bitmap;

}将原方法中100调整为32,这样等文件尺寸小于等于32时结束循环.之所以将10改为1,是因为如果当options为10时size仍然大于32,那么下次options值为0

调用这个方法后图片终于可以成功分享到朋友圈了,但是又出现了一个新问题,当图片尺寸比较大的时候,while的处理时间会比小图片长,会有0.5s左右的延迟,于是对方法做了一下优化,将循环去掉,改为比例模式,将32*1024的固定值算出来,然后除以boas.toByteArray().lenth,得出32kb为当前文件大小的百分比,再乘以100,得出option的整数值,这样只要做一次除法就可以得到option,无论多大的图片都不用循环了,直接提高了运算速度,最后将我调整后运行成功的代码贴出:

public static byte[] bmpToByteArray(final Bitmap bmp,

final boolean needRecycle) {

ByteArrayOutputStream output = new ByteArrayOutputStream();

press(CompressFormat.JPEG, 100, output);

int i = 3276800 / output.toByteArray().length;

if (i < 100) {

output.reset();// 重置baos即清空baos

press(pressFormat.JPEG, i, output);// 这里压缩options%,把压缩后的数据存放到baos中

}

if (needRecycle) {

bmp.recycle();

}

byte[] result = output.toByteArray();

try {

output.close();

} catch (Exception e) {

e.printStackTrace();

}

return result;

}在activity中将图片复制给msg为

Bitmap bmp = null;

if (uri != null) {

bmp = BitmapFactory.decodeFile(uri);//我这里是读取的本地缓存图片,uri为本地路径

}

if (bmp != null) {

msg.thumbData = Util.bmpToByteArray(bmp, true);

}至此终于得出一个解决图片发送无响应的比较优质的解决方案,忙了大半天只是因为微信在demo中没有提示开发者关于图片的限制,略坑

小弟第一次发文,如有代码引用了原创没有注明请见谅,如有错误请大神指出

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。