接入步骤:
第一步: 根据接入指南中的说明,接入SDK,搭建开发环境、加入权限、注册到微信
public void regToWx(Context context){
api = WXAPIFactory.createWXAPI(context,APP_ID,true);
api.registerApp(APP_ID);
}
第二步:
根据移动应用微信登录开发指南中的说明,加入以下代码:
SendAuth.Req req = new SendAuth.Req();
req.scope = "snsapi_userinfo";
req.state = "cheez_wechat_login";
api.sendReq(req);
调起微信的登录页
第三步:
根据开发指南中的说明,加入WXEntryActivity
<activity
android:name="包名.wxapi.WXEntryActivity"
android:exported="true"
android:theme="@android:style/Theme.Translucent" />
注意:
- 这个activity一般都是接受回调,得到结果后就finish()的,所以有时候会闪一下,为了解决这个问题,可以设置此Activity为背景透明
- activity的注册一样要有android:exported="true" 属性
第四步:
在WXEntryActivity中,注册监听IWXAPIEventHandler,接收回调
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//也可以写成匿名内部类的形式
WeChatManager.getInstance().getApi().handleIntent(getIntent(), this);
}
第五步:处理结果
public class WXEntryActivity extends Activity implements IWXAPIEventHandler {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
WeChatManager.getInstance().getApi().handleIntent(getIntent(), this);
}
@Override
public void onReq(BaseReq baseReq) {
}
@Override
public void onResp(BaseResp baseResp) {
if(baseResp.getType() == ConstantsAPI.COMMAND_SENDAUTH){
//登录的回调
loginResult(baseResp);
}else if(baseResp.getType() == ConstantsAPI.COMMAND_SENDMESSAGE_TO_WX){
//分享的回调
shareReuslt();
}else{
//其他
finish();
}
}
}
遇到问题
1 - WXEntryActivity没有调用
排查问题思路:
1)确保申请的APPID时填写的包名和项目中包名一致,并且wxapi这个文件是在包名下建立的
2)确保WXEntryActivity在AndroidMaifest.xml中的注册
3)activity 没有指定view时是空白的,容易理解成没有回调
调起第三方应用后就自动确认授权了
2 - 影响到项目中原有的微信分享
解决:微信登录与原微信分享使用包不一样,iwxapi初始化两次但回调一样,将原微信分享使用的包由sdk变成openSDK(微信包更换的原因),iwxapi初始化统一,处理分享回调
3 - 加入反编译时官方文档给了3个,但实际就加了2个,加3个打包会失败
-keep class com.tencent.mm.opensdk.** {;}
-keep class com.tencent.mm.sdk.* {*;}
4 - 文档中授权登录的errCode只有3中,实际根据不同的安卓机型不同情况会有其他的值,所以需要对这个其他值进行处理
5 - 有的手机会有微信禁用未删除状态,这个时候显示手机是安装微信的但是api.sendReq(req)会失败;这个可以通过对api.sendReq(req)的返回值进行判断来确定。