转载请注明出处
http://blog.csdn.net/u014513456/article/details/54613444
Author:ruanjianjiagou@163.com
背景
webview 中分享本地图片到微信、朋友圈和QQ,目前QQ空间暂不支持分享纯图片,分享到QQ时正常分享,但分享到微信时调不起微信程序,此为背景,有以下解决方案。
有这样一段分享代码
private void performShare(SHARE_MEDIA platform) {
Config.dialog = new LoadingDialog(mActivity);
new ShareAction(mActivity).setPlatform(platform).setCallback(umShareListener)
.withText(content)
.withTargetUrl(targetUrl)
.withTitle(title)
.withMedia(getUMImage())
.share();
}
以上的友盟分享版本不确定,但每个版本分享都离不开ShareAction,withText,withTargetUrl,withTitle都可为空,withMedia 有内容就可以分享单纯的图片,其中要给withMedia(UMImage)
UMImage包含以下获取本地图片的方式
UMImage image = new UMImage(ShareActivity.this, "imageurl");//网络图片
UMImage image = new UMImage(ShareActivity.this, file);//本地文件
UMImage image = new UMImage(ShareActivity.this, R.drawable.xxx);//资源文件
UMImage image = new UMImage(ShareActivity.this, bitmap);//bitmap文件
UMImage image = new UMImage(ShareActivity.this, byte[]);//字节流
因为我们需求转成bitmap比较方便,于是直接设置进去的bitmap
基于原来的需求统一封装可能是url也可能是bitmap
UMImage getUMImage() {
UMImage umImage = null;
if (bitmap != null) {
if (smallBitMap) {
umImage = new UMImage(mActivity, BitMapUtil.ImageCompress(bitmap));
} else {
umImage = new UMImage(mActivity, bitmap);
}
} else {
umImage = new UMImage(mActivity, imgUrl);
}
return umImage;
}
如果bitmap是null这设置url的方式 url为空也没关系,友盟都做了非空判断。
BitMapUtil.ImageCompress(bitmap) 这句肯定引起了你的注意,没错这就是本篇文章的重点
因为BitMap的大小是不确定的,如果给微信分享的话图片必须小于32K 所以这个工具类来处理下图片,将图片控制在32K以内。
package com.ppdai.open.util;
import android.graphics.Bitmap;
import android.graphics.Matrix;
import java.io.ByteArrayOutputStream;
/**
* Email:ruanjianjiagou@163.com
* @data:17/1/18 下午1:59
* @Description:${todo}
*/
public class BitMapUtil {
public static Bitmap ImageCompress(Bitmap bitmap) {
// 图片允许最大空间 单位:KB
double maxSize = 32.00;
// 将bitmap放至数组中,意在bitmap的大小(与实际读取的原文件要大)
ByteArrayOutputStream baos = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos);
byte[] b = baos.toByteArray();
// 将字节换成KB
double mid = b.length / 1024;
// 判断bitmap占用空间是否大于允许最大空间 如果大于则压缩 小于则不压缩
if (mid > maxSize) {
// 获取bitmap大小 是允许最大大小的多少倍
double i = mid / maxSize;
// 开始压缩 此处用到平方根 将宽带和高度压缩掉对应的平方根倍
bitmap = zoomImage(bitmap, bitmap.getWidth() / Math.sqrt(i),
bitmap.getHeight() / Math.sqrt(i));
}
return bitmap;
}
/***
* 图片压缩方法二
*
* @param bgimage
* :源图片资源
* @param newWidth
* :缩放后宽度
* @param newHeight
* :缩放后高度
* @return
*/
public static Bitmap zoomImage(Bitmap bgimage, double newWidth, double newHeight) {
// 获取这个图片的宽和高
float width = bgimage.getWidth();
float height = bgimage.getHeight();
// 创建操作图片用的matrix对象
Matrix matrix = new Matrix();
// 计算宽高缩放率
float scaleWidth = ((float) newWidth) / width;
float scaleHeight = ((float) newHeight) / height;
// 缩放图片动作
matrix.postScale(scaleWidth, scaleHeight);
Bitmap bitmap = Bitmap.createBitmap(bgimage, 0, 0, (int) width,
(int) height, matrix, true);
return bitmap;
}
}
以上,将要分享的本地图片压缩到32K以内就能调起分享到微信或朋友圈。
但是ios可以分享原图,android如何分享本地原图呢,请看下篇。