我是在项目中用微信SDK分享带图片的连接,如下:

发现有的连接可以正常分享有的却不行,wechat_api.sendReq(req);返回false

微信官方傻X文档是这样描述的:

然后我就表示很不理解了。

后来在微信SDK网站乱逛的时候发现了这么一条:

Q:为什么使用微信SDK分享信息给微信好友,有的消息发送成功,有的消息发送失败(打不开微信)? (New)

A:这是因为SDK协议中对缩略图的大小作了限制,大小不能超过32K。另外限制的还有title、description等参数的大小。iOS开发者请在微信开放平台网站iOS手册搜索“thumbData”, Android开发者请见微信开放平台网站Android手册的“WXMediaMessage”页面。

。。。靠,你在文档里写一下会死啊!建议每个微信的开发者都看看这个页面:http://open.weixin.qq.com/faq/?lang=zh_CN

好的,原因是我分享的缩略图超过了32k,那就压缩吧。

==============

因为我用的是png的图片,在stackoverflow上发现Bitmap的compress方法不支持PNG,只支持JPG。各种尝试之后放弃了使用Bitmap的compress方法。

最后改用直接压缩分辨率,但是这样不完美的地方在于我把超过32k的图片全部改为99*99的,会丢掉部分细节。不知道有没有人可以提供更完美的方式。

[java]  view plain copy
  1. public Bitmap createBitmapThumbnail(Bitmap bitMap) {
  2. int width = bitMap.getWidth();
  3. int height = bitMap.getHeight();
  4. // 设置想要的大小
  5. int newWidth = 99;
  6. int newHeight = 99;
  7. // 计算缩放比例
  8. float scaleWidth = ((float) newWidth) / width;
  9. float scaleHeight = ((float) newHeight) / height;
  10. // 取得想要缩放的matrix参数
  11. Matrix matrix = new Matrix();
  12. matrix.postScale(scaleWidth, scaleHeight);
  13. // 得到新的图片
  14. Bitmap newBitMap = Bitmap.createBitmap(bitMap, 0, 0, width, height,
  15. matrix, true);
  16. return newBitMap;
  17. }

=======另附上Android上图片压缩方式=======

第一:我们先看下质量压缩方法:

[java]  view plain copy
  1. private Bitmap compressImage(Bitmap image) {
  2. ByteArrayOutputStream baos = new ByteArrayOutputStream();
  3. image.compress(Bitmap.CompressFormat.JPEG, 100, baos);//质量压缩方法,这里100表示不压缩,把压缩后的数据存放到baos中
  4. int options = 100;
  5. while ( baos.toByteArray().length / 1024>100) {  //循环判断如果压缩后图片是否大于100kb,大于继续压缩
  6. baos.reset();//重置baos即清空baos
  7. image.compress(Bitmap.CompressFormat.JPEG, options, baos);//这里压缩options%,把压缩后的数据存放到baos中
  8. options -= 10;//每次都减少10
  9. }
  10. ByteArrayInputStream isBm = new ByteArrayInputStream(baos.toByteArray());//把压缩后的数据baos存放到ByteArrayInputStream中
  11. Bitmap bitmap = BitmapFactory.decodeStream(isBm, null, null);//把ByteArrayInputStream数据生成图片
  12. return bitmap;
  13. }

第二:图片按比例大小压缩方法(根据路径获取图片并压缩):

[java]  view plain copy
  1. private Bitmap getimage(String srcPath) {
  2. BitmapFactory.Options newOpts = new BitmapFactory.Options();
  3. //开始读入图片,此时把options.inJustDecodeBounds 设回true了
  4. newOpts.inJustDecodeBounds = true;
  5. Bitmap bitmap = BitmapFactory.decodeFile(srcPath,newOpts);//此时返回bm为空
  6. newOpts.inJustDecodeBounds = false;
  7. int w = newOpts.outWidth;
  8. int h = newOpts.outHeight;
  9. //现在主流手机比较多是800*480分辨率,所以高和宽我们设置为
  10. float hh = 800f;//这里设置高度为800f
  11. float ww = 480f;//这里设置宽度为480f
  12. //缩放比。由于是固定比例缩放,只用高或者宽其中一个数据进行计算即可
  13. int be = 1;//be=1表示不缩放
  14. if (w > h && w > ww) {//如果宽度大的话根据宽度固定大小缩放
  15. be = (int) (newOpts.outWidth / ww);
  16. } else if (w < h && h > hh) {//如果高度高的话根据宽度固定大小缩放
  17. be = (int) (newOpts.outHeight / hh);
  18. }
  19. if (be <= 0)
  20. be = 1;
  21. newOpts.inSampleSize = be;//设置缩放比例
  22. //重新读入图片,注意此时已经把options.inJustDecodeBounds 设回false了
  23. bitmap = BitmapFactory.decodeFile(srcPath, newOpts);
  24. return compressImage(bitmap);//压缩好比例大小后再进行质量压缩
  25. }

