起因:

要做一个微信图片分享的功能,但是对于大图会如下问题:

当时没有仔细查看错误日志,单纯的以为是图片太大的问题。

分享图片代码:

 public void WXsharePic(String transaction, final boolean isSession, Bitmap bitmap) {
//初始化WXImageObject和WXMediaMessage对象
WXImageObject imageObject = new WXImageObject(bitmap);
WXMediaMessage msg = new WXMediaMessage();
msg.mediaObject = imageObject;
//设置缩略图
Bitmap scaledBitmap = Bitmap.createScaledBitmap(bitmap, 200, 200, true);
bitmap.recycle();
msg.thumbData = getBitmapByte(scaledBitmap);
//构造一个Req
SendMessageToWX.Req req = new SendMessageToWX.Req();
req.transaction = transaction + Long.toString(System.currentTimeMillis());
req.message = msg;
//表示发送给朋友圈 WXSceneTimeline 表示发送给朋友 WXSceneSession
req.scene = isSession ? SendMessageToWX.Req.WXSceneSession : SendMessageToWX.Req.WXSceneTimeline;
//调用api接口发送数据到微信
api.sendReq(req);
}

解决过程:

想法一:

查看微信的文档,发现如下信息:

初步判定是略缩图过大导致的,准备对略缩图进一步压缩。

但是在调试过程中发现略缩图并没有超过32K,于是这种想法不正确。

想法二:

既然不是略缩图过大,那大概率就是原图过大了。然而微信官方文档上也没有说明原图大小限制,所以也不知道是否是这个原因。

于是准备测试一下是否是这个原因,对原图进一步压缩。

 public static byte[] bitmap2Bytes(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();
}

从代码可知,设置了一个最大kb值,并每次循环压缩率递减10%.

然而实际运行中发现无论maxkb设置的多小,还是会出这个问题。

仔细调试发现,原图大小为3M多,即使是最小10%的压缩率也过大了。

于是将压缩率递减改为1%.

将压缩率递减改为1%,并且maxkb设置为500KB时,就没问题了!

但是,有两个很严重的问题:

1.微信的原图最大只能是500KB吗?

2.循环压缩所需时间太久,差不多半分钟才能压缩完毕,效率太低。

想法三:

这个时候,我才开始注意起错误日志来。

错误日志是Binder类出现的,字面意思是数据过大。查看微信的SDK源码可以发现实际上调用微信API,微信会将图片传递给一个新的活动。

而Intent传值有大小限制,最大只能512KB!

现在错误原因知道了,微信分享图片会涉及到启动一个新活动,而新活动涉及到Intent传值,而Intent传值有大小限制,于是就会出问题。

可是如何解决呢?

既然直接传图片的Bitmap太大,那就把图片先保存在本地,然后直接传递图片的地址。

解决过程:

分享图片:

 public void WXsharePic(String transaction, final boolean isSession, Bitmap bitmap, String path) {
//初始化WXImageObject和WXMediaMessage对象
WXImageObject imageObject;
if (!StringUtil.isBlank(path)) {
imageObject = new WXImageObject();
imageObject.setImagePath(path);
} else {
imageObject = new WXImageObject(bitmap);
}
WXMediaMessage msg = new WXMediaMessage();
msg.mediaObject = imageObject;
//设置缩略图
Bitmap scaledBitmap = Bitmap.createScaledBitmap(bitmap, 200, 200, true);
bitmap.recycle();
msg.thumbData = getBitmapByte(scaledBitmap);
//构造一个Req
SendMessageToWX.Req req = new SendMessageToWX.Req();
req.transaction = transaction + Long.toString(System.currentTimeMillis());
req.message = msg;
//表示发送给朋友圈 WXSceneTimeline 表示发送给朋友 WXSceneSession
req.scene = isSession ? SendMessageToWX.Req.WXSceneSession : SendMessageToWX.Req.WXSceneTimeline;
//调用api接口发送数据到微信
api.sendReq(req);
}

调用分享:

 private void shareToMoment() {
final Bitmap sharePicture = getBitmapByView(svShare);
AndPermission.with(this)
.permission(Permission.WRITE_EXTERNAL_STORAGE)
.onGranted(new Action() {
@Override
public void onAction(List<String> permissions) {
String path = saveImageToGallery(sharePicture);
WXsharePic("he" + System.currentTimeMillis(), true, sharePicture, path);
}
})
.onDenied(new Action() {
@Override
public void onAction(@NonNull List<String> permissions) {
Log.e("Activity", "权限申请失败");
}
})
.start();
}

