先吐槽一下企鹅的开发文档和示例代码,还有所谓的接入指南。浪费我一下午好吗!开发测试中一堆的坑啊,官方甚至都没有一点友情提示好吗!你们的示例代码一定要写的那么坑爹吗?也不提示一下测试官方的demo也要专门签名,这种事情你不明确说谁能想到啊,阿啊阿啊阿啊!!!!
吐槽完全停不下来。。。大家稍等1小时。。。
———————————————1小时的切割线———————————————————
下面开始测试如何在android应用中加入分享到朋友圈或朋友的过程。
按照企鹅的官方指南,
首先,我们需要申请APPID,进入微信开放平台,管理中心,创建移动应用,按照要求填写要接入微信的应用信息。
注意,应用的包名和签名MD5值千千万万不要填错,如果不知道怎么签的名,那一定要先搞清楚签名再说,否则后面都是白扯。强烈建议用企鹅给的签名信息获取工具核对一下你的签名。这里又引入一次吐槽,企鹅你就不能在这个签名工具中提供复制功能么?就不能做个选择应用的功能,一定要手动输入包名,然后手动记下来长长的签名信息。。。
(此处吐槽1小时)
———————————————1小时的切割线———————————————————
第二步,下载开发的sdk包,就是那个libammsdk.jar。此处无坑。
快速进行到第3步,配置环境,就是在工程中导入那个jar包。熟悉eclipse和androidstudio的不会有问题。
第四步,开始编写测试代码。此处有坑。
首先是创建一个IWXAPI的实例,然后把App注册到微信。。。注册到微信这句话我理解错了,我起初以为只有要申请成为微信内部功能的应用才需要注册,而实际上,这里都需要注册。
IWXAPI api = WXAPIFactory.createWXAPI(this, "wxwxaaaaaabbbbbbs", true);
api.registerApp("wxaaaaaabbbbbbs");
接下来就是构造一个请求,发送给微信。比较常用的是分享一个网页,那么可以这么做:
WXWebpageObject webpage = new WXWebpageObject();
WXMediaMessage msg = new WXMediaMessage(webpage);
msg.title = "最贴心";
webpage.webpageUrl = "http://app.mi.com/detail/63164";//要分享的网页地址
msg.description = "这可真是一个好东西啊";
Bitmap thumb = BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher);//分享的缩略图
msg.thumbData = Utils.bmpToByteArray(thumb, true);
SendMessageToWX.Req req = new SendMessageToWX.Req();
req.transaction = buildTransaction("webpage");
req.message = msg;
req.scene = SendMessageToWX.Req.WXSceneTimeline;//分享到朋友圈
//req.scene = SendMessageToWX.Req.WXSceneSession;//分享给某个朋友或者群聊
api.sendReq(req);
这就分享了。注意这里又有一个坑,官方照例不提示,sendReq()这个方法有个boolean的返回值,false表示没发成,true表示已发送。但是,这个已发送仅仅是已发送,不能代表成功分享,因此不能作为判断分享成功与否的标志。
上面代码里面还有个buildTransction(),官方示例中的,大家直接复制过来到工程中就可以了。
那么,怎么才能靠谱的接收分享的结果呢?那就需要这么做:
在你的工程中新建一个包,严格按照格式,假设你原来的工程包名是com.yourapp.test,那么新建一个包名叫做com.yourapp.test.wxapi,在这个包中新建一个Activity,必须名叫WXEntryActivity,否则必坑。。。
这个Activity的代码结构如下:
/**
* Created by wanglei on 14-11-13.
*
* 微信客户端回调activity示例 */
public class WXEntryActivity extends Activity implements IWXAPIEventHandler {
private static final String TAG = "WXEntryActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
IWXAPI api = WXAPIFactory.createWXAPI(this, "还是那个APPID", false);
api.handleIntent(getIntent(), this);
super.onCreate(savedInstanceState);
}
@Override
public void onReq(BaseReq arg0) {
//这里是响应微信发起的对你的应用的请求的结果
}
@Override
public void onResp(BaseResp resp) {
//这是响应你的应用发送请求给微信的结果
Log.i(TAG, "resp.errCode:" + resp.errCode + ",resp.errStr:" + resp.errStr);
switch (resp.errCode) {
case BaseResp.ErrCode.ERR_OK:
//分享成功
break;
case BaseResp.ErrCode.ERR_USER_CANCEL:
//分享取消
break;
case BaseResp.ErrCode.ERR_AUTH_DENIED:
//分享拒绝
break;
case BaseResp.ErrCode.ERR_SENT_FAILED:
break;
case BaseResp.ErrCode.ERR_UNSUPPORT:
break;
}
}
}
然后,别忘了在AndroidManifest.xml中加入这个特定Activity的注册信息:
<activity
android:name=".wxapi.WXEntryActivity"
android:exported="true"
android:screenOrientation="portrait"
android:theme="@android:style/Theme.Translucent.NoTitleBar" />
然后就到了最大的坑,混淆代码。官方说要在混淆的配置中加入下面的两句话避免出问题:
-keep class com.tencent.mm.sdk.openapi.WXMediaMessage {*;}
-keep class com.tencent.mm.sdk.openapi.** implements com.tencent.mm.sdk.openapi.WXMediaMessage$IMediaObject {*;}
我就如实的加入了这两句。然后,开始了痛苦的测试。。。
由于我使用AndroidStudio,就将这两句放在了proguard-ruls.txt中。
点击分享到朋友圈,嗯?分享到朋友圈,我分享到朋友圈。。。除了要我登陆下微信之外,没有任何反应了,猛刷朋友圈也看不到分享的内容。
怎么回事?不是要出来个小框框让我分享的么?像这样:
为什么我的没有出现这个界面??神马情况?于是我一顿核对签名、包名,一遍一遍的看示例代码、看官方文档。无果。。。
最后,我终于想到,先不混淆试试,取消混淆,测试,成功。。。靠!难道企鹅给的混淆配置不对???????!!!!!
我看了看那么多的import,果然好像那个配置不能涵盖企鹅sdk中的那么多包,干脆一不做二不休,简单粗暴这样配置混淆好了:
-keep class com.tencent.mm.sdk.** {
*;
}
亲们,果然就好了。。。
是我没搞明白还是企鹅你太坑了。。。
特此记录,纪念我那被坑掉的一下午