CocosCreator打包原生Android项目接入微信登陆

前往 微信官方文档 •开放平台Android开发工具包下载,范例代码HelloWeixin下载

一、生成安卓keystore签名

使用这个Android Studio 生成的keystore,有一个在线生成安卓证书在线制作工具

二、在所在包名下的目录新建一个文件夹wxapi

然后新建一个类 WXEntryActivity.java名字和文件名需要一样。

三、实现WXEntryActivity.java代码
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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
/*
Copyright (c) 2015-2016 Chukong Technologies Inc.
Copyright (c) 2017-2018 Xiamen Yaji Software Co., Ltd.
http://www.cocos2d-x.org
*/
package com.ds.quwami.wxapi;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.widget.Toast;

import com.tencent.mm.opensdk.modelbase.BaseReq;
import com.tencent.mm.opensdk.modelbase.BaseResp;
import com.tencent.mm.opensdk.modelmsg.SendAuth;
import com.tencent.mm.opensdk.openapi.IWXAPI;
import com.tencent.mm.opensdk.openapi.IWXAPIEventHandler;
import com.tencent.mm.opensdk.openapi.WXAPIFactory;

import org.cocos2dx.javascript.AppActivity;
import org.cocos2dx.lib.Cocos2dxJavascriptJavaBridge;


public class WXEntryActivity extends Activity implements IWXAPIEventHandler {

private String APP_ID = "wxq28466eh4b48be59";//这个ID是错误的换成你自己的
/**
* 微信的登录
*/
public static IWXAPI api;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

api= WXAPIFactory.createWXAPI(this,APP_ID,true);
api.registerApp(APP_ID);
api.handleIntent(getIntent(), this);
}

@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
setIntent(intent);
api.handleIntent(intent,this);
}

@Override
public void onReq(BaseReq baseReq) {

}

@Override
public void onResp(BaseResp resp) {
int errorCode = resp.errCode;
switch (errorCode) {
case BaseResp.ErrCode.ERR_OK:
//用户同意
final String code = ((SendAuth.Resp) resp).code;
Log.i("WXEntryActivity", "WXEntryActivity onResp: code=" + code);

AppActivity.calljs(code);

break;
case BaseResp.ErrCode.ERR_AUTH_DENIED:
//用户拒绝
Toast.makeText(this, "微信登录 用户拒绝", Toast.LENGTH_SHORT).show();
break;
case BaseResp.ErrCode.ERR_USER_CANCEL:
//用户取消
Toast.makeText(this, "微信登录 用户取消", Toast.LENGTH_SHORT).show();
break;
default:
break;
}
finish();
}
}

然后在 AndroidManifest.xml主文件中添加

1
2
3
4
5
6
7
8
<activity
android:name="com.ds.~.wxapi.WXEntryActivity"//这儿换成你自己的
android:label="@string/app_name"
android:theme="@android:style/Theme.Translucent.NoTitleBar"
android:taskAffinity="com.ds.~"//这儿换成你自己的
android:exported="true"
android:launchMode="singleTask">
</activity>

添加位置,如图红色框的部分:

其中android:name = "com.~.wxapi.WXEntryActivity"这个就是对应这个路径目录。

添加WXAPI依赖,打开build.gradle文件,注意是proj.android-studio/~你的项目名字 目录下,在dependencies中加下面的代码 api 'com.tencent.mm.opensdk:wechat-sdk-android-without-mta:+',这儿game下的 build.gradle也要添加。

1
2
3
4
5
6
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar','*.aar'])
implementation fileTree(dir: "/Applications/CocosCreator2.3.2.app/Contents/Resources/cocos2d-x/cocos/platform/android/java/libs", include: ['*.jar'])
implementation project(':libcocos2dx')
api 'com.tencent.mm.opensdk:wechat-sdk-android-without-mta:+'
}

AppActivity.java中的实现,wxLogin函数必须是静态的,这样才可以去外部调用。

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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
/*
Copyright (c) 2015-2016 Chukong Technologies Inc.
Copyright (c) 2017-2018 Xiamen Yaji Software Co., Ltd.
http://www.cocos2d-x.org
*/
package org.cocos2dx.javascript;
import android.content.Intent;
import android.content.res.Configuration;
import android.os.Bundle;
import android.widget.Toast;

import com.tencent.mm.opensdk.modelmsg.SendAuth;
import com.tencent.mm.opensdk.openapi.IWXAPI;
import com.tencent.mm.opensdk.openapi.WXAPIFactory;

