Cocos Creator通过Android Studio接入微信SDK登录和分享

第一步:在App下的build.gradle中的dependencies中添加一句:

implementation 'com.tencent.mm.opensdk:wechat-sdk-android-with-mta:+'

记得添加混淆,不然我在分享的时候可以拉起分享弹窗但是选择好友后就是分享不出去,后来发现是因为混淆的原因,在proguard-rules文件中加入:

-keep class com.tencent.mm.opensdk.** {
    *;
}

-keep class com.tencent.wxop.** {
    *;
}

-keep class com.tencent.mm.sdk.** {
    *;
}

因为我的项目在creator中编译过程中会有:某些输入文件使用或覆盖了已过时的 API...的报红,所以在这里写一下解决方法:内层gradle最外面添加:

allprojects { gradle.projectsEvaluated { tasks.withType(JavaCompile) { options.compilerArgs << "-Xlint:unchecked" << "-Xlint:deprecation" } }}

然后在AppActivity脚本中写一个注册方法:

private void registerToWX(){
    mWXapi= WXAPIFactory.createWXAPI(this,WX_APP_ID,false);
    mWXapi.registerApp(WX_APP_ID);
}

在onCreate方法中调用一下;因为要在creator中按授权按钮授权,所以要写一个接收creator事件然后执行登录的方法:

public static  void StartAuthReq(){
    Log.v("******","收到cocos授权请求");
    final SendAuth.Req req=new SendAuth.Req();
    req.scope="snsapi_userinfo";
    req.state="wx_login";
    mWXapi.sendReq(req);
}

没有参数,cocos中调用的方式: 

jsb.reflection.callStaticMethod("org/cocos2dx/javascript/AppActivity","StartAuthReq","()V");

AndroidManifest中配置一下权限:












这时已经可以拉起授权界面了,接下来要可以接收授权的信息,首先要先确定在creator中构建时候的包名:xx.xx.xx

然后在项目src处右击:new>package,在弹出的窗口直接填上包名:xx.xx.xx,然后在这个新的package上右击,新建一个package叫:wxapi(固定的),然后在wxapi下new>javaClass,新建一个脚本名字叫:WXEntryActivity(固定的),然后把这个新类的class改成:

public class WXEntryActivity extends Activity implements IWXAPIEventHandler {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        AppActivity.mWXapi.handleIntent(getIntent(),this);
    }

    @Override
    public void onReq(BaseReq baseReq) {

    }

    @Override
    public void onResp(BaseResp baseResp) {
        Log.v("******", "onResp AS 微信回复应用: " + baseResp.errStr);
        Log.v("******", "onResp: 错误码" + baseResp.errCode);
        //ERR_OK = 0(用户同意) ERR_AUTH_DENIED = -4(用户拒绝授权) ERR_USER_CANCEL = -2(用户取消)
        switch (baseResp.errCode) {
            case BaseResp.ErrCode.ERR_AUTH_DENIED:

                finish();
                break;
            case BaseResp.ErrCode.ERR_USER_CANCEL:

                finish();
                break;
            case BaseResp.ErrCode.ERR_OK:
                //用户同意授权。
                final String code = ((SendAuth.Resp) baseResp).code;
                Log.v("******成功拿到了CODE:", "code: " + code);

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

                    }
                }).start();
                break;
        }
        finish();
    }
}

这里首先是要在onCreate中加入一句:

AppActivity.mWXapi.handleIntent(getIntent(),this);

还要实现IWXAPIEventHandler的两个接口,实际上这个时候已经可以通过打印的地方获取到code了,然后我又因为需要把code传回creator上传给服务器,所以要写java给js的通讯:

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

要写runOnGLThread,不然直接写代码的话调用完会闪退,然后creator那边接收的代码是:

cc.AndroidResp=function(asrespDt=null){

    if(asrespDt){

        console.log("******,这里是安卓回调中心,参数是:",asrespDt);      

    }else {

        console.log("******,这里是安卓回调中心,没有参数");  

    }}

 

再在androidManifest中配置一下后面新建的Activity:



    >

