产生错误的原因
微信限制了分享图片的大小(32K)
解决办法
/**
* Bitmap转换成byte[]并且进行压缩,压缩到不大于maxkb
*
* @param bitmap
* @param maxKb
* @return
*/
public static byte[] bmpToByteArray(Bitmap bitmap, int maxKb) {
ByteArrayOutputStream output = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.PNG, 100, output);
int options = 100;
while (output.toByteArray().length > maxkb && options != 10) {
output.reset(); //清空output
bitmap.compress(Bitmap.CompressFormat.JPEG, options, output);//这里压缩options%,把压缩后的数据存放到output中
options -= 10;
}
return output.toByteArray();
}
整体代码
/**
* 分享到微信
*/
private void shareToWeChat() {
Disposable disposable = Observable.create(new ObservableOnSubscribe<Bitmap>() {
@Override
public void subscribe(ObservableEmitter<Bitmap> e) throws Exception {
Glide.with(mContext)
.load(mCollageDetailBean.getImg())
.asBitmap()
.centerCrop()
.override(200, 200)
.into(new SimpleTarget<Bitmap>() {
@Override
public void onResourceReady(Bitmap resource, GlideAnimation<? super Bitmap> glideAnimation) {
e.onNext(resource);
}
});
}
}).subscribeOn(io.reactivex.android.schedulers.AndroidSchedulers.mainThread())
.map(new Function<Bitmap, byte[]>() {
@Override
public byte[] apply(Bitmap bitmap) throws Exception {
return bmpToByteArray(bitmap, 32);
}
})
.subscribeOn(io.reactivex.schedulers.Schedulers.io())
.observeOn(io.reactivex.android.schedulers.AndroidSchedulers.mainThread())
.subscribe(new Consumer<byte[]>() {
@Override
public void accept(byte[] bytes) throws Exception {
showLoading();
WXWebpageObject webpageUrl = new WXWebpageObject();
webpageUrl.webpageUrl = "分享的链接";
WXMediaMessage msg = new WXMediaMessage(webpageUrl);
msg.title = "分享的标题";
msg.description = "分享的说明内容";
msg.thumbData = bytes;
SendMessageToWX.Req req = new SendMessageToWX.Req();
req.transaction = "";
req.message = msg;
req.scene = SendMessageToWX.Req.WXSceneSession; // WXSceneSession会话 WXSceneTimeline朋友圈
String weixin_appid = Order365App.getInstance().getWEIXIN_APPID();
IWXAPI api = WXAPIFactory.createWXAPI(mContext, weixin_appid);
boolean b = api.sendReq(req);
if (!b) {
showError("分享失败");
}
}
}, new Consumer<Throwable>() {
@Override
public void accept(Throwable throwable) throws Exception {
showLoading();
showError("分享失败");
}
});
addDisposable(disposable);
}
这里用Glide
去加载生成Bitmap
是为了方便剪裁
网友评论