cocos creator利用原生平台实现qq登录功能 --安卓篇

cocos creator 实现qq登录需要调用安卓原生平台的静态方法:

首先在cocos creator端写好利用发射机制调用java静态方法:


//qq登录接口
    QQLogin : function(){
        this.resultString = '';
        this.isLoginSuccess = false;
        this.userInfoString = '';
        console.log("this.isLoginSuccess is " + this.isLoginSuccess);
        //如果是安卓系统的话进入相关方法
        if(cc.sys.isNative){
            //调用java静态方法实现qq登录
            this.resultString = jsb.reflection.callStaticMethod("org/cocos2dx/javascript/AppActivity", "doLogin","()Ljava/lang/String;");
            this.schedule(function(){
                //判断是否登录成功
                this.isLoginSuccess = jsb.reflection.callStaticMethod("org/cocos2dx/javascript/AppActivity", "isLoginSu","()Z");
                console.log("in schedule isLoginSuccess is " + this.isLoginSuccess);
                if(this.isLoginSuccess){
                    this.unscheduleAllCallbacks();
                    this.resultString = jsb.reflection.callStaticMethod("org/cocos2dx/javascript/AppActivity", "doLogin","()Ljava/lang/String;");
                    this.userInfoString = jsb.reflection.callStaticMethod("org/cocos2dx/javascript/AppActivity", "getQQInfo","()Ljava/lang/String;");
                    //获得qq登录成功后的字符串
                    console.log("resultString is " + this.resultString);
                    //显示用户信息
                    console.log("userInfoString is " + this.userInfoString);
                    console.log("typeof userInfoString is " + typeof(this.userInfoString));
                    var resultObject = JSON.parse(this.resultString);
                    if(resultObject != null){
                        //获得登录成功之后的openid
                        console.log("resultObject's openid is " + resultObject.openid);
                        //获得访问token
                        console.log("access_token is " + resultObject.access_token);
                        //切换场景
                    }
                    try{
                        var userInfoObject = JSON.parse(this.userInfoString);
                        if(userInfoObject != null){
                                //获得用户信息
                                console.log("userInfoObject is " + userInfoObject);
                                //存储头像地址
                                UserInfo.iconURL = userInfoObject.figureurl;
                                console.log("iconURL is " + UserInfo.iconURL);
                                //用户昵称
                                UserInfo.nickname = userInfoObject.nickname;
                                console.log("nickname is " + UserInfo.nickname);
                                //qq登录状态设置为true
                                UserInfo.qqLogin = true;
                                //加载头像
                                this.loadIcon();
                        }
                    }catch(e){
                        console.log("*********");
                        console.log("exception is " + e);
                    }
                    
                }
            //1秒执行一次
            }.bind(this),1);
            console.log("isLoginSuccess is " + this.isLoginSuccess);
        }else{
            alert("暂时不支持浏览器页面");
            return;
        }
    },
    //加载qq头像
    loadIcon : function(){
        var self = this;
            //如果qq登录成功的话进入该方法渲染头像
         if(UserInfo.qqLogin){
            //qq头像的可见性设置为true
           this.qqIcon.active = true;
           //qq昵称的可见性设置为true
           this.qqNickname.active = true;
           //qq头像url
           var iconUrl = UserInfo.iconURL;
           console.log("iconUrl is " + iconUrl);
           var nickname = UserInfo.nickname;
           console.log("nickname is " + nickname);
           this.qqNickname.getComponent(cc.Label).fontSize = 20;
           this.qqNickname.getComponent(cc.Label).string = nickname;
           //远程加载资源
           cc.loader.load({url:iconUrl,type:'jpg'},function(err,texture){
                var spriteFra = self.qqIcon.getComponent(cc.Sprite).spriteFrame;
                console.log("spriteRra is " + spriteFra);
                console.log("texture is " + texture);
                spriteFra.setTexture(texture);
           }.bind(this));
        }
    },

2:通过cocos creator打包后生成一个android studio工程,打开该工程,设置qq登录所需要的类或者是jar包:

  a:导入jar包:

  

 需要下面连个jar包这些jar包在qq登录demo都有我就不再这里上传了

