起因:

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

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

分享图片代码:

 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. Hive使用必知必会系列

    一.Hive的几种数据模型 内部表 (Table 将数据保存到Hive 自己的数据仓库目录中:/usr/hive/warehouse) 外部表 (External Table 相对于内部表,数据不在自 ...

  2. C# -Asp.Net.SignalR.Core之Hub

    前言 程序员的进步是需要环境的,良好的团队环境,良好的开发环境,会让人进步的更加快速. 所以,我认为,如果一个程序员,在2019年还在用Visual Studio 2005开发,那么,他,大概率,不会 ...

  3. OAuth2.0记录

    阮一峰老师讲解OAuth2.0 http://www.ruanyifeng.com/blog/2014/05/oauth_2_0.html 举例详解: https://www.cnblogs.com/ ...

  4. Java_基础篇(数组的反转)

    数组反转也是Java的基础. 数组反转要求掌握的是: 1).创建一个数组,在内存中申请一块空间. 2).实例化数组. 3).对数组的了解.如:数组的长度,数组的下标,数组的表示方法. 4).数组的交换 ...

  5. 【MQ】消息队列及常见MQ比较

    一.什么是消息队列 我们可以把消息队列比作是一个存放消息的容器,当我们需要使用消息的时候可以取出消息供自己使用.消息队列是分布式系统中重要的组件,使用消息队列主要是为了通过异步处理提高系统性能和削峰. ...

  6. 写个重新加载 ocelot 配置的接口

    写个重新加载 ocelot 配置的接口 Intro 我们想把 ocelot 的配置放在自己的存储中,放在 Redis 或者数据库中,当修改了 Ocelot 的配置之后希望即时生效,又不想在网关这边定时 ...

  7. 2018-09-13 代码翻译尝试-使用Roaster解析和生成Java源码

    此文是前文使用现有在线翻译服务进行代码翻译的体验的编程语言方面第二点的一个尝试. 参考Which framework to generate source code ? - Cleancode and ...

  8. 我的Windows日常——鼠标无法进行拖拽的解决方法

    方法1: 鼠标右键单击任务栏 选择属性,进入任务栏和开始菜单属性 点击「开始」菜单  进入分页,单击自定义 找到并勾选启用上下文菜单和拖放 一路确定.... --------------------- ...

  9. #001 Python 00号作业:关于课程

    请大家继续思考,你希望我们的课程主要涉略哪些方面?你希望我们的课程能够带给你哪些基本的技能?你希望理论课应该怎么上,实验课应该怎么上?对于我们的课程有什么建议或意见 作为一名计算机专业的学生,对于py ...

  10. 入门PHP你需要了解些什么?

    1.[PHP]PHP(外文名:PHP: Hypertext Preprocessor,中文名:“超文本预处理器”)是一种通用开源脚本语言.语法吸收了C语言.Java和Perl的特点,利于学习,使用广泛 ...