Cocos Creator微信登录接入(完全小白教程)(安卓篇)_cocos creator 微信登录_奔跑的大象的博客-程序员秘密

技术标签: android  Cocos Creator 笔记  

1:创建 Creator项目,如下

 

2.创建完成后,项目工程图如下

 

3.assets目录创建Login场景,创建TS目录,创建TSSDKTool.ts,Login.ts,如下图

 

4. TSSDKTool.ts脚本内容如下:

export class TSSDKTool {
    public static isAndroid = cc.sys.isNative && cc.sys.os === cc.sys.OS_ANDROID
    public static isIOS = cc.sys.isNative && cc.sys.os === cc.sys.OS_IOS

    /**
     * 调取native微信授权
    */
    public static wxLogin() {
        console.log("wxLogin");
        if (this.isAndroid) {
            //调用Java代码进行微信登录
            jsb.reflection.callStaticMethod("org/cocos2dx/javascript/AppActivity", "weixin_login", "(Ljava/lang/String;)V","weixin_login");
        }
    }

    /**
     * 接收native微信授权的code
     * @param errCode 
     */
    public static wxLoginResult(errCode) {
        console.log("wxLoginResultcode=" + errCode)
        if (this.isAndroid) {

        }
    }
}
cc["TSSDKTool"] = TSSDKTool;

 

5.Login.ts脚本内容如下:

// Learn TypeScript:
//  - [Chinese] https://docs.cocos.com/creator/manual/zh/scripting/typescript.html
//  - [English] http://www.cocos2d-x.org/docs/creator/manual/en/scripting/typescript.html
// Learn Attribute:
//  - [Chinese] https://docs.cocos.com/creator/manual/zh/scripting/reference/attributes.html
//  - [English] http://www.cocos2d-x.org/docs/creator/manual/en/scripting/reference/attributes.html
// Learn life-cycle callbacks:
//  - [Chinese] https://docs.cocos.com/creator/manual/zh/scripting/life-cycle-callbacks.html
//  - [English] http://www.cocos2d-x.org/docs/creator/manual/en/scripting/life-cycle-callbacks.html

import { TSSDKTool } from "./TSSDKTool";
const {ccclass, property} = cc._decorator;

@ccclass
export default class NewClass extends cc.Component {

    @property(cc.Label)
    label: cc.Label = null;

    @property
    text: string = 'hello';

    // LIFE-CYCLE CALLBACKS:

    onLoginWX(){
        TSSDKTool.wxLogin();
    }

    // onLoad () {}

    start () {

    }

    // update (dt) {}
}

 

6.Creator编辑中将Login.ts与微信登录按钮绑定,如下图:

 

7.构建项目(构建为Android项目)

7-1、Creator编辑器菜单栏->项目->构建发布...

7-2、相关设置如下图

备注:选项3中的包名需与微信开发平台申请的包名一致

执行构建,

7-3、构建完成

备注:构建完成后,不要关闭窗口,最后还要来编绎

7-4、构建完成后的项目位置

 

8、使用Android Studio打开项目

备注:后面的目录,文件,代码操作都在选项5目录中操作

 

9、打开build.gradle配置,翻最下面,添加微信配置:

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

如图:

 

10、编辑src\AndroidManifest.xml文件,添加代码

<!--微信授权登陆-->
        <activity
            android:name= ".wxapi.WXEntryActivity"
            android:label="@string/app_name"
            android:launchMode="singleTask"
            android:screenOrientation="portrait"
            android:theme="@android:style/Theme.Translucent"
            android:exported="true" />