第三:图片按比例大小压缩方法(根据Bitmap图片压缩):

[java]  view plain copy
  1. private Bitmap comp(Bitmap image) {
  2. ByteArrayOutputStream baos = new ByteArrayOutputStream();
  3. image.compress(Bitmap.CompressFormat.JPEG, 100, baos);
  4. if( baos.toByteArray().length / 1024>1024) {//判断如果图片大于1M,进行压缩避免在生成图片(BitmapFactory.decodeStream)时溢出
  5. baos.reset();//重置baos即清空baos
  6. image.compress(Bitmap.CompressFormat.JPEG, 50, baos);//这里压缩50%,把压缩后的数据存放到baos中
  7. }
  8. ByteArrayInputStream isBm = new ByteArrayInputStream(baos.toByteArray());
  9. BitmapFactory.Options newOpts = new BitmapFactory.Options();
  10. //开始读入图片,此时把options.inJustDecodeBounds 设回true了
  11. newOpts.inJustDecodeBounds = true;
  12. Bitmap bitmap = BitmapFactory.decodeStream(isBm, null, newOpts);
  13. newOpts.inJustDecodeBounds = false;
  14. int w = newOpts.outWidth;
  15. int h = newOpts.outHeight;
  16. //现在主流手机比较多是800*480分辨率,所以高和宽我们设置为
  17. float hh = 800f;//这里设置高度为800f
  18. float ww = 480f;//这里设置宽度为480f
  19. //缩放比。由于是固定比例缩放,只用高或者宽其中一个数据进行计算即可
  20. int be = 1;//be=1表示不缩放
  21. if (w > h && w > ww) {//如果宽度大的话根据宽度固定大小缩放
  22. be = (int) (newOpts.outWidth / ww);
  23. } else if (w < h && h > hh) {//如果高度高的话根据宽度固定大小缩放
  24. be = (int) (newOpts.outHeight / hh);
  25. }
  26. if (be <= 0)
  27. be = 1;
  28. newOpts.inSampleSize = be;//设置缩放比例
  29. //重新读入图片,注意此时已经把options.inJustDecodeBounds 设回false了
  30. isBm = new ByteArrayInputStream(baos.toByteArray());
  31. bitmap = BitmapFactory.decodeStream(isBm, null, newOpts);
  32. return compressImage(bitmap);//压缩好比例大小后再进行质量压缩
  33. }

