Android 应用中分享到微信好友和朋友圈的实现

前言

实现分享到微信好友和朋友圈的功能其实很简单,官方文档其实还是比较详细的,只是在创建应用的过程比较费(dan)事(teng),好在微信的审核效率还可以,所以这篇博客简单为大家介绍下这个功能的实现,同时方便自己日后查看。话不多说,下面进入正题。

申请 AppID

这部分大家去微信开发者平台注册账号按照提示创建应用就好了,这里是开发者平台的地址。这里要注意的是创建应用是需要提供应用的签名,大家可以在链接里下载签名生成工具安装在手机上获得。

引入 jar 包

官方资源下载页下载 jar 包,然后将包导入工程。

在 AndroidManifest.xml 中添加权限

1
2
3
4
5
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<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" />

注册到微信

要使你的程序启动后微信终端能响应你的程序,必须在代码中你需要的位置向微信终端注册你的id。

1
2
3
4
5
6
7
//注册应用id到微信
private void regToWx() {
//通过WXAPIFactory工厂,获取IWXAPI的实例
api = WXAPIFactory.createWXAPI(context, APP_ID, true);
//将应用的appId注册到微信
api.registerApp(APP_ID);
}

分享

  1. 分享文字

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    /**
    * 分享文字到朋友圈或者好友
    *
    * @param text 文本内容
    * @param scene 分享方式:好友还是朋友圈
    */
    public boolean shareText(String text, int scene) {
    //初始化一个WXTextObject对象,填写分享的文本对象
    WXTextObject textObj = new WXTextObject();
    textObj.text = text;
    return share(textObj, text, scene);
    }
  2. 分享图片

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    /**
    * 分享图片到朋友圈或者好友
    *
    * @param bmp 图片的Bitmap对象
    * @param scene 分享方式:好友还是朋友圈
    */
    public boolean sharePic(Bitmap bmp, int scene) {
    //初始化一个WXImageObject对象
    WXImageObject imageObj = new WXImageObject(bmp);
    //设置缩略图
    Bitmap thumb = Bitmap.createScaledBitmap(bmp, 60, 60, true);
    bmp.recycle();
    return share(imageObj, bmp, scene);
    }
  3. 分享网页

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    /**
    * 分享网页到朋友圈或者好友,视频和音乐的分享和网页大同小异,只是创建的对象不同。
    * 详情参考官方文档:
    * https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1419317340&token=&lang=zh_CN
    *
    * @param url 网页的url
    * @param title 显示分享网页的标题
    * @param description 对网页的描述
    * @param scene 分享方式:好友还是朋友圈
    */
    public boolean shareUrl(String url, String title, Bitmap thumb, String description, int scene) {
    //初试话一个WXWebpageObject对象,填写url
    WXWebpageObject webPage = new WXWebpageObject();
    webPage.webpageUrl = url;
    return share(webPage, title, thumb, description, scene);
    }

其中 share 的重载函数如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
private boolean share(WXMediaMessage.IMediaObject mediaObject, Bitmap thumb, int scene) {
return share(mediaObject, null, thumb, null, scene);
}
private boolean share(WXMediaMessage.IMediaObject mediaObject, String description, int scene) {
return share(mediaObject, null, null, description, scene);
}
private boolean share(WXMediaMessage.IMediaObject mediaObject, String title, Bitmap thumb, String description, int scene) {
//初始化一个WXMediaMessage对象,填写标题、描述
WXMediaMessage msg = new WXMediaMessage(mediaObject);
if (title != null) {
msg.title = title;
}
if (description != null) {
msg.description = description;
}
if (thumb != null) {
msg.thumbData = bmpToByteArray(thumb, true);
}
//构造一个Req
SendMessageToWX.Req req = new SendMessageToWX.Req();
req.transaction = String.valueOf(System.currentTimeMillis());
req.message = msg;
req.scene = scene;
return api.sendReq(req);
}

注:如果是分享到朋友圈,scene = SendMessageToWX.Req.WXSceneTimeline;如果分享到好友, scene = SendMessageToWX.Req.WXSceneSession

判断是否支持分享到朋友圈

只有微信4.2以上支持,如果需要检查微信版本支持API的情况, 可调用 IWXAPI 的 getWXAppSupportAPI 方法, 0x21020001 及以上支持发送朋友圈

1
2
3
4
5
6
//判断是否支持转发到朋友圈
//微信4.2以上支持,如果需要检查微信版本支持API的情况, 可调用IWXAPI的getWXAppSupportAPI方法,0x21020001及以上支持发送朋友圈
public boolean isSupportWX() {
int wxSdkVersion = api.getWXAppSupportAPI();
return wxSdkVersion >= TIMELINE_SUPPORTED_VERSION;
}

微信返回值的接收

如果需要对分享的结果进行处理,那么就需要对微信的返回值进行判断。问题来了,如何获取微信的返回值呢?

  1. 在你的包名相应目录下新建一个 wxapi 目录,并在该 wxapi 目录下新增一个 WXEntryActivity 类,该类继承自 Activity,并在 manifest 文件里面加上 exported 属性,设置为 true。
  2. 实现 IWXAPIEventHandler 接口,微信发送的请求将回调到 onReq 方法,发送到微信请求的响应结果将回调到 onResp 方法,此处我们用到的是 onResp 方法。
  3. 在 WXEntryActivity 中将接收到的 intent 及实现了 IWXAPIEventHandler 接口的对象传递给IWXAPI接口的 handleIntent 方法。
    1
    2
    IWXAPI api = WXAPIFactory.createWXAPI(this, WeChatShareUtil.APP_ID, false);
    api.handleIntent(getIntent(),this);

项目地址

源码我已上传至本人的 Github,欢迎访问指导