完整内容如下

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.jh.bygs.fish"
    android:installLocation="auto">

    <uses-feature android:glEsVersion="0x00020000" />

    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>

    <application
        android:allowBackup="true"
        android:label="@string/app_name"
        android:icon="@mipmap/ic_launcher">
        
        <!-- Tell Cocos2dxActivity the name of our .so -->
        <meta-data android:name="android.app.lib_name"
                   android:value="cocos2djs" />
        
        <activity
            android:name="org.cocos2dx.javascript.AppActivity"
            android:screenOrientation="sensorLandscape"
            android:configChanges="orientation|keyboardHidden|screenSize"
            android:label="@string/app_name"
            android:usesCleartextTraffic="true"
            android:theme="@android:style/Theme.NoTitleBar.Fullscreen"
            android:launchMode="singleTask"
            android:taskAffinity="" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <!--微信授权登陆-->
        <activity
            android:name= ".wxapi.WXEntryActivity"
            android:label="@string/app_name"
            android:launchMode="singleTask"
            android:screenOrientation="portrait"
            android:theme="@android:style/Theme.Translucent"
            android:exported="true" />
    </application>
    
</manifest>

11、进入目录proj.android-studio\app\src\,准备创建微信API目录,举例你的包名为a.b.c.d,哪么就在src目录创建a\b\c\d\wxapi

备注:这里很不能错,错了微信回调就会失败,创建的目录必须与你在微信开发平台申请使用的包名一致。

 

12、wxapi目录(见步骤11)创建WXEntryActivity.java(必须是这个文件名)文件,文件内容如下:

备注:文件内容的第一行,修改为你的包名

package 您的包名.wxapi;
import android.app.Activity;

import android.os.Bundle;

import android.os.Message;

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 org.cocos2dx.javascript.AppActivity;
import android.util.Log;

import java.util.ArrayList;

public class WXEntryActivity extends Activity implements IWXAPIEventHandler
{
    public static int ReqState = -1;// 0为登录, 1为分享
    // private IWXAPIAPI;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.e("tt","wxEntryActivity onCreate");
        // 这句话很关键
        try {
            AppActivity.wx_api.handleIntent(getIntent(), this);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    @Override
    public void onReq(BaseReq baseReq) {
        System.out.println("Enter the onResp");
    }

    // 向微信发送的请求的响应信息回调该方法
    // @Override
    public void onResp(BaseResp baseResp)
    {
        System.out.println("Enter the onResp");
        if(baseResp.errCode == BaseResp.ErrCode.ERR_OK){
//            String code = ((SendAuth Resp) baseResp).code;
            String code = ((SendAuth.Resp) baseResp).code;
            System.out.println("==========code is ===========" + code);
            AppActivity.callJsFunction(code);
            finish();
        }
    }
}

 

13、进入目录app\src\org\cocos2dx\javascript,修改AppActivity.java文件,文件内容如下

备注1:第44行代码导入的包头修改为你的包名

备注2:第53行代码,将appid设置为微信开发申请的appid

/****************************************************************************
Copyright (c) 2015-2016 Chukong Technologies Inc.
Copyright (c) 2017-2018 Xiamen Yaji Software Co., Ltd.
 
http://www.cocos2d-x.org

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
****************************************************************************/
package org.cocos2dx.javascript;
//新增代码
import android.util.Log;

import org.cocos2dx.lib.Cocos2dxActivity;
import org.cocos2dx.lib.Cocos2dxGLSurfaceView;
//新增代码
import org.cocos2dx.lib.Cocos2dxJavascriptJavaBridge;

import android.os.Bundle;

import android.content.Intent;
import android.content.res.Configuration;

//新增代码
import com.tencent.mm.opensdk.modelmsg.SendAuth;
//新增代码
import com.tencent.mm.opensdk.openapi.IWXAPI;
//新增代码
import com.tencent.mm.opensdk.openapi.WXAPIFactory;
//新增代码
import static org.cocos2dx.lib.Cocos2dxHelper.getActivity;

//新增代码
import com.tencent.mm.opensdk.modelbase.BaseReq;
//新增代码
import com.tencent.mm.opensdk.modelbase.BaseResp;
//新增代码
import 您的包名.wxapi.WXEntryActivity;

//新增代码
import java.util.Timer;
//新增代码
import java.util.TimerTask;

public class AppActivity extends Cocos2dxActivity {

