最近需要对一些Activity进行微信分享,分享数据包括小图标,图标右侧的推荐语,点击该分享跳转到对于的M页面,分享成功之后返回到当前Activity,同时需要根据用户是否成功进行分享而进行相应操作。
参考了一下微信SDK文档,地址如下:http://open.weixin.qq.com/zh_CN/htmledition/res/dev/document/sdk/wp8/class_micro_msg_1_1sdk_1_1_base_resp.html
这个地址指向的是微信分享后返回的resp数据结构。
新一些的版本可以看这个:http://open.weixin.qq.com/zh_CN/htmledition/res/dev/document/sdk/android/index.html
首先我们先来看下整个分享的过程:
客户端 -----req--------> 微信 -------resp-------> 客户端
这里我们先看req
分享信息(简单的图片+推荐语+附带Url链接)这里采用了SendMessageToWX.Req
主要参数为message,scene,transaction。对应作用图中详细描述了。
业务所需要分享的内容主要都封装在massage中,根据自己的需要,可以创建对于的数据类,WXAppExtendMessage、WXBaseMessage、WXImageMessage、WXMediaMessage……
就拿WXMediaMessage举例实现上述三个分享,成员变量中,title存放标题,description用于存放推荐语,mediaObject用于存放Url,thumbData存放图片
WXWebpageObject webPageObj = new WXWebpageObject();
webPageObj.webpageUrl = "http://blog.youkuaiyun.com/qq_22260247/article/";
WXMediaMessage wxMsg = new WXMediaMessage();
wxMsg.mediaObject = webPageObj;
wxMsg.title = "flycgu";
wxMsg.description = "still learning";
wxMsg.thumbData = 二进制图片文件;
……(其他参数可以看上面文档链接)
SendMessageToWX.Req req = new SendMessageToWX.Req();
req.transaction = 对应请求的事务ID,通常由Req创建,回复Resp时应填入对应事务ID;
req.message = wxMsg;
req.scene = 发送的目标场景;
IWXAPI api = WXAPIFactory.createWXAPI(context, 向微信注册的ID, true);
api.sendReq(req);
一些常用的方法,包括向微信注册,检测是否安装微信,是否支持分享等
api.registerApp(ID);
iwxapi.isWXAppInstalled();
iwxapi.isWXAppSupportAPI();
成功组装数据发送req请求之后,下面搞定回调部分
1. 在你的包名相应目录下新建一个wxapi目录,并在该wxapi目录下新增一个WXEntryActivity类,该类继承自Activity,并在manifest文件里面加上exported属性,设置为true。
2. 实现IWXAPIEventHandler接口,微信发送的请求将回调到onReq方法,发送到微信请求的响应结果将回调到onResp方法。
3. 在WXEntryActivity中将接收到的intent及实现了IWXAPIEventHandler接口的对象传递给IWXAPI接口的handleIntent方法。当微信发送请求到你的应用,将通过IWXAPIEventHandler接口的onReq方法进行回调,类似的,应用请求微信的响应结果将通过onResp回调。
在这里,我在onResp方法中进行回调成功处理。@Override
public void onResp(BaseResp resp) {
switch (resp.errCode) {
case BaseResp.ErrCode.ERR_OK:
Toast.makeText(WXEntryActivity.this, "分享成功", Toast.LENGTH_SHORT).show();
handleWXResp(resp);//处理成功结果
break;
case BaseResp.ErrCode.ERR_USER_CANCEL:
Toast.makeText(WXEntryActivity.this, "分享取消", Toast.LENGTH_SHORT).show();
break;
case BaseResp.ErrCode.ERR_AUTH_DENIED:
Toast.makeText(WXEntryActivity.this, "分享拒绝", Toast.LENGTH_SHORT).show();
break;
default:
break;
}
finish();
}
因为所有地方分享回调都走到这里,如何区分是我那个业务呢?随后参考resp中的参数,可以用的是transaction,这个参数是我们在req传入,微信透传返回过来,可以用来区分对于的业务。
为了整体结构,处理成功结果我这里才用了广播的方式。
req.transaction = 对应请求的事务ID,通常由Req创建,回复Resp时应填入对应事务ID;
编译调试,成功走到handleWXResp(resp),resp中的transaction也是我req中传入的值。关于后续的广播方式,可以参考我转的文章,有普通的Broadcast,也有针对app内部的
LocalBroadcastManager,后者不需要权限参数,只需要action。
第一次搞微信分享,还不知道这样的做法是否规范。望指正!