Cocos creator & Java 微信登录/微信分享
(仅能用于cocos creator;cocos2d-js与此有细微差别)
前期准备
开发者资质
release签名 签名打包才能测试
第一步导入微信SDK build.gradle compile ‘com.tencent.mm.opensdk:wechat-sdk-android-with-mta:+’
第二步配置AndroidManifest.xml
第三步创建WXEntryActivity 接收回调,一定要创建在包名下且添加wxapi路径,如下:
WXEntryActivity 要继承自Activity,且扩展接口IWXAPIEventHandler 如下:
实现如下方法:
private static final String TAG = “WXEntryActivity”;
private static final int TIMELINE_SUPPORTED_VERSION = 0x21020001;
// IWXAPI 是第三方app和微信通信的openapi接口
private IWXAPI api;
private static final String APP_ID = "wxc8f32ff40f44a007";
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 通过WXAPIFactory工厂,获取IWXAPI的实例
api = WXAPIFactory.createWXAPI(this, WXEntryActivity.APP_ID, false);
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 baseResp) {
Log.e( "onResp","" + baseResp.errCode);
// 登录授权
if (baseResp instanceof SendAuth.Resp) {
SendAuth.Resp sendAuthResp = (SendAuth.Resp) baseResp;
if(sendAuthResp.errCode == BaseResp.ErrCode.ERR_OK)
{
String code = ((SendAuth.Resp) baseResp).code;
Log.i("wxentry","code = " + code);
PlatformSystem.onWXLoginCode(code);
}
}
// 分享 / 发消息
else if (baseResp instanceof SendMessageToWX.Resp) {
SendMessageToWX.Resp sendMessageResp = (SendMessageToWX.Resp) baseResp;
PlatformSystem.onWXShareCallback(sendMessageResp.errCode, sendMessageResp.openId);
}
finish();
}
这里的APP_ID可以随便填写,但是最好填写和项目一致的APP_ID
第四步创建管理类PlatformSystem 用于JS与JAVA交互,交互教程详见官网,实现代码如下:
public class PlatformSystem extends AppActivity{
// 微信登录
public static void wechatLoginWithAppID(String appid){
if (appid == null || appid.length() == 0) return;
IWXAPI api = WXAPIFactory.createWXAPI(PlatformSystem.getContext(), appid);
api.registerApp(appid);
SendAuth.Req req = new SendAuth.Req();
req.scope = "snsapi_userinfo";//获取个人用户信息的权限
req.state = "1234353645645";//防止攻击 这里最好是一组随机数
api.sendReq(req);//向微信发送请求
}
// 微信分享 当前功能分享网页
public static void wechatShareWithContent(String appid,String url, String title, String content,String scene){
final IWXAPI api = WXAPIFactory.createWXAPI(PlatformSystem.getContext(), appid);
api.registerApp(appid);
WXWebpageObject webpage = new WXWebpageObject();
webpage.webpageUrl = url;
WXMediaMessage msg = new WXMediaMessage(webpage);
msg.title = title;
msg.description = content;
// 图标
Bitmap bitmap = BitmapFactory.decodeResource(PlatformSystem.getContext().getResources(), R.mipmap.ic_launcher);
Bitmap thumbBmp = Bitmap.createScaledBitmap(bitmap, 80, 80, true);
bitmap.recycle();
// 位图转数组
ByteArrayOutputStream stream = new ByteArrayOutputStream();
thumbBmp.compress(Bitmap.CompressFormat.PNG, 100, stream);
byte[] byteArray = stream.toByteArray();
msg.thumbData = byteArray;
SendMessageToWX.Req req = new SendMessageToWX.Req();
req.transaction = buildTransaction("webpage");
req.message = msg;
req.scene = Integer.parseInt(scene);
// 调用api接口发送数据到微信
api.sendReq(req);
}
public static String buildTransaction(String type) {
return (type == null) ? String.valueOf(System.currentTimeMillis()) : type + System.currentTimeMillis();
}
// 登录回调
public static void onWXLoginCode(final String code) {
// 一定要在GL线程中执行
// ((Cocos2dxActivity)Cocos2dxActivity.getContext()).runOnGLThread(new Runnable() {
((Cocos2dxActivity)Cocos2dxActivity.getContext()).runOnGLThread(new Runnable() {
@Override
public void run() {
Cocos2dxJavascriptJavaBridge.evalString("cc.native.wechatLoginCallBack && cc.native.wechatLoginCallBack('" + code + "') ");
Log.e( "onWXLoginCode","我来了,大宝贝");
// Cocos2dxJavascriptJavaBridge.evalString(“cc.eventManager.dispatchCustomEvent(‘change_color’);”);
}
});
}
// 分享回调
public static void onWXShareCallback(final int errCode, final String openId) {
// 一定要在GL线程中执行
((Cocos2dxActivity)Cocos2dxActivity.getContext()).runOnGLThread(new Runnable() {
@Override
public void run() {
Cocos2dxJavascriptJavaBridge.evalString("cc.native.wechatShareCallBack && cc.native.wechatShareCallBack(" + errCode + ",'" + openId + "') ");
}
});
}
第五步实现真机/模拟器调试,只需要将debug签名文件配置改成release签名文件配置即可,如下:
第六步js端创建Native.js,代码如下:
在需要调用的地方直接cc.native. + 方法名称。
最后cocos构建,as真机运行,成功。
其他第三方类库也可以参照此流程接入。
我们还可以做成as-module更方便。开发的其他应用直接就可以调用类库。
网友评论