1. 账号申请
一般申请一天后就会审核通过。
生成app签名,这个签名是由app的签名文件keystorre决定的,生成方式:保证手机上安装的目标app是正式使用的keystore生成的apk 将微信获取签名的apk安装到该手机,输入app包名获取签名(该签名 是由keystore决定的,与机型无关,微博和微信获取到的签名也是一致的)
2.分享接入
微信分享接入说明 https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1419317340&token=&lang=zh_CN
吐槽一下微信的文档,简陋的不能再简陋了。遇到问题只能自己摸索
接入微信分享和支付可以共同使用libammsdk.jar一个文件就可以了,不像微博要引入一堆
微信分享支持文字,图片,音频,视频,网页等5种形式的分享。其中后三种都支持缩略图
5种形式分享实现太多代码 放在文章最后
3.获取分享结果
接收微信分享的结果是整个工程中的大坑
要求:
1)创建一个WXEntryActivity.java类 该类继承Activity 且必须实现IWXAPIEventHandler接口
2) 接收返回信息的类WXEntryActivity.java 名字不能变,且必须在packagename.wxapi包下,如:程序包名(注册时提交给微信的包名)是com.sb.test 那么WXEntryActivity.java这个文件就应该在com.sb.test.wxapi下
实现
public class WXEntryActivity extends Activity implements IWXAPIEventHandler {
private IWXAPI mWechatApi;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mWechatApi = WXAPIFactory.createWXAPI(this, ShareConstants.WECHAT_APP_KEY, false);
mWechatApi.handleIntent(getIntent(), this); // 这里不必api.regist再次注册了
}
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
setIntent(intent);
mWechatApi.handleIntent(intent, this);
}
@Override
public void onReq(BaseReq paramBaseReq) {
Toast.makeText(this, "onReq toast", Toast.LENGTH_LONG).show();
}
@Override
public void onResp(BaseResp paramBaseResp) {
int result = 0;
switch (paramBaseResp.errCode) {
case BaseResp.ErrCode.ERR_OK:
result = R.string.share_result_success;
break;
case BaseResp.ErrCode.ERR_USER_CANCEL:
result = R.string.share_result_cancel;
break;
case BaseResp.ErrCode.ERR_AUTH_DENIED:
result = R.string.share_result_deny;
break;
default:
result = R.string.share_result_unknown;
break;
}
Toast.makeText(this, result, Toast.LENGTH_LONG).show();
finish();
}
}
注意,注意,注意
这里的结果回调必须按照上面的要求定义成Activity(按照要求,按照要求,按照要求) 如果想在Fragment中回调的 就暂时不要想了,没用的
如果工程中分享的代码不在主包名下,也就是说 我实现的分享模块在com.sb.share下,又不想将WXEntryActivity 孤零零的定义到com.sb.test中这时Activity-alias可以帮助你
用法如下
android:name="com.sb.share.wxapi.WXEntryActivity"
android:exported="true"
android:theme="@style/Theme.NoDisplay" >
android:name="com.sb.test.wxapi.WXEntryActivity"
android:exported="true"
android:targetActivity="com.sb.share.wxapi.WXEntryActivity" >
如果根据demo添加以下filter会出现两个桌面icon
几种形式的分享实现
private boolean shareTextMessage(data) {
WXTextObject textObj = new WXTextObject();
textObj.text = getText(data);
WXMediaMessage msg = new WXMediaMessage(textObj);
msg.description = getText(data);
return sendMediaMessage(msg, getScene(data));
}
private boolean shareImageMessage(data) {
Bitmap bitmap = getBitmap(data);
if (bitmap == null || bitmap.isRecycled()) {
return false;
}
WXImageObject imgObj = new WXImageObject(bitmap);
WXMediaMessage msg = new WXMediaMessage(imgObj);
Bitmap thumbBmp = Bitmap.createScaledBitmap(bitmap, getThumbWidth(data), getThumbHeight(data), true);
bitmap.recycle();
msg.thumbData = ShareUtils.bmpToByteArray(thumbBmp, true);
return sendMediaMessage(msg, getScene(data));
}
private boolean shareMusicMessage(data) {
WXMusicObject musicObj = new WXMusicObject();
musicObj.musicUrl = getUrl(data);
return sendMediaMessage(musicObj, data);
}
private boolean shareVideoMessage(data) {
WXVideoObject videoObj = new WXVideoObject();
videoObj.videoUrl = getUrl(data);
return sendMediaMessage(videoObj, data);
}
private boolean shareWebPageMessage(data) {
WXWebpageObject webpageObj = new WXWebpageObject();
webpageObj.webpageUrl = getUrl(data);
return sendMediaMessage(webpageObj, data);
}
private boolean sendMediaMessage(WXMediaMessage msg, int scene) {
SendMessageToWX.Req req = new SendMessageToWX.Req();
req.transaction = buildTransaction(msg.getType());
req.message = msg;
req.scene = scene;
return mWechatShareAPI.sendReq(req);
}
private boolean sendMediaMessage(IMediaObject obj, data) {
WXMediaMessage msg = new WXMediaMessage(obj);
msg.title = getSubject(data);
msg.description = getDescription(data); // descrition 在分享到朋友圈时只有 音乐 视频能显示出来,分享到好友时 web也能显示出来
Bitmap thumb = getBitmap(data);
if (thumb != null && !thumb.isRecycled()) {
msg.thumbData = ShareUtils.bmpToByteArray(thumb, true);
}
SendMessageToWX.Req req = new SendMessageToWX.Req();
req.transaction = buildTransaction(msg.getType());
req.message = msg;
req.scene = getScene(data);
return mWechatShareAPI.sendReq(req);
}
private String buildTransaction(final int type) {
StringBuilder sb = new StringBuilder();
sb.append(type);
sb.append("#");
sb.append(System.currentTimeMillis());
return sb.toString();
}