b:添加相对应的manifests文件

 <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:theme="@android:style/Theme.NoTitleBar.Fullscreen" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity
            android:name="com.tencent.tauth.AuthActivity"
            android:noHistory="true"
            android:launchMode="singleTask">
            <intent-filter>
                <action android:name="android.intent.action.VIEW" />
                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="android.intent.category.BROWSABLE" />
                <data android:scheme="tencent1106774691" />
            </intent-filter>
        </activity>
        <activity
            android:name="com.tencent.connect.common.AssistActivity"
            android:screenOrientation="behind"
            android:theme="@android:style/Theme.Translucent.NoTitleBar"
            android:configChanges="orientation|keyboardHidden">
        </activity>
    </application>

 标红的是需要添加的activity用于qq登录授权的界面。

c: 在AppActivity类里面覆盖onActivityResult方法:

@Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (requestCode == Constants.REQUEST_LOGIN) {
            Tencent.onActivityResultData(requestCode,resultCode,data,listener);
        }
        super.onActivityResult(requestCode, resultCode, data);
        SDKWrapper.getInstance().onActivityResult(requestCode, resultCode, data);
    }

3:添加正式的登录方法,获取用户信息的方法:

public class AppActivity extends Cocos2dxActivity {
    //本游戏的activity
    public static AppActivity app;
    //appID
    public static String mAppid;
    //根据appid生成的腾讯实例
    public static Tencent mTencent = null;
    //需要传递给js端的字符串
    public static String message = null;
    //监听器用于腾讯登陆成功之后的回调
    public static IUiListener listener = null;
    //用于长连接的socket
    private static Socket mSocket;
    public static String userMessage = null;
    //用户信息
    public static UserInfo mInfo = null;
    public static boolean isLoginSuccess = false;
    static {
        try {
            mSocket = IO.socket("http://192.168.1.162:3000");
            System.out.println("连接成功");
        }catch (Exception e){

        }
    }
    private IntentFilter intentFilter;
    //获取网络状态
    public BroadcastReceiver br = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            ConnectivityManager connectivityManager= (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
            NetworkInfo networkInfo=connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
            NetworkInfo wifiinfo=connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
            if(!networkInfo.isConnected()&&!wifiinfo.isConnected()){

                /**
                 *
                 */
                Toast.makeText(context,"网络不可用!",Toast.LENGTH_SHORT).show();
                System.out.println("网络不可用");

            }else{
                if(wifiinfo.isConnected()){
                    Toast.makeText(context,"wifi连接中!",Toast.LENGTH_SHORT).show();
                    System.out.println("wifi连接中");
                }
                if(networkInfo.isConnected()){
                    Toast.makeText(context,"流量连接中!",Toast.LENGTH_SHORT).show();
                    System.out.println("流量使用中");
                }
            }

        }
    };
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // 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;
        }
        // DO OTHER INITIALIZATION BELOW
        SDKWrapper.getInstance().init(this);
        intentFilter = new IntentFilter();
        intentFilter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
        registerReceiver(br,intentFilter);
        //socket连接
        mSocket.connect();
        //初始化appid
        mAppid = "你申请的qq appId";
        //将当前activey赋值给app
        app = this;
        SDKWrapper.getInstance().init(this);
        //获取腾讯实例
        mTencent = Tencent.createInstance(mAppid,app);
        listener = new BaseUILi();
        System.out.println("listener is " + listener);
    }
    //定义一个监听类
    public static class BaseUILi implements IUiListener{
        public BaseUILi(){

        }
        @Override
        public void onComplete(Object o){
            //只有在登录成功之后才能顺利获取用户信息,用到了这个object o对象
            System.out.println("授权成功");
            System.out.println("o is " + o);
            JSONObject obj = (JSONObject)o;
            AppActivity.isLoginSuccess = true;
            //对mTencent对象做相应的设置使其具有相应的openid,access_token等信息
            initOpenidAndToken(obj);
            System.out.println("obj is " + obj);
            message = obj.toString();
            System.out.println("message is " + message);
            //获取用户信息
            getUserInfo();

        }
        //设置token及openid信息
        private void initOpenidAndToken(JSONObject jsonObject) {
            try {
                String openid = jsonObject.getString("openid");
                String token = jsonObject.getString("access_token");
                String expires = jsonObject.getString("expires_in");
                //使mTencent对象具有token信息和opendid信息  关键一步
                mTencent.setAccessToken(token, expires);
                //设置openid信息
                mTencent.setOpenId(openid);

            } catch (JSONException e) {
                e.printStackTrace();
            }
        }
        private void getUserInfo() {

            //sdk给我们提供了一个类UserInfo,这个类中封装了QQ用户的一些信息,我么可以通过这个类拿到这些信息
            QQToken mQQToken = mTencent.getQQToken();
            //UserInfo的时候将当前activity传递进去和qqtoken也传递进去
            UserInfo userInfo = new UserInfo(app, mQQToken);
            //获得用户信息
            userInfo.getUserInfo(new IUiListener() {
                                     @Override
                                     public void onComplete(final Object o) {
                                         System.out.println("********************************@@@@@@@@@@@@@@@@@@@@@@@@@@@@");
                                         System.out.println("已经进入userInfo方法");
                                         JSONObject userInfoJson = (JSONObject) o;
                                         userMessage = userInfoJson.toString();
                                         System.out.println("userInfoJson is " + userInfoJson);
                                         System.out.println("哈哈哈哈哈哈");
                                         Message msgNick = new Message();
                                         msgNick.what = 0;//昵称
                                         try {
                                             msgNick.obj = userInfoJson.getString("nickname");//直接传递一个昵称的内容过去

                                         } catch (JSONException e) {
                                             e.printStackTrace();
                                         }

                                     }

                                     @Override
                                     public void onError(UiError uiError) {

                                     }

                                     @Override
                                     public void onCancel() {
                                     }
                                 }
            );
        }
        @Override
        public void onError(UiError uiError) {
                    System.out.println("-------------> error");
        }

        @Override
        public void onCancel() {
                    System.out.println("-------------> 用户已经取消");
        }
    }
    public static boolean isLoginSu(){
        System.out.println("in isLoginSu isLoginSuccess is " + AppActivity.isLoginSuccess);
        return AppActivity.isLoginSuccess;
    }
    //qq登录方法
    public static String doLogin(){
        //异步操作
        mTencent.login(AppActivity.app,"all",listener);

        System.out.println("in dologin function message is " + message);
        System.out.println("userMessage is " + userMessage);
        System.out.println("in doLogin function isLoginSuccess is " + isLoginSu());
        if(message != null){
            return message;
        }else{
            return "";
        }
    }
    public static String getQQInfo(){

        return userMessage;
    }
    @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);

        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) {
        if (requestCode == Constants.REQUEST_LOGIN) {
            Tencent.onActivityResultData(requestCode,resultCode,data,listener);
        }
        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();
    }
}

