CocosCreator安卓微信SDK&JS与JAVA交互

2020-12-28  本文已影响0人  程序猿TODO

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更方便。开发的其他应用直接就可以调用类库。

上一篇下一篇

猜你喜欢

热点阅读