所遇问题

最近在项目开发中,需要用到一个分享的功能。当我千辛万苦的把整个页面的绘制出来转换成比bitmap的时候,算了下,大概最长的图片高度应该有9000+,点击分享到微信,嗯哼?!什么情况?调不起微信客户端,mmp.

好烦.jpg

找坑

查看微信官方开发者文档,里面有提到调不起的主要原因有:

微信是否安装

调用时的Apk包名和签名是否与开放平台填写的一致

检查发送时的缩略图大小是否超过32k

发现坑

对于上面的3点,第一点是不用看的嘛。来看看第2点:

调用时的Apk包名和签名是否与开放平台填写的一致,意思是在申请微信分享key的时候所填写的包名是否与现在所打包出来的包名是否一致,还有打包出来的apk签名是否与后台所配置的签名MD5一致,可以去微信开发者下载签名检验工具检验。

经调试发现,分享整个应用的时候(就是有标题有内容有网页链接)时,微信分享是能调起来的,说明以上第二点所提到的问题不存在,那只有第3点了。来看看第三点:

检查发送时的缩略图大小是否超过32k,这是什么gui,内牛满面.

QQ图片20170802132034.jpg

由于项目中所分享的图片是整个页面的长图,初分享时只是简单的进行质量压缩,并没有进行深度压缩,导致的官方所说的缩略图大小不能大于32k的限制使得调不起微信来分享。

填坑

既然知道了问题在哪里,对于技术宅来说解决问题就再容易不过了,马上开干。说到底还是图片的压缩问题而已,下面说说常见的几种bitmap的压缩方式,条件是在使得能调起微信分享的情况下,最大化图片的质量,以防止深度压缩导致的模糊不清。

QQ图片20170802142212.gif

使用RGB_565的config

Bitmap.createBitmap(finalWidth, finalHeight, Bitmap.Config.RGB_565);

在创建一个bitmap的时候,第三个参数有4种配置,分别是:

Bitmap.Config ALPHA_8 表示8位Alpha位图,即A=8,一个像素点占用1个字节,它没有颜色,只有透明度

Bitmap.Config ARGB_4444 表示16位ARGB位图,即A=4,R=4,G=4,B=4,一个像素点占4+4+4+4=16位,2个字节

Bitmap.Config ARGB_8888 表示32位ARGB位图,即A=8,R=8,G=8,B=8,一个像素点占8+8+8+8=32位,4个字节

Bitmap.Config RGB_565 表示16位RGB位图,即R=5,G=6,B=5,它没有透明度,一个像素点占5+6+5=16位,2个字节

ARGB 分别表示三原色+透明度,这个不展开了。

用Bitmap.Config.RGB_565处理的图片大小相比ARGB_8888减少了一半的内存,但是长宽并没有变化。

质量压缩

先看代码

public static Bitmap compressBitmap(Bitmap tmp) {

ByteArrayOutputStream baos = new ByteArrayOutputStream();

tmp.compress(Bitmap.CompressFormat.JPEG, 100, baos);

int op = 90;

while (baos.toByteArray().length > 192 * 1024 && op >= 0) {

baos.reset();

tmp.compress(Bitmap.CompressFormat.JPEG, op, baos);

op -= 10;

}

ByteArrayInputStream isBm = new ByteArrayInputStream(baos.toByteArray());

return decodeStream(isBm);

}

这种压缩方式称之为质量压缩,宽度和高度不变,质量降低,相应的bitmap所占的内存也降低。

这里的192是我项目中规定的,根据微信分享所规定的32k大小限制,我这边并不太理解,在调试中发现bitmap的baos.toByteArray().length大小只要小于196左右,就能调起微信的分享,所以我限制192也算是刚刚好吧,在这里希望有谁清楚这个的,不妨给我指点指点,它们之间有什么联系没有,不过不要把我p的太过哈,留点面子给我讨点饭吃,好穷的我。

QQ图片20170802142310.jpg

采样率压缩

不知道大家还记不记得Bitmap.Options.inSampleSize这个属性,继续看看

ByteArrayOutputStream baos = new ByteArrayOutputStream();

tmp.compress(Bitmap.CompressFormat.JPEG, 100, baos);

ByteArrayInputStream isBm = new ByteArrayInputStream(baos.toByteArray());

BitmapFactory.Options options = new BitmapFactory.Options();

options.inJustDecodeBounds = true;

BitmapFactory.decodeStream(isBm, null, options);

options.inJustDecodeBounds = false;

float be = options.outWidth / 480;

options.inSampleSize = (int) Math.rint(be);

return BitmapFactory.decodeStream(isBm,null,options);

这种方式中,设置inSampleSize的值(int类型)后,假如设为2,则宽和高都为原来的1/2,宽高都减少了,自然内存也降低了。

缩放法压缩

