一、接入前操作
博主昨天接入微信分享遇到了一个大坑和一些小问题,今天跟大家分享一下这些问题和处理办法。接入前需要注册微信开放平台:https://open.weixin.qq.com/
添加依赖等操作看这里:
https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=1417751808&token=7bc53b063369e012229fe72e75deed066003afea&lang=zh_CN
做完上面的操作就可以开始写接入代码了。
二、分享代码接入
1.在application类中注册应用:
private IWXAPI wxApi;
//注册微信
wxApi = WxApiUtils.regToWx(getApplicationContext());
public static IWXAPI regToWx(Context context){
IWXAPI iwxapi = WXAPIFactory.createWXAPI(context,APP_ID,true);
iwxapi.registerApp(APP_ID);
return iwxapi;
}
注:APP_ID填你自己应用的APP_ID,在微信开放平台添加上你的应用后会有。
建议:调用微信接口的方法写成一个工具类,博主的微信接口调用都写在 WxApiUtils类中。
2.分享图片到微信聊天窗口或朋友圈
public static boolean sharePic(Context context,int shareType,int resourceId){
Bitmap bmp = BitmapFactory.decodeResource(context.getResources(),resourceId);
WXImageObject imgObj = new WXImageObject(bmp);
WXMediaMessage mediaMsg = new WXMediaMessage();
mediaMsg.mediaObject = imgObj;
//设置缩略图
Bitmap thumbBmp = Bitmap.createScaledBitmap(bmp,50,50,true);
bmp.recycle();
mediaMsg.thumbData = ImageUtils.bmpToByteArray(thumbBmp,true);
//构造一个req
SendMessageToWX.Req req = new SendMessageToWX.Req();
req.transaction = "img"+String.valueOf(System.currentTimeMillis());
req.message = mediaMsg;
switch (shareType){
case SHARE_TYPE_SESSION:
req.scene = SendMessageToWX.Req.WXSceneSession;
break;
case SHARE_TYPE_TIME_LINE:
req.scene = SendMessageToWX.Req.WXSceneTimeline;
break;
}
return ShuShanApplication.getInstance().getWxApi().sendReq(req);
}
参数介绍:
shareType:分享的类型,0分享到聊天窗口,1分享到朋友圈
resourceId:分享的图片资源id(注:后面会提供一个重载方法,用Bitmap替代resourceId,方便上传网络图片)
重载方法:
public static boolean sharePic(Context context,int shareType,Bitmap bmp){
WXImageObject imgObj = new WXImageObject(bmp);
WXMediaMessage mediaMsg = new WXMediaMessage();
mediaMsg.mediaObject = imgObj;
//设置缩略图
Bitmap thumbBmp = Bitmap.createScaledBitmap(bmp,50,50,true);
bmp.recycle();
mediaMsg.thumbData = ImageUtils.bmpToByteArray(thumbBmp,true);
//构造一个req
SendMessageToWX.Req req = new SendMessageToWX.Req();
req.transaction = "img"+String.valueOf(System.currentTimeMillis());
req.message = mediaMsg;
switch (shareType){
case SHARE_TYPE_SESSION:
req.scene = SendMessageToWX.Req.WXSceneSession;
break;
case SHARE_TYPE_TIME_LINE:
req.scene = SendMessageToWX.Req.WXSceneTimeline;
break;
}
return ShuShanApplication.getInstance().getWxApi().sendReq(req);
}
这里有几个小问题:
1.bmpToByteArray()方法微信的例子里没有提供出来!!他只写了个Util.bmpToByteArray()就没有然后了!!而且Util这个类没有添加到依赖的微信包里,呵呵,仿佛在逗我笑,你是让我猜这个方法写的啥吗??当然,之后百度到了:
/**
* 将bmp转换为字节数组
* @param bmp
* @param needRecycle
* @return
*/
public static byte[] bmpToByteArray(final Bitmap bmp, boolean needRecycle) {
ByteArrayOutputStream output = new ByteArrayOutputStream();
bmp.compress(Bitmap.CompressFormat.PNG, 100, output);
if (needRecycle) {
bmp.recycle();
}
byte[] result = output.toByteArray();
try {
output.close();
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
2."img"+String.valueOf(System.currentTimeMillis());
3.测试
大坑就是在测试这里了。
坑:点击分享一闪而过,分享到对话框和朋友圈都是这样。
网上查了很多方法,打包APK出来测试啊,什么什么的啊,都没有作用,浪费了几个小时时间。
之后发现原因:卸载安装一次APP,签名会改变。(会与之前在开放平台创建APP时填入的签名不同)
解决方法:
使用开放平台提供的签名工具:
https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1419319167&token=7bc53b063369e012229fe72e75deed066003afea&lang=zh_CN
翻到最底下有个“签名生成工具”,点击它就可以下载。
安装好之后run你的应用,跑起来之后打开签名生成工具,输入APP的包名就可以生成签名,把这个签名覆盖掉之前在开放平台设置的签名,然后再测试分享功能,成功!
4.结语
微信开放平台的开发文档真的太坑人,不够详细,还好你们翻到了我这篇博客。
解决了给个赞吧!
有问题请留言,博主会尽快回复!