首先说一句,微信SDK是我见过最坑的sdk,文档写的很简略,导致开发者走了好多弯路。
好了,说下实现微信开发接入的步骤
0. 附上demo
为了便于理解,附上测试demo和生成的APK。
1. 申请微信开发平台账号、申请appID
在微信开放平台申请账号,登录后到管理中心创建项目,我这里是Android项目,所以这里是创建移动项目。
第一步:填应用信息上传应用缩略图,这个随意传。
第二步:官网随便填(当时填了百度都没事),然后应用平台选择Android,特别注意包名要和需要开发的包名是完全一致的(如果不知道在Manifest中找),而签名则需要通过你KeyStone来决定(请看第二点)。
第三步:提交审核,只有通过审核后你才能拿到AppID和AppSecret来开发,审核时间挺久的,耐心等待。
2. 签名生成与使用
2.1 签名生成工具
到微信开放平台的资源中心去下载签名生成工具并安装到测试手机上,(链接:签名生成工具)
2.2 对测试应用进行签名
必须始终使用同一个KeyStore来签名。因为签名生成工具是通过应用的包名找到应用的KeyStore,以此来生成签名的。假如更改了KeyStore必须在重新生成签名并更新到微信开放平台。
具体签名方法可以看blog(构建类型要选择release):Android Studio系列-签名打包
2.3 安装签名过的APK,并使用签名生成工具生成签名。
2.4 将生成的签名填在微信开放平台的应用签名中。
3. 实现过程
3.1 下载jar包并导入
下载地址:微信开放平台资源中心
3.2 WXEntryActivity
在包名下面创建wxapi的包,并在wxapi的包中创建WXEntryActivity继承Activity,实现IWXAPIEventHandler接口,最后在Manifest中设置Activity的exported属性为true。这条很重要,如果不是"包名.wxapi.WXEntryActivity"的路径,就获取不到返回值。下面的这个Activity的简单实现。
public class WXEntryActivity extends Activity implements IWXAPIEventHandler { // IWXAPI 是第三方app和微信通信的openapi接口 private IWXAPI api; private static final String APP_ID = "wx5f30e72504c5d0c2"; @Override protected void onCreate(Bundle savedInstanceState) { api = WXAPIFactory.createWXAPI(this, APP_ID, false); api.handleIntent(getIntent(), this); super.onCreate(savedInstanceState); } @Override public void onResp(BaseResp resp) { Toast.makeText(this, "errCode = " + resp.errCode, Toast.LENGTH_LONG).show(); switch (resp.errCode) { case BaseResp.ErrCode.ERR_OK: //分享成功 break; case BaseResp.ErrCode.ERR_USER_CANCEL: //分享取消 break; case BaseResp.ErrCode.ERR_AUTH_DENIED: //分享拒绝 break; } finish(); } @Override public void onReq(BaseReq arg0) { } }别忘了Manifest的exported属性
<activity android:name=".wxapi.WXEntryActivity" android:exported="true" />这个Activity出现的逻辑是:MainActivity --发送请求--> 微信分享界面 --退出该界面--> WXEntryActivity
只有跳转到微信进行过操作后才会跳转到这个Activity。
3.3 MainActivity
我在这个类中发送了分享图片和文本到朋友圈的请求。
public class MainActivity extends Activity { private IWXAPI wxApi; private static final String APP_ID = "wx5f30e72504c5d0c2"; private static final int THUMB_SIZE = 100; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 实例化 wxApi = WXAPIFactory.createWXAPI(this, APP_ID); wxApi.registerApp(APP_ID); findViewById(R.id.btnImage).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { new AsyncTask<Void, Void, Void>() { @Override protected Void doInBackground(Void... params) { sendImageToWX(); return null; } }.execute(); } }); findViewById(R.id.btnText).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { sendTextToWX(); } }); } /** * 分享图片到微信朋友圈 */ private void sendImageToWX() { Bitmap bmp = getUrlBitmap(); if (bmp != null) { WXImageObject imgObj = new WXImageObject(bmp); Bitmap thumbBmp = Bitmap.createScaledBitmap(bmp, THUMB_SIZE, THUMB_SIZE, true); bmp.recycle(); WXMediaMessage msg = new WXMediaMessage(); msg.mediaObject = imgObj; msg.thumbData = bmpToByteArray(thumbBmp, true); // 设置缩略图 SendMessageToWX.Req req = new SendMessageToWX.Req(); req.transaction = buildTransaction("img"); req.message = msg; req.scene = SendMessageToWX.Req.WXSceneTimeline;//发送到朋友圈 // req.scene = SendMessageToWX.Req.WXSceneSession;//发送给微信好友 wxApi.sendReq(req); } } /** * 获取图片 * * @return */ private Bitmap getUrlBitmap() { try { URL url = new URL("http://b.hiphotos.baidu.com/image/pic/item/fd039245d688d43f76b17dd4781ed21b0ef43bf8.jpg"); Bitmap bitmap = BitmapFactory.decodeStream(url.openConnection().getInputStream()); if (bitmap.getByteCount() > 4096000) { BitmapFactory.Options options = new BitmapFactory.Options(); options.inSampleSize = bitmap.getByteCount() / 4096000;//缩放比例 options.inJustDecodeBounds = false; bitmap = BitmapFactory.decodeStream(url.openConnection().getInputStream(), null, options); } return bitmap; } catch (Exception e) { e.printStackTrace(); return null; } } /** * 分享文本到朋友圈 */ private void sendTextToWX() { String text = "这是一段测试文本"; // 初始化一个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(); req.transaction = buildTransaction("text"); // transaction字段用于唯一标识一个请求 req.message = msg; req.scene = SendMessageToWX.Req.WXSceneTimeline; // req.scene = SendMessageToWX.Req.WXSceneSession;//发送给微信好友 // 调用api接口发送数据到微信 wxApi.sendReq(req); } private String buildTransaction(final String type) { return (type == null) ? String.valueOf(System.currentTimeMillis()) : type + System.currentTimeMillis(); } private byte[] bmpToByteArray(Bitmap bmp, boolean needRecycle) { ByteArrayOutputStream output = new ByteArrayOutputStream(); bmp.compress(Bitmap.CompressFormat.PNG, 100, output); if (needRecycle) { bmp.recycle(); } byte[] result = output.toByteArray(); try { output.close(); } catch (Exception e) { e.printStackTrace(); } return result; } }到此就可以实现微信的分享功能。
4. 微信SDK Sample的使用
肯定会有同学和我遇到同样的问题,为什么微信提供的demo无法分享成功。事实是微信开发文档忘了告诉我们需要在运行demo之前将开发工具的Debug.keyStore换成它提供的KeyStore。KeyStore文件可以在SDK的demo中找到。
由于是Eclipse项目,附上Eclipse修改debug.keystore的路径:Windows->Perferences->Android:Build->Custom debug keystore
PS:发现SDK提供的demo中有许多分享失败的,暂时还不明真相。另外吐槽下,微信的SDK文档水平简直醉了。