Android 应用接入微信分享

准备工作

在微信开放平台注册

登陆 微信开放平台 创建一个移动应用,正确填写应用 名称包名签名,得到一个 AppID

  • 移动应用名称,将显示在用户分享的信息中。

  • 应用包名,相信接触过 Android 的开发者都已经很熟悉了,它是项目中的基础软件包的名称。包名的格式是域名的反写,例如,微信客户端的包名是 com.tencent.mm

  • 应用签名,是签名所用密钥的 MD5 指纹。Android 要求应用必须先使用证书进行签名,然后才能安装。所以你生成的,可供任意用户安装的应用,必然可以查询到一个密钥指纹。许多人在接入后无法调起分享,仅仅是因为获取指纹的姿势不对。为了少走弯路,建议直接通过微信提供的 签名获取工具 查询。

配置 debug 版本签名

默认情况下,通过开发工具直接运行在模拟器上的应用是不包含签名的。这也是签名校验失败的可能原因之一。为了方便在开发时调用微信接口,需要配置 debug 版本签名。

  1. 右击项目,选择 Open Module Settings ,打开项目结构配置。
  2. Signing 选项卡下添加一个签名,填好密钥信息。
  3. Build Types 选项卡下修改 debug 版本的 Signing Config ,选择第二步中添加的签名。

接入微信 SDK

接入 SDK 的过程非常简单。

第一步,在 Gradle 的配置文件中添加依赖,等待 SDK 下载完毕。

1
2
3
4
// build.gradle (Module: app)
dependencies {
implementation 'com.tencent.mm.opensdk:wechat-sdk-android-without-mta:+'
}

第二步,在清单文件中声明必要的权限。

1
2
3
4
5
6
<!-- AndroidManifest.xml -->
<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"/>

注册到微信

在调用微信客户端的功能之前,需要先使用 registerApp 注册你申请到的 AppID 。这一步的目的是确认当前应用的包名、签名与微信开放平台上登记的一致。常量 APP_ID 的值应该是你的 AppID

1
2
api = WXAPIFactory.createWXAPI(context, APP_ID, true);
api.registerApp(APP_ID);

分享内容到微信

要分享内容到微信,你的 APP 应该向微信客户端发送一个包含 微信媒体消息(WXMediaMessage)的发信请求。微信媒体消息通常包含基础的标题、描述、缩略图,和一个媒体对象。

分享的媒体可以是网页、文件、小程序等,微信 SDK 提供了 丰富的对象 以便发送不同类型的内容。

以分享一个网页到朋友圈为例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// 设置网址
WXWebpageObject webpage = new WXWebpageObject();
webpage.webpageUrl = "https://yiming.blog";

// 设置标题
WXMediaMessage msg = new WXMediaMessage(webpage);
msg.title = "My Blog";

// 设置缩略图
Bitmap thumb = BitmapFactory.decodeResource(context.getResources(), R.mipmap.ic_thumb);
msg.thumbData = Image.bitmapToByteArray(thumb);

// 构造一个发信请求
SendMessageToWX.Req req = new SendMessageToWX.Req();
req.transaction = String.valueOf(System.currentTimeMillis());
req.message = msg;
req.scene = WXSceneTimeline;

// 发送请求给微信客户端
api.sendReq(req);

消息中的缩略图 thumbData 应该是字节数据。下面是一个将位图转换成字节数据的示例方法:

1
2
3
4
5
public static byte[] bitmapToByteArray(Bitmap bitmap){
ByteArrayOutputStream output = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, output);
return output.toByteArray();
}

一个发信请求还应该包括场景和事务ID:

  • 分享场景 scene 可选对话 WXSceneSession、朋友圈 WXSceneTimeline 和收藏 WXSceneFavorite 三种。

  • 事务ID transaction 用于唯一标识一个请求。

相关环境:macOS 10.14.1 / Android Studio 3.2.1 / WeChat SDK for Android 5.1.6