import org.cocos2dx.lib.Cocos2dxActivity;
import org.cocos2dx.lib.Cocos2dxGLSurfaceView;
import org.cocos2dx.lib.Cocos2dxJavascriptJavaBridge;

public class AppActivity extends Cocos2dxActivity {

private String APP_ID = "wxq28466eh4b48be59";//这个ID是错误的换成你自己的
/**
* 微信的登录
*/
public static IWXAPI api;

public static AppActivity act;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (!isTaskRoot()) {
// Android launched another instance of the root activity into an existing task
// so just quietly finish and go away, dropping the user back into the activity
// at the top of the stack (ie: the last state of this task)
// Don't need to finish it again since it's finished in super.onCreate .
return;
}
// DO OTHER INITIALIZATION BELOW
SDKWrapper.getInstance().init(this);

api= WXAPIFactory.createWXAPI(this,APP_ID);
api.registerApp(APP_ID);
act = this;
}

@Override
public Cocos2dxGLSurfaceView onCreateView() {
Cocos2dxGLSurfaceView glSurfaceView = new Cocos2dxGLSurfaceView(this);
// TestCpp should create stencil buffer
glSurfaceView.setEGLConfigChooser(5, 6, 5, 0, 16, 8);
SDKWrapper.getInstance().setGLSurfaceView(glSurfaceView, this);

return glSurfaceView;
}

@Override
protected void onResume() {
super.onResume();
SDKWrapper.getInstance().onResume();

}

@Override
protected void onPause() {
super.onPause();
SDKWrapper.getInstance().onPause();

}

@Override
protected void onDestroy() {
super.onDestroy();
if (!isTaskRoot()) {
return;
}
SDKWrapper.getInstance().onDestroy();
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
SDKWrapper.getInstance().onActivityResult(requestCode, resultCode, data);
}

@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
SDKWrapper.getInstance().onNewIntent(intent);
}

@Override
protected void onRestart() {
super.onRestart();
SDKWrapper.getInstance().onRestart();
}

@Override
protected void onStop() {
super.onStop();
SDKWrapper.getInstance().onStop();
}

@Override
public void onBackPressed() {
SDKWrapper.getInstance().onBackPressed();
super.onBackPressed();
}

@Override
public void onConfigurationChanged(Configuration newConfig) {
SDKWrapper.getInstance().onConfigurationChanged(newConfig);
super.onConfigurationChanged(newConfig);
}

@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
SDKWrapper.getInstance().onRestoreInstanceState(savedInstanceState);
super.onRestoreInstanceState(savedInstanceState);
}

@Override
protected void onSaveInstanceState(Bundle outState) {
SDKWrapper.getInstance().onSaveInstanceState(outState);
super.onSaveInstanceState(outState);
}

@Override
protected void onStart() {
SDKWrapper.getInstance().onStart();
super.onStart();
}


/**
* 微信登录-唤起微信
*/
public static void wxLogin(){
if (!api.isWXAppInstalled()) {
Toast.makeText(act, "您还未安装微信客户端", Toast.LENGTH_SHORT).show();
}else{
SendAuth.Req req=new SendAuth.Req();
req.scope="snsapi_userinfo";
req.state="wx_login";
api.sendReq(req);
}
}

public static void calljs(final String code){
act.runOnGLThread(new Runnable() {
@Override
public void run() {
final String jvCallCode =String.format("cc.jsEngineCallback(\"%s\")",code);
Cocos2dxJavascriptJavaBridge.evalString(jvCallCode);
}
});
}
}

cocos登陆页面调用,微信登陆。

1
2
3
4
5
6
7
8
9
10
11
12
13
wxChatLogin(){
if(cc.sys.OS_ANDROID == cc.sys.os){//安卓
jsb.reflection.callStaticMethod("org/cocos2dx/javascript/AppActivity", "wxLogin", "()V");
}else if(cc.sys.OS_IOS == cc.sys.os){//苹果
jsb.reflection.callStaticMethod("AppController", "wxSendAuth");
}else{
cc.hud.show(1.5,'非移动客户端暂不支持微信登陆');
}
//响应过后传递过来的值
cc.jsEngineCallback = function(wxCode){
this.getWXCodeSuceess(wxCode);
}.bind(this);
},

这儿微信登陆需要真机调试,为了方便直接打包debug和release使用之前生成keystore。

上面的密码改成生成 keystore时的密码,然后再调试运行在手机上。

这儿如果有什么问题可以直接企鹅上留言: 1197696574 交流。