至此,微信授权登录应该是OK的了,如果签名不对的话就百度搜一下获取签名的方式和微信开发者网站配置一下这个app的签名。点击授权但是一直没反应,studio又可以收到消息的情况下,检查Appid是否正确,

 

 

接下来是分享,我这里暂时需求是分享小程序,因为要从creator带参数过来,所以studio函数有点不同:

public  static   void  ShareMgr(int type,int sharePos,String shareingId){
    if(type==1){
        WXMiniProgramObject miniProgramObj = new WXMiniProgramObject();
        miniProgramObj.webpageUrl = "xxxxx"; // 兼容低版本的网页链接
        miniProgramObj.miniprogramType = WXMiniProgramObject.MINIPTOGRAM_TYPE_RELEASE;// 正式版:0,测试版:1,体验版:2
        miniProgramObj.userName = "xxxx";     // 小程序原始id
        miniProgramObj.path = "pages/index/index?"+"shareId="+shareingId+"&sharePos="+sharePos;            //小程序页面路径;对于小游戏,可以只传入 query 部分,来实现传参效果,如:传入 "?foo=bar"
        WXMediaMessage msg = new WXMediaMessage(miniProgramObj);
        msg.title = "xxx";                    // 小程序消息title
        msg.description = "xxx";               // 小程序消息desc

        Bitmap bmp = BitmapFactory.decodeResource(getContext().getResources(), R.drawable.icon);
        Bitmap thumbBmp=Bitmap.createScaledBitmap(bmp,100,100,true);
        msg.thumbData= Util.bmpToByteArray(thumbBmp,true);  // 小程序消息封面图片,小于128k

        SendMessageToWX.Req req = new SendMessageToWX.Req();
        req.transaction = buildTransaction("miniProgram");
        req.message = msg;
        req.scene = SendMessageToWX.Req.WXSceneSession;  // 目前只支持会话
        mWXapi.sendReq(req);
    }else if(type==2){
        WXWebpageObject webpageObject = new WXWebpageObject();
        webpageObject.webpageUrl = "https://orchard.shuyouai.com";
        WXMediaMessage msg = new WXMediaMessage(webpageObject);
        msg.title = "你好,sss";
        msg.description = "这是测试的运用应用";
        Bitmap thumb = BitmapFactory.decodeResource(getContext().getResources(), R.mipmap.ic_launcher);
        msg.thumbData = bmpToByteArray(thumb, true);
        SendMessageToWX.Req req = new SendMessageToWX.Req();
        req.transaction = buildTransaction("Req");
        req.message = msg;
        switch (type) {
            case 1:
                req.scene = SendMessageToWX.Req.WXSceneSession;
                break;
            case 2:
                req.scene = SendMessageToWX.Req.WXSceneSession;
                break;
        }
        mWXapi.sendReq(req);
    }

}
这里还需要两个方法:
private static String buildTransaction(final String type) {
    return (type == null) ? String.valueOf(System.currentTimeMillis()) : type + System.currentTimeMillis();
}

新建一个class叫Util,里面放入:

public static byte[] bmpToByteArray(final Bitmap bmp, final boolean needRecycle) {
    ByteArrayOutputStream output = new ByteArrayOutputStream();
    bmp.compress(Bitmap.CompressFormat.PNG, 100, output);
    if (needRecycle) {
        bmp.recycle();
    }
    byte[] result = output.toByteArray();
    try {
        output.close();
    } catch (Exception e) {
        e.printStackTrace();
    }
    return result;
},

这里分享的图片是在res文件夹下新建一个drawable(图片是固定的这个),然后在里面放上图片,读取就R.drawable.xxx

注意还有creator调用Android带参数的写法:

 jsb.reflection.callStaticMethod("org/cocos2dx/javascript/AppActivity","StartAuthReq","(IILjava/lang/String;)V",type,sharePos,shareingId);

暂时就这么多,不够的再补充

 

你可能感兴趣的:(Cocos Creator通过Android Studio接入微信SDK登录和分享)