/** 商户私钥,pkcs8格式 */ /** 如下私钥,RSA2_PRIVATE 或者 RSA_PRIVATE 只需要填入一个 */ /** 如果商户两个都设置了,优先使用 RSA2_PRIVATE */ /** RSA2_PRIVATE 可以保证商户交易在更加安全的环境下进行,建议使用 RSA2_PRIVATE */ /** 获取 RSA2_PRIVATE,建议使用支付宝提供的公私钥生成工具生成, */ /** 工具地址:https://doc.open.alipay.com/docs/doc.htm?treeId=291&articleId=106097&docType=1 */ public static final String RSA2_PRIVATE = "MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCDIlVznW8S+hP8aZzF1oLZ1IOiLwYKgv5zpEQvzbxwG7uRXndhOFm8MxwlhymQ5GAquuRbabIb9n1dJouo7ZnHhCashOoJRe0xaFJnb7u2VaO4ixayO3wuqMS+l+ea0xbwA4VvdIs7los6449sLO8xyUa1CwKusdiIOdypUi2I2ocMWG6kjpysGmNEQPxz5IeImgGW8GJSUgsKM8AImSwXaoi8WZUPAq9yc2rwX7GZLdbPYe0qaqwPfYVKzBIMgSBJjAZMp4g3rj8FQDCW6V0SXYQMUrlyBwuOmi1mqjbIwkO5r7efwkA5D3D6ZYbN4zsq6lPK2eNkGSeX71j7Lf5hAgMBAAECggEAbzYC+lYeCR4FLR/0UOQnfM16BWWT3f5SBYjeOxxkHz+lxxcyb0T29WDzEfCbE8JavGJboBr3bjeRAhrafp1iuY4drlnakZq4Ghq7J/XeYDgo7S0oRmekXX3LvUfep7M11L9nvqo8GoEF+x9aVweUo8hrKsb3s2golv9bYE3NSC2srlmBcxBVnVumUzewwC1nI7sCKyYjMPBGiNiE5o9Djv4L1l1zKx/FgV87cC8eH4pJn8u7yj6BJ8U0WjG+XRuj6MbfupaJSYOrOVFAfhCWdMcMaqOoL4o0NCYX1JmQ/tLByZjHxhx65E7KwT9w4imXdJsJ85YEN8U/pKdQBgYVAQKBgQDoIvkcMTG8PSwhUfUtyM1MRt1M744ss6vUBlgfCH5EB7VLhjnezlkMQNAFvRP9VtHvm0YLhGCtyZwOVk9hqZ+ZoJYtCIuKFYw64CN/i79H5Lber85F8Dm16WLmzo6goieMx+1nMT+ZCJGs999bEXT1egSn0exC3sk6tG6Yd9WCWQKBgQCQnVOt2VSxf/eLcdEo2piWuegC8gkspsuLTJmNgx3c7EV8M2jdu3swHO0pLZKR+oEA5TFwdiUPi0qEY4lhaIciOrxdIzZW5kA1pTrJsqthFBcQI3VP6nBU+KWr/KP4pKSyk4cFEIweS9fOu31o4Ki+AeCJw/plTFICi+I6zgILSQKBgQCGCROPfLQ7/ZJKlvkbe5NW1KAZOUT9eKzhWtxs5smJXG4I8rLdfIYcNhwnBBrTr9q+IAjcw43TKtMJ0Do7qOZ3nSq5S/LOQ0zZ/ethTP6gc2ZHxHk1FtUrvVuW63OdOqPdfN8OM3iGU1VR6zmzaqv+xXqEsAhcQCku1Vn6fU7x2QKBgHvrxQwBYxjjPl3ov0HR59WpIs57Vy9DEsKgdiiUhZ+Ne5GNgDwZbttwvi1+Fs4uqiL5Q19KbkGeq9E8djnZV4sWZ9kr1mGq1rThjLnP+BmtHIJA0EMV8wJtO5JgYKYtd9BqqNXHMzq25QwLD9EySobfluiW3le1icUS115qr8e5AoGAc0EJ/DSoIrbRrgbC6aJ53xZD50Qv0ssxBpquHdJ7vdJX50xqmxNK+Qp4Q2Q2dCLgJpmjGeU+AWm8agiLRiE1VYoNpIBn0kDg+NPcC1bwUKcYNd8amnDLHx5NJz9B4iwTGFVLOjY+DuvXUI6L1PDiHj6IlcCfvlAVveEb9WTilMA="; public static final String RSA_PRIVATE = ""; private static final int SDK_PAY_FLAG = 1; private static final int SDK_AUTH_FLAG = 2; /* * * 支付宝业务数据声明结束 * * */ /** * * qq登录业务数据开始 * * */ public static String mAppid; //根据appid生成的腾讯实例 public static Tencent mTencent = null; //需要传递给js端的字符串 public static String message = null; //监听器用于腾讯登陆成功之后的回调 public static IUiListener listener = null; public static String userMessage = null; //用户信息 public static UserInfo mInfo = null; public static boolean isLoginSuccess = false; /** * * qq登录业务数据结束 * * */ @Override protected void onCreate(Bundle savedInstanceState) { EnvUtils.setEnv(EnvUtils.EnvEnum.SANDBOX); super.onCreate(savedInstanceState); // 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; } // DO OTHER INITIALIZATION BELOW SDKWrapper.getInstance().init(this); //初始化appid mAppid = "1106774691"; //静态变量指向自己当前的Activity app = this; //创建一个腾讯实例 mTencent = Tencent.createInstance(mAppid,app); listener = new BaseUILi(); System.out.println("listener is " + listener); }4:做完这些就可以正常登录qq了
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值