public static Bitmap compressBitmap(Bitmap tmp) {

ByteArrayOutputStream baos = new ByteArrayOutputStream();

tmp.compress(Bitmap.CompressFormat.JPEG, 100, baos);

ByteArrayInputStream isBm = new ByteArrayInputStream(baos.toByteArray());

BitmapFactory.Options options = new BitmapFactory.Options();

options.inJustDecodeBounds = true;

decodeStream(isBm, null, options);

options.inJustDecodeBounds = false;

Matrix matrix = new Matrix();

matrix.setScale(0.8f, 0.8f);

tmp = Bitmap.createBitmap(tmp, 0, 0, options.outWidth, options.outHeight, matrix, true);

baos.reset();

tmp.compress(Bitmap.CompressFormat.JPEG, 100, baos);

while (baos.toByteArray().length > 192 * 1024) {

matrix.setScale(0.9f, 0.9f);

tmp = Bitmap.createBitmap(tmp, 0, 0, options.outWidth, options.outHeight, matrix, true);

baos.reset();

tmp.compress(Bitmap.CompressFormat.JPEG, 100, baos);

}

isBm = new ByteArrayInputStream(baos.toByteArray());

return BitmapFactory.decodeStream(isBm, null, options);

}

这种方式可以慢慢的根据你设置的条件一点点的对图片的大小进行缩减,关于martix更多信息,自行谷歌。

混合压缩

所谓的混合压缩,其实就是把上面的几种方式按照不一样的顺序进行重新整理。以下是我所做项目的压缩方法

public static Bitmap compressBitmap(Bitmap tmp) {

ByteArrayOutputStream baos = new ByteArrayOutputStream();

tmp.compress(Bitmap.CompressFormat.JPEG, 100, baos);

ByteArrayInputStream isBm = new ByteArrayInputStream(baos.toByteArray());

BitmapFactory.Options options = new BitmapFactory.Options();

options.inJustDecodeBounds = true;

decodeStream(isBm, null, options);

options.inJustDecodeBounds = false;

Matrix matrix = new Matrix();

matrix.setScale(0.8f, 0.8f);

tmp = Bitmap.createBitmap(tmp, 0, 0, options.outWidth, options.outHeight, matrix, true);

baos.reset();

tmp.compress(Bitmap.CompressFormat.JPEG, 50, baos);

while (baos.toByteArray().length > 192 * 1024) {

isBm = new ByteArrayInputStream(baos.toByteArray());

tmp = decodeStream(isBm, null, options);

matrix.setScale(0.95f, 0.95f);

tmp = Bitmap.createBitmap(tmp, 0, 0, tmp.getWidth(), tmp.getHeight(), matrix, true);

baos.reset();

tmp.compress(Bitmap.CompressFormat.JPEG, 70, baos);

}

isBm = new ByteArrayInputStream(baos.toByteArray());

return decodeStream(isBm, null, options);

}

这种对质量会比较好

public static Bitmap depthCompressBitmap(Bitmap tmp) {

ByteArrayOutputStream baos = new ByteArrayOutputStream();

tmp.compress(Bitmap.CompressFormat.JPEG, 100, baos);

ByteArrayInputStream isBm = new ByteArrayInputStream(baos.toByteArray());

BitmapFactory.Options options = new BitmapFactory.Options();

options.inJustDecodeBounds = true;

decodeStream(isBm, null, options);

options.inJustDecodeBounds = false;

float be = options.outWidth / 480;

float scale = 0.55f;

if (be >= 2) {

scale = 0.35f;

}

Matrix matrix = new Matrix();

matrix.setScale(scale, scale);

tmp = Bitmap.createBitmap(tmp, 0, 0, options.outWidth, options.outHeight, matrix, true);

baos.reset();

tmp.compress(Bitmap.CompressFormat.JPEG, 50, baos);

int op = 40;

while (baos.toByteArray().length > 192 * 1024) {

baos.reset();

tmp.compress(Bitmap.CompressFormat.JPEG, op, baos);

op -= 10;

if (op <= 0) {

break;

}

}

if (baos.toByteArray().length > 192 * 1024) {

isBm = new ByteArrayInputStream(baos.toByteArray());

tmp = BitmapFactory.decodeStream(isBm, null, options);

matrix.setScale(0.8f, 0.8f);

tmp = Bitmap.createBitmap(tmp, 0, 0, tmp.getWidth(), tmp.getHeight(), matrix, true);

baos.reset();

tmp.compress(Bitmap.CompressFormat.JPEG, 70, baos);

}

isBm = new ByteArrayInputStream(baos.toByteArray());

return decodeStream(isBm, null, options);

}

这种是直接减半压缩,和上面对比,在不同的图片中所得到的效果不一样,自行试验,还有其他的自己组合,这里只提供思路。

QQ图片20170802151106.png

经过这种处理之后的图片,再点击分享,完美的调起微信分享,辣鸡人生。

