admin管理员组文章数量:1656604
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.connectmon.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/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/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/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了
版权声明:本文标题:cocos creator利用原生平台实现qq登录功能 --安卓篇 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://www.elefans.com/xitong/1729740934a1211669.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论