    //新增代码
    public static String wx_appid = "您的appid";
    public static IWXAPI wx_api;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //新增代码
        Log.e("tt","AppActivity onCreate");
        // Workaround in https://stackoverflow.com/questions/16283079/re-launch-of-activity-on-home-button-but-only-the-first-time/16447508
        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;
        }
        //新增代码
        weixin_Init();
        // DO OTHER INITIALIZATION BELOW
        SDKWrapper.getInstance().init(this);

    }

    //新增代码
    public static void weixin_Init() {
        wx_api = WXAPIFactory.createWXAPI(getActivity(),wx_appid,true);
        wx_api.registerApp(wx_appid);
    }

    //新增代码
    public static void weixin_login(String data) {
        Log.e("tt","AppActivity weixin_login");
        SendAuth.Req req =new SendAuth.Req();
        req.scope ="snsapi_userinfo";
        req.state = data;
        System.out.println("req is " + req);
        //利用微信api发送请求
        wx_api.sendReq(req);
    }

    //新增代码(回调函数)
    public static void callJsFunction(final String value) {
        System.out.println("Enter the callJsFunction" + value);
        final String exes = "cc.TSSDKTool.wxLoginResult(\""+ value + "\")";

//        app.runOnGLThread(new Runnable() {
//            @Override
//            public void run() {
//                Cocos2dxJavascriptJavaBridge.evalString(exes);//直接调用到js里面
//            }
//        });

        TimerTask task = new TimerTask(){
            public void run(){
                //execute the task
                Cocos2dxGLSurfaceView.getInstance().queueEvent(new Runnable() {
                    @Override
                    public void run() {
                        System.out.println("chenggong  ==  "+ exes);
                        Cocos2dxJavascriptJavaBridge.evalString(exes);
                    }
                });
            }
        };
        Timer timer = new Timer();
        timer.schedule(task, 500);
    }
    
    @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();
        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();
    }
}

 

14、回到Creator编辑器,执行编绎选项

 

15、编绎结束后,生成的apk在目录build\jsb-link\publish\android下。

16、至此结束 。

 

 

 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/zhaobangyu/article/details/106676296

智能推荐

弹孔 弹痕实现___AAAce的博客-程序员秘密

Spawn Decal At Location、Spawn Decal Attached在指定的位置生成一个材质贴上去产生随意旋转角度

【gcc/gdb】指令使用_-g -o2 会影响gdb吗_又秃又弱的博客-程序员秘密

GCC是GNU推出的功能强大、性能优越的多平台编译器,是GNU的代表作品之一。GCC可以针对多种硬件平台编译出可执行程序,其平均执行效率比一般编译器生成的程序要高20~30%。使用GCC由C语言源代码文件生成可执行文件的过程要经历四个相互关联的步骤:预处理、编译、汇编和链接。使用[-o filename]参数,可以在c程序编译后,输出可执行的文件名为filename;如果没有这个参数,GCC将使用缺省的可执行文件名a.out。

单片机--ad_da_jxm_96的博客-程序员秘密

ad_da.c#include "myhead.h"unsigned char AD_read(){ unsigned char temp; iic_start(); iic_send_byte(0x90); if(0 == ack) { return ERR; } iic_sen

xib中设置TableView的HeaderView_ideaspress的博客-程序员秘密

xib中设置TableView的HeaderView的步骤很简单,但是如果不了解的话,就得繁琐的写代码了,现将步骤即图片附上。首先在xib中拖一个UIVew进去,注意先拖入到与Controller的View并列处,如图: 然后将,这个View拖到File’s Ower 的那一并列层中,(按照箭头所指的方向拖拽即可)如图: 完成后图为: 接下来的一步不要忘记:把刚刚的UIView的Simulat

