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了