android微信分享调不起微信,关于分享调不起微信客户端的解决办法相关推荐

  1. 服务商模式下微信小程序支付时,一直报“支付验证签名失败”错误的解决办法

    在写小程序支付的时候,我是以服务商模式发起的支付,统一下单接口是调用成功的,但是在小程序调起支付的时候就报"支付验证签名失败"的错误. 主要有三个原因: 1.第二次签名用到的tim ...

  2. maxlength不起作用android,Android EditText设置Filter以后(xml布局文件中maxLength不起作用的解决办法)...

    Android EditText设置Filter以后,xml布局文件中maxLength不起作用的解决办法 问题发现 最近项目里有个需求,文本框禁用emoji表情的输入,因为用到的地方较多,第一个想到 ...

  3. 安卓手机微信H5中无法长按保存base64图片、blob形式图片的解决办法

    解决实现安卓[微信]H5长按无法保存和分享base64图片问题 问题产生原因,后台发来图片的base64编码有中有空格存在,而ios的WebView可以自动做处理,android则不能. **解决方法 ...

  4. 微信打开页面底部显示“原页面已由QQ浏览器云转码”解决办法

    问题描述: 微信分享的页面底部显示"原页面已由QQ浏览器云转码",页面布局只显示文字,没有图片等css样式,点击右上角在浏览器中打开还是会转码,没有样式只有文字. 原因分析: 1. ...

  5. 小米9se(miui 10) 微信里保存的图片,发朋友圈时找不到的解决办法

    下面的解决办法在小米9se中,亲测有效. 这个问题应该是一键换机导致. 解决方案如下:1.确认自己照片已在云端备份.2.将tencent/micromsg重命名(可以随便取,只要和原来不同即可),然后 ...

  6. Android之通过VideoView控件播放一个视频出现的问题以及我的解决办法

    1.在Android模拟器中是可以播放视频的,可播放视频的格式为3gp.mp4.mkv等,其中我们使用VideoView控件播放一个视频时,部署到模拟器上,往往会弹出一个对话框,如下图所示: 我认为出 ...

  7. 编译Android源码,执行lunch命令时报错“No such file: /root/.lunchrc”的解决办法

    1.问题描述: 在编译Android系统源码时,执行#lunch命令,报"No such file: /root/.lunchrc"错误,现象如图所示. 2.解决办法: 将系统源码 ...

  8. 关于Android Studio 4.1采用华为荣耀平板真机调试logcat不显示的解决办法

    问题分析 本人安卓开发初学者.在学习的过程中,利用手头上的一个荣耀waterplay平板做真机调试.在采用Android Studio 3.X的版本时,平板是可以正常输出logcat的,最近升级到4. ...

  9. 微信小游戏、three.js、真机调试,出现锯齿的解决办法

    更正: 原文是基于微信小游戏,在微信开发者工具.手机端微信小游戏,该方案没问题. 我今天尝试移植到普通web,该方案出现新问题: 1)不使用该方案,则出现锯齿. 2)使用该方案,则正圆变成椭圆. 暂时 ...

最新文章

  1. 从paxos到raft zab,为何raft能够“独领风骚”
  2. 全球机器换人排行榜!这八个国家遥遥领先
  3. 第 21 章 System Utilities 配置工具
  4. debug assertion failed!报错
  5. [译]Visual Studio 2008 Code Metrics
  6. using 指令是不需要的和其他两个C#错误
  7. hashcode值一样对象一定相同吗_HashMap实现原理分析(面试问题:两个hashcode相同 的对象怎么存入hashmap的)...
  8. x390拆机 升级内存和硬盘_工作效率低下?双十二是时候升级硬盘与内存了
  9. 基于倒排表的电力调度知识问答系统构建 (100行代码带你实现nlp问答系统)
  10. ubuntu下安装mysql 杂记
  11. Unity3d 手机屏幕自动适配
  12. VS中代码格式及样式的统一处理
  13. 3 年大厂工作经验面试竟然要我手写 atoi 函数
  14. EP100触发CAN中断但无法读取报文
  15. python一般用什么平台好_python哪几个平台好用
  16. warning: #188-D: enumerated type mixed with another type
  17. 电脑桌面的计算机图双击打不开,win10双击电脑图标打不开必须右键打开
  18. 微信公众号菜单模板设置
  19. Android添加自定义公共so库
  20. Flutter基础Widget之按钮(RaisedButton、FlatButton、OutlineButton,IconButton)

热门文章

  1. 红黑树RBTree原理(超易懂)
  2. 域服务器共享文件夹权限,域用户权限|共享文件夹
  3. Vue3 组件之间的通信
  4. 阿里云存储,让更多的创新在身边发生
  5. 26.用递归求5的阶乘
  6. python中的转义字符有哪些_Python中的转义字符
  7. 刚学Tableau的小白也可以作出美观大气的数据图表
  8. Solidworks在“消除隐藏线”的显示模式下边线是彩色的解决方案
  9. Android中String.xml中空格转义字符不起作用
  10. css3中的3d元素