保存图片:

  public String saveImageToGallery(Bitmap bmp) {
// 首先保存图片
String storePath = Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator + "dearxy";
File appDir = new File(storePath);
if (!appDir.exists()) {
appDir.mkdir();
}
String fileName = System.currentTimeMillis() + ".jpg";
File file = new File(appDir, fileName);
try {
FileOutputStream fos = new FileOutputStream(file);
//通过io流的方式来压缩保存图片
bmp.compress(Bitmap.CompressFormat.JPEG, 60, fos);
fos.flush();
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
return storePath + "/" + fileName;
}

反思:

  1. 遇到问题直接查看错误日志,找到问题的根源,不能想当然;
  2. 对于安卓基础的了解有待加强;
  3. 总算明白了为什么QQ分享需要请求存储权限;
  4. BAT现在是大家,对于他们的API需要熟悉了解。

大家如果有什么疑问或者建议可以通过评论或者邮件的方式联系我,欢迎大家的评论~

微信分享大图遇到的问题(Android)的更多相关文章

  1. Android微信分享功能实例+demo

    Android微信分享功能实例 1 微信开放平台注册 2 获得appId,添加到程序中,并运行程序 3 使用应用签名apk生成签名,添加到微信开放平台应用签名,完成注册 4 测试分享功能. 有问题请留 ...

  2. android微信分享不出去?四步搞定!

    现在做的项目中集成了友盟分享,产品要求集成微信.朋友圈.QQ.QQ空间.短信这几个分享平台.按照友盟的文档集成一切都很顺利,集成成功以后测试QQ.QQ空间.短信都没有问题,唯独微信和朋友圈一直分享不出 ...

  3. Android微信分享图片大于32k进行压缩

    微信分享视频的时候,需要传一个图片数组,大小不能大于32k. 解决方案:使用Bitmap自带的compress方法解决了这个问题. 源码如下: <span style="font-si ...

  4. android微信分享要注意的地方

    最近在做android端分享的功能,在微信开放平台查看了下官网上的开发文档,一步一步的按文档上的步骤来: 1.申请你的AppID 2.下载开发工具包 3.搭建开发环境,引入libammsdk.jar文 ...

  5. React Native微信分享 朋友圈分享 Android/iOS 通用

    超详细React Native实现微信好友/朋友圈分享功能-Android/iOS双平台通用   2016/06/16 |  React Native技术文章 |  Sky丶清|  暂无评论 |  1 ...

  6. Android 微信分享图文资料

    上个项目做Android的微信分享,需要分享的内容有图片有文字,看了微信分享的SDK,貌似没有这个API,在网上搜了好久,总算找到解决方法了,直接上代码: public void sendReq(Co ...

  7. Android应用加入微信分享

    一.申请你的AppID http://open.weixin.qq.com/ 友情提示:推荐使用eclipse打包软件最后一步的MD5值去申请AppID 二.官网下载libammsdk.jar包 ht ...

  8. [转] Android:微信授权登录与微信分享全解析

    https://wohugb.gitbooks.io/wechat/content/qrconnent/refresh_token.html http://blog.csdn.net/xiong_it ...

  9. React Native之微信分享(iOS Android)

    React Native之微信分享(iOS Android) 在使用React Native开发项目的时候,基本都会使用到微信好友或者微信朋友圈分享功能吧,那么今天我就带大家实现以下RN微信好友以及朋 ...

随机推荐

  1. 数据结构与算法(九):AVL树详细讲解

    数据结构与算法(一):基础简介 数据结构与算法(二):基于数组的实现ArrayList源码彻底分析 数据结构与算法(三):基于链表的实现LinkedList源码彻底分析 数据结构与算法(四):基于哈希 ...

  2. CODING 研发管理系统上线全球加速,助力企业跨区域协作

    CODING 研发管理系统现已全面支持全类型代码仓库的 全球加速访问. 随着国内互联网红利的日趋枯竭与全球互联网的加速普及.越来越多的企业开始走出国门,将目光投向全世界,搭建跨国体系.跨出国门的中国企 ...

  3. openlayers4 入门开发系列之小区信号扇形图篇

    前言 openlayers4 官网的 api 文档介绍地址 openlayers4 api,里面详细的介绍 openlayers4 各个类的介绍,还有就是在线例子:openlayers4 官网在线例子 ...

  4. MsSql去掉重复记录

    假如有这样一张表news:字段:id,title,time,image,author,现在表中有1万多条记录,其中title重复的有上千条.如何才能一次性将title重复记录删除呢? ID Title ...

  5. SQLServer之分离数据库

    分离数据库注意事项 要求具有 db_owner 固定数据库角色中的成员资格. 可以分离数据库的数据和事务日志文件,然后将它们重新附加到同一或其他 SQL Server实例. 如果要将数据库更改到同一计 ...

  6. July 10th, 2018. Tuesday, Week 28th

    Winning isn't everything, but wanting it is. 胜利并不能代表一切,但求胜心可以. From Arnold Palmer. Compared to this ...

  7. 秋季学期学习总结&&以及下学期的期待

    秋季总结 第一学期已经结束了,下面来分点归纳下知识点: ·基础编程:利用c语言来进行编程 ·分支结构:利用if-else语句和switch语句编程,以及字符型数据的利用 ·循环结构:利用while.d ...

  8. CTF比赛 十一月场 Look 复现

    拿到题吧,一般的我的操作就是,先看看审核元素有有没有什么东西,然后去御剑扫描,git泄露,备份文件泄露,不行就再去burp抓包看看头部,换方法(post换成get) 发现不明的头部,这种头部的话可能是 ...

  9. eShopOnContainers 知多少[3]:Identity microservice

    首先感谢晓晨Master和EdisonChou的审稿!也感谢正在阅读的您! 引言 通常,服务所公开的资源和 API 必须仅限受信任的特定用户和客户端访问.那进行 API 级别信任决策的第一步就是身份认 ...

  10. emscripten、 WebAssembly,传递字符串给c函数

    下面看具体的实例. 下面的代码是一个C函数,实现简单的字符串拼接,然后返回拼接的字符串. #include <stdio.h> #include <string>  char* ...