以太坊(6)智能合约开发之 Truffle、Ganache 安装基础使用- mac_xiliangMa的博客-程序员秘密

简单介绍下Truffle和Ganache:Truffle是目前最流行的以太坊开发框架,采用JavaScript编写,支持智能合约的编译、部署和测试;Ganache 是Truffle提供的可视化私有链工具;前提准备条件:   按照前面的文章,相信你已经搭建完成自己的私有链、或者私有链集群,nodejs等所有依赖的都已经安装好;安装Truffle:安装很简单,可以查看官网,下载可能比较慢可以配置国内的...

算术游戏C语言,10个有趣的算术游戏,让你立刻爱上数学!_weixin_39870155的博客-程序员秘密

原标题:10个有趣的算术游戏,让你立刻爱上数学! 数学到底哪里有趣了?数学之美究竟在哪里?今天让我们一起读一读matrix67大神的这篇文章,里面包含作者精心选择的10个老少咸宜的算术问题,以定理、趣题甚至未解之谜等各种形式带领大家窥探数学世界的一角。不少问题背后都蕴含了深刻的数学知识,触及到数学的各个领域。 希望大家能够喜欢上数学这门充满乐趣的学科。1数字黑洞6174任意选一个四位数(数字不能全...

随便推点

[MFC] 无边框窗口的Resize拖动效果的实现(下):子窗口覆盖,导致主窗口热点区无法响应WM_NCHITTEST_felicityWSH的博客-程序员秘密

http://blog.csdn.net/felicityWSH/article/details/68486466这篇博文讲解了如何实现无边框窗口的Resize拖动效果,文中提到,需要响应主窗口的WM_NCHITTEST消息,检测鼠标是否在resize热点区并返回HTTOPLEFT、HTBOTTOM等相应的结果。但是,如果子窗口覆盖了主窗口的热点区,当鼠标在热点区移动时,主窗口是无

uniappH5端解决跨域问题_blueSkyBoy2850的博客-程序员秘密

uniapp跨域主要是在浏览器中调试的时候会出现,在app和小程序端运行是不会的,以下的方法只适用在浏览器调试时出现跨域问题是解决。谢谢1.在我们的uniapp项目中的manifest.json中添加下面的代码"h5" : { "devServer": { "port": 8080, "di...

Shell入门知识_普通网友的博客-程序员秘密

Shell 简介Shell作为命令语言,它交互式地解释和执行用户输入的命令;作为程序设计语言,它定义了各种变量和参数,并提供了许多在高级语言中才具有的控制结构,包括循环和分支。常常作为批处理命令来使用,用来提高生产效率!入门下面是Shell的一段简单入门程序,我们在Linux上面使用vi test.sh然后将下面的代码打进去,运行sh test.sh 即可#!/bin/bash...

PAT团队程序设计天梯赛L1-035 情人节_码途迷离的博客-程序员秘密

L1-035 情人节 题目分析与代码示例(Java实现)

降维算法:主成分分析 VS 自动编码器_自编码器提取主成分_deephub的博客-程序员秘密

降维是一种减少特征空间维度以获得稳定的、统计上可靠的机器学习模型的技术。降维主要有两种途径:特征选择和特征变换。特征选择通过选择重要程度最高的若干特征,移除共性的或者重要程度较低的特征。特征转换也称为特征提取,试图将高维数据投影到低维空间。一些特征转换技术有主成分分析(PCA)、矩阵分解、自动编码器(Autoencoders)、t-Sne、UMAP等。本文主要介绍了主成分分析以及自动编码器两种方法,具体分析两者的优缺点,并且通过一个生动的示例进行详解。主成分分析主成分分析是一种无监督技术,将原始数

搭建一个node.js项目 前端测试工具入门 jest puppeteer Cypress mocha_tanghuan0827的博客-程序员秘密

mkdir okadaGocd okadaGocnpm init转载地址:https://www.jianshu.com/p/a6d430a00242

推荐文章

热门文章

相关标签