2017 - 04 - 10
1, 首先需要在微信开放平台创建应用,网址:open.weixin.qq.com Ps:吐槽一下微信东西放的好乱。
其中应用包名和 签名千万不要乱写,其他的看着办吧;然后提交审核
签名可以用腾讯公司提供的签名获取工具 ,
网址:https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1419319167&token=&lang=zh_CN
图1:
图2:
大概等待一周后审核通过就可以集成了。
2,之前集成大多采用的的libmmsdk的jar包形式,现在微信已经发布到jcenter,可以采用Gradle的compile,如图:
图3:
3,开始集成到项目
3.1需要的权限
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
3.2
这里我采用的是网上大神封装的一个工具类 ,在此也万分感谢大神;
代码中的Wechatutils工具类就是微信示例代码的utils工具类,大家可以自己copy过来,我只是改了名字
网址:http://www.2cto.com/kf/201410/346762.html
public class WechatShareManager {
private static final int THUMB_SIZE = 150;
public static final int WECHAT_SHARE_WAY_TEXT = 1; //文字
public static final int WECHAT_SHARE_WAY_PICTURE = 2; //图片
public static final int WECHAT_SHARE_WAY_WEBPAGE = 3; //链接
public static final int WECHAT_SHARE_WAY_VIDEO = 4; //视频
public static final int WECHAT_SHARE_TYPE_TALK = SendMessageToWX.Req.WXSceneSession; //会话
public static final int WECHAT_SHARE_TYPE_FRENDS = SendMessageToWX.Req.WXSceneTimeline; //朋友圈
private static WechatShareManager mInstance;
private ShareContent mShareContentText, mShareContentPicture, mShareContentWebpag, mShareContentVideo;
public IWXAPI mWXApi;
private Context mContext;
private WechatShareManager(Context context){
this.mContext = context;
//初始化数据
//初始化微信分享代码
initWechatShare(context);
}
/**
* 获取WeixinShareManager实例
* 非线程安全,请在UI线程中操作
* @return
*/
public static WechatShareManager getInstance(Context context){
if(mInstance == null){
mInstance = new WechatShareManager(context);
}
return mInstance;
}
private void initWechatShare(Context context){
if (mWXApi == null) {
mWXApi = WXAPIFactory.createWXAPI(context, Constants.APP_ID, true);
}
mWXApi.registerApp(Constants.APP_ID);
}
/**
* 通过微信分享
* @param shareContent 分享的方式(文本、图片、链接)
* @param shareType 分享的类型(朋友圈,会话)
*/
public void shareByWebchat(ShareContent shareContent, int shareType){
switch (shareContent.getShareWay()) {
case WECHAT_SHARE_WAY_TEXT:
shareText(shareContent, shareType);
break;
case WECHAT_SHARE_WAY_PICTURE:
sharePicture(shareContent, shareType);
break;
case WECHAT_SHARE_WAY_WEBPAGE:
ULog.e("调用shareByWebchat","调用shareByWebchat");
shareWebPage(shareContent, shareType);
break;
case WECHAT_SHARE_WAY_VIDEO:
// shareVideo(shareContent, shareType);
break;
}
}
private abstract class ShareContent {
protected abstract int getShareWay();
protected abstract String getContent();
protected abstract String getTitle();
protected abstract String getURL();
protected abstract int getPictureResource();
}
/**
* 设置分享文字的内容
* @author chengcj1
*
*/
public class ShareContentText extends ShareContent {
private String content;
/**
* 构造分享文字类
* @param content 分享的文字内容
*/
public ShareContentText(String content){
this.content = content;
}
@Override
protected int getShareWay() {
return WECHAT_SHARE_WAY_TEXT;
}
@Override
protected String getContent() {
return content;
}
@Override
protected String getTitle() {
return null;
}
@Override
protected String getURL() {
return null;
}
@Override
protected int getPictureResource() {
return -1;
}
}
/*
* 获取文本分享对象
*/
public ShareContent getShareContentText(String content) {
if (mShareContentText == null) {
mShareContentText = new ShareContentText(content);
}
return (ShareContentText) mShareContentText;
}
/**
* 设置分享图片的内容
* @author chengcj1
*
*/
public class ShareContentPicture extends ShareContent {
private int pictureResource;
public ShareContentPicture(int pictureResource){
this.pictureResource = pictureResource;
}
@Override
protected int getShareWay() {
return WECHAT_SHARE_WAY_PICTURE;
}
@Override
protected int getPictureResource() {
return pictureResource;
}
@Override
protected String getContent() {
return null;
}
@Override
protected String getTitle() {
return null;
}
@Override
protected String getURL() {
return null;
}
}
/*
* 获取图片分享对象
*/
public ShareContent getShareContentPicture(int pictureResource) {
if (mShareContentPicture == null) {
mShareContentPicture = new ShareContentPicture(pictureResource);
}
return (ShareContentPicture) mShareContentPicture;
}
/**
* 设置分享链接的内容
* @author chengcj1
*
*/
public class ShareContentWebpage extends ShareContent {
private String title;
private String content;
private String url;
private int pictureResource;
public ShareContentWebpage(String title, String content, String url, int pictureResource){
this.title = title;
this.content = content;
this.url = url;
this.pictureResource = pictureResource;
}
@Override
protected int getShareWay() {
return WECHAT_SHARE_WAY_WEBPAGE;
}
@Override
protected String getContent() {
return content;
}
@Override
protected String getTitle() {
return title;
}
@Override
protected String getURL() {
return url;
}
@Override
protected int getPictureResource() {
return pictureResource;
}
}
/*
* 获取网页分享对象
*/
public ShareContent getShareContentWebpag(String title, String content, String url, int pictureResource) {
if (mShareContentWebpag == null) {
mShareContentWebpag = new ShareContentWebpage(title, content, url, pictureResource);
}
return (ShareContentWebpage) mShareContentWebpag;
}
/**
* 设置分享视频的内容
* @author chengcj1
*
*/
public class ShareContentVideo extends ShareContent {
private String url;
public ShareContentVideo(String url) {
this.url = url;
}
@Override
protected int getShareWay() {
return WECHAT_SHARE_WAY_VIDEO;
}
@Override
protected String getContent() {
return null;
}
@Override
protected String getTitle() {
return null;
}
@Override
protected String getURL() {
return url;
}
@Override
protected int getPictureResource() {
return -1;
}
}
/*
* 获取视频分享内容
*/
public ShareContent getShareContentVideo(String url) {
if (mShareContentVideo == null) {
mShareContentVideo = new ShareContentVideo(url);
}
return (ShareContentVideo) mShareContentVideo;
}
/*
* 分享文字
*/
private void shareText(ShareContent shareContent, int shareType) {
if (!isInstallWX()) {
return;
}
String text = shareContent.getContent();
//初始化一个WXTextObject对象
WXTextObject textObj = new WXTextObject();
textObj.text = text;
//用WXTextObject对象初始化一个WXMediaMessage对象
WXMediaMessage msg = new WXMediaMessage();
msg.mediaObject = textObj;
msg.description = text;
//构造一个Req
SendMessageToWX.Req req = new SendMessageToWX.Req();
//transaction字段用于唯一标识一个请求
req.transaction = buildTransaction("textshare");
req.message = msg;
//发送的目标场景, 可以选择发送到会话 WXSceneSession 或者朋友圈 WXSceneTimeline。 默认发送到会话。
req.scene = shareType;
mWXApi.sendReq(req);
}
/*
* 分享图片
*/
private void sharePicture(ShareContent shareContent, int shareType) {
if (!isInstallWX()) {
return;
}
Bitmap bitmap = BitmapFactory.decodeResource(mContext.getResources(), shareContent.getPictureResource());
WXImageObject imgObj = new WXImageObject(bitmap);
WXMediaMessage msg = new WXMediaMessage();
msg.mediaObject = imgObj;
//在这设置缩略图
//官方文档介绍这个bitmap不能超过32kb
//如果一个像素是8bit的话换算成正方形的bitmap则边长不超过181像素,边长设置成150是比较保险的
//或者使用msg.setThumbImage(thumbBitmap);省去自己转换二进制数据的过程
//如果超过32kb则抛异常
Bitmap thumbBitmap = Bitmap.createScaledBitmap(bitmap, THUMB_SIZE, THUMB_SIZE, true);
bitmap.recycle();
msg.thumbData = WechatUtils.bmpToByteArray(thumbBitmap, true); //设置缩略图
SendMessageToWX.Req req = new SendMessageToWX.Req();
req.transaction = buildTransaction("imgshareappdata");
req.message = msg;
req.scene = shareType;
mWXApi.sendReq(req);
}
/*
* 分享链接
*/
private void shareWebPage(ShareContent shareContent, int shareType) {
if (!isInstallWX()) {
return;
}
WXWebpageObject webpage = new WXWebpageObject();
webpage.webpageUrl = shareContent.getURL();
WXMediaMessage msg = new WXMediaMessage(webpage);
msg.title = shareContent.getTitle();
msg.description = shareContent.getContent();
//在这设置缩略图
//官方文档介绍这个bitmap不能超过32kb
//如果一个像素是8bit的话换算成正方形的bitmap则边长不超过181像素,边长设置成150是比较保险的
//或者使用msg.setThumbImage(thumbBitmap);省去自己转换二进制数据的过程
//如果超过32kb则抛异常
Bitmap thumb = BitmapFactory.decodeResource(mContext.getResources(), shareContent.getPictureResource());
if(thumb == null) {
Toast.makeText(mContext, "图片不能为空", Toast.LENGTH_SHORT).show();
} else {
msg.thumbData = WechatUtils.bmpToByteArray(thumb, true);
// msg.setThumbImage(thumb);
}
SendMessageToWX.Req req = new SendMessageToWX.Req();//创建一个请求对象
req.transaction = buildTransaction("webpage");//这个tag要唯一,用于在回调中分辨是哪个分享请求
req.message = msg;//把msg放入请求对象中
req.scene = shareType;//发送到哪里的字段
// req.scene = SendMessageToWX.Req.WXSceneTimeline;发送到朋友圈
//req.scene = SendMessageToWX.Req.WXSceneSession; //设置发送给朋友
boolean b = mWXApi.sendReq(req);//如果调用成功微信,会返回true
}
/*
* 分享视频
*/
// private void shareVideo(ShareContent shareContent, int shareType) {
// if (!isInstallWX()) {
// return;
// }
// WXVideoObject video = new WXVideoObject();
// video.videoUrl = shareContent.getURL();
//
// WXMediaMessage msg = new WXMediaMessage(video);
// msg.title = shareContent.getTitle();
// msg.description = shareContent.getContent();
// Bitmap thumb = BitmapFactory.decodeResource(mContext.getResources(), R.drawable.send_music_thumb);
// // BitmapFactory.decodeStream(new URL(video.videoUrl).openStream());
// /**
// * 测试过程中会出现这种情况,会有个别手机会出现调不起微信客户端的情况。造成这种情况的原因是微信对缩略图的大小、title、description等参数的大小做了限制,所以有可能是大小超过了默认的范围。
// * 一般情况下缩略图超出比较常见。Title、description都是文本,一般不会超过。
// */
// Bitmap thumbBitmap = Bitmap.createScaledBitmap(thumb, THUMB_SIZE, THUMB_SIZE, true);
// thumb.recycle();
// msg.thumbData = WechatUtils.bmpToByteArray(thumbBitmap, true);
//
// SendMessageToWX.Req req = new SendMessageToWX.Req();
// req.transaction = buildTransaction("video");
// req.message = msg;
// req.scene = shareType;
// mWXApi.sendReq(req);
// }
private String buildTransaction(final String type) {
return (type == null) ? String.valueOf(System.currentTimeMillis()) : type + System.currentTimeMillis();
}
// 判断手机是否安装微信
private boolean isInstallWX() {
if(!mWXApi.isWXAppInstalled()) {
ToastUtils.show(APP.getContext(), "请先安装微信", Toast.LENGTH_LONG);
return false;
} else if (!mWXApi.isWXAppSupportAPI()) {
ToastUtils.show(APP.getContext(), "请将已安装的微信升级至最新版本", Toast.LENGTH_LONG);
return false;
} else {
return true;
}
}
}
然后调用工具类去分享:
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.id_ll_share_toFriends://分享给好友
WechatShareManager.ShareContentWebpage mShareContentWebpag = (WechatShareManager.ShareContentWebpage) mShareManager.getShareContentWebpag(title,content,url,R.mipmap.ic_launcher);
mShareManager.shareByWebchat(mShareContentWebpag,WechatShareManager.WECHAT_SHARE_TYPE_TALK);
break;
case R.id.id_ll_share_toFriendsLine://分享到好友圈
WechatShareManager.ShareContentWebpage mShareContentWebpagToLine = (WechatShareManager.ShareContentWebpage) mShareManager.getShareContentWebpag(title,content,url,R.mipmap.ic_launcher);
mShareManager.shareByWebchat(mShareContentWebpagToLine,WechatShareManager.WECHAT_SHARE_TYPE_FRENDS);
break;
}
}
其实我看现在微信开放平台关于分享的写的比较清楚了,基本可以拿来使用,
在开放平台 -- 资源中心 --- 分享与收藏功能 --- Android应用下,
网址:https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1419317340&token=f7ec6832f33c43b585586e7b708f10d92965ffad&lang=zh_CN
图5:
3.3 处理分享后的回调
这里需要在自己的包下新建一个package,这个package名称是确定的,
肯定一定要是wxapi,比如说我的包名是com.test.project,那么新建的包名就在这个下面,是com.test.project.wxapi
在这个包下面新建(或者直接把示例的类copy过来)WXEntryActivity集成activity,实现IWXAPIEventHandler接口,在oncreate中需要调用handleIntent方法,处理微信传回的intent,你也可以在其他地方处理,
在onResp中是你请求微信返回的,你可以在这里处理,我只弹了个吐司,然后finish掉回到自己的页面处理。
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//处理微信传回的Intent,当然你也可以在别的地方处理
WechatShareManager.getInstance(this).mWXApi.handleIntent(getIntent(), this);
}
@Override
public void onResp(BaseResp baseResp) {//在这个方法中处理微信传回的数据
String result = "分享错误";
//形参resp 有下面两个个属性比较重要
//1.resp.errCode
//2.resp.transaction则是在分享数据的时候手动指定的字符串,用来分辨是那次分享(参照4.中req.transaction)
switch (baseResp.errCode) { //根据需要的情况进行处理
case BaseResp.ErrCode.ERR_OK:
//正确返回
result = "分享成功";
break;
case BaseResp.ErrCode.ERR_USER_CANCEL:
//用户取消
result = "分享取消";
break;
case BaseResp.ErrCode.ERR_AUTH_DENIED:
//认证被否决
result = "分享被拒绝";
break;
case BaseResp.ErrCode.ERR_SENT_FAILED:
//发送失败
result = "分享失败";
break;
case BaseResp.ErrCode.ERR_UNSUPPORT:
//不支持错误
result = "不支持错误";
break;
case BaseResp.ErrCode.ERR_COMM:
//一般错误
result = "分享发生错误";
break;
default:
//其他不可名状的情况
result = "分享出现未知错误";
break;
// Intent intent = new Intent(this, xxx.class);
// intent.putExtra("errCode", resp.errCode);
// intent.putExtra("errStr", resp.transaction);
// startActivity(intent);
// finish();
}
ToastUtils.show(this,result, Toast.LENGTH_SHORT);
finish();
}
另外:onNewIntent也复写下
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
setIntent(intent);
WechatShareManager.getInstance(this).mWXApi.handleIntent(intent, this);
}
别忘了在清单文件中注册改activity
<!--注意这个exported="true"属性一定是true,不然微信不能调用-->
<activity android:name=".wxapi.WXEntryActivity"
android:screenOrientation="portrait"
android:launchMode="singleTask"
android:exported="true"/>
最后注意事项:
1.签名不能错,最后一开始就用release版本的签名,免得之后忘记
2.缩略图大小不能超过32k
3.清单文件中要注册,exported必须是true
4.回调的包名一定是wxapi