解决微信开放平台分享图片失败问题相关推荐

  1. 微信开放平台分享功能的app签名怎么获取

    微信开放平台需要的签名如果直接使用eclipse打包生成的MD5签名是不行的. 需要把这个eclipse打包生成MD5签名做一些处理: (1)冒号:去掉 (2)大写字母换成小写字母 (做以上处理的时候 ...

  2. android微信解析失败,微信开放平台sdk解析失败

    时间:2017年7月20日 14:00左右,重新编译了一下Android Studio,报出了一个匪夷所思的错误: 早上还好好的,为啥下午就莫名其妙报出这个错误呢.看错误内容,应该是AS找不到指定的依 ...

  3. uniApp APP端 支付/分享 微信开放平台的Android 包名签名的坑

    在开放平台配置好包名和签名后是会"立即生效" 网上看2种解决方法能立即生效 1.微信重新登录 2.卸载微信重新安装 原因:当你在你的APP上使用微信登录/分享/支付等,微信客户端会 ...

  4. Android之微信开放平台实现分享(分享好友和朋友圈)

    开发中分享操作往往经常遇到,而且还是一些比较大型一定的平台,如微信,QQ,微博等.写这篇博客主要是把微信的的分享和相关操作表达一下,分享可以包含:文字,视频,音乐,图片等分享. 分享可以有 分享给好友 ...

  5. (第三方平台)开发相关,解除80端口占用,微信公众号分享jssdk实现,微信开放平台登录接口接入,2022微信分享接入本地调试,微信分享定制

    一.开发相关 1.平台地址 微信开放平台 QQ互联平台SDK 2.文章收集 来自CSDN兄台的QQ登录使用的教程 微信网站应用开发的详细流程和引导 VueJs单页应用实现微信网页授权及微信分享功能 [ ...

  6. 微信开放平台 网站应用 第三方微信登录 回调地址导致的错误如何解决

    微信开放平台:https://open.weixin.qq.com 使用 单独为公司注册的QQ,并使用对应的QQ邮箱注册微信开放平台,并激活. 然后 提交企业信息审核,审核通过后,就可以创建 网站应用 ...

  7. 解决微信二次分享失败--后面被加上from=singlemessageisappinstalled=0的解决方案

    解决微信二次分享失败--后面被加上from=singlemessage&isappinstalled=0的解决方案 参考文章: (1)解决微信二次分享失败--后面被加上from=singlem ...

  8. 公众号菜单 点击推送图片素材_微信公众平台常用图片素材分享(点击关注、阅读原文、分享朋友圈)...

    最近在学习做微信公众平台,收集了一些微信公众平台常用图片素材(无水印通用图片素材),特此分享给大家.长期更新-- 1.求关注图片素材,这个是放在文章最前面,用来求关注,引诱用户点击关注用的 点击上方蓝 ...

  9. 详解 - 解决微信小程序分享功能图片比例问题 - 全局分享

    前言: 我在我的博客小程序使用微信小程序分享功能 图片不符合5:4问题 ,对其原理 扫描下面二维码,可以体验哦 准备 在需要自定义分享的页面 设置canvas 组件 目录 准备 详解思路 定义总函数 ...

最新文章

  1. 笔记 JVM调优流程
  2. 巨头纷纷看上的中国Robobus又获1亿美元投资
  3. 计算机组成原理实验报告西华大学,计算机组成原理实验报告算术逻辑运算单元实验...
  4. freopen()的重定向打开或者关闭
  5. 【Pytorch】interpolate==>上下采样函数
  6. php用户名登录名_PHP验证登录用户名和密码
  7. URI、URL和URN的关系
  8. 【java】java 一个线程占用多少内存
  9. C Tricks(八)—— 硬币和骰子的模拟
  10. 跟我学Android之二 第一个程序
  11. 测试es from size error,from + size must be less than or equal to: [10000]异常问题
  12. 宝峰c1对讲机写频软件_宝峰对讲机写频软件(BF-480 编程软件)
  13. petalinux设计——使用petalinux定制linux系统
  14. movs 数据传送指令_1.数据传送指令中,错误的操作是()。 A.MOVSS[BX+DI],1000H B.......
  15. Spring Boot项目WebService接口发布、调用、以及常见错误详解
  16. 巴比特MatPool运营NEO节点,2019年必定是 Staking 经济元年
  17. mac mini u盘安装系统_用u盘安装win7系统安装步骤
  18. 捷径智慧物业系统助力“书香小区”建设
  19. 二叉树的遍历(递归算法与非递归算法)
  20. EasyUi 快速入门

热门文章

  1. VS2008 编译错误,生成后事件问题 Error 1 error PRJ0019: A tool returned an error code from “Performing Post-Build
  2. [笔记][总结] MIT线性代数 Gilbert Strang 矩阵分解
  3. 在普通应用中 计算机和电视能够很容易,计算机技术在广播电视工程中的应用要点及发展趋势...
  4. 在阿里云上装黑苹果(1):黑苹果基础
  5. 分享 - 微信域名检测API接口
  6. 如何高效地学习开源项目-以ShardingSphere学习为例
  7. 讯客分类信息php,讯客分类信息互动版 v1.3
  8. C语言智能窗帘编码,基于STC89C52单片机智能窗帘控制系统.doc
  9. 手机云便签App敬业签怎么使用同步功能修复异常数据?
  10. IDC报告称,到2021年,全球可穿戴设备市场规模将翻番