U8SDK——LayaAir中接入U8SDK
随着H5游戏和微信小游戏越来越火, 使用H5游戏引擎来开发的游戏会越来越多,H5游戏不仅仅可以作为纯H5来运行,也可以打包成app包来运行。如果你希望打包成游戏app包,分发到国内各大渠道平台, 那么你可能就会使用U8SDK这样的聚合SDK产品。那么这篇博客,我们就来为同学们分享一下如何在Layabox(LayaAir)中接入U8SDK Android平台api接口。
Layabox中和Android平台api相互调用 也就是js和android平台之间的相互调用。之前有使用过U8SDK的同学可能知道, 每种游戏引擎,比如U3D,Cocos2dx,flash等,我们都会建立一个中间工程, 用来和具体的游戏引擎进行调用和交互。那么Laybox中呢?
Laybox为我们已经封装好了一套渠道SDK调用接口, 我们只需要在android层实现他对应的接口即可。这些接口,可以参考他这篇文档:【LayaAir渠道SDK Api接口】
我们先在LayaAir IDE中建立一个demo工程, 增加一个界面, 界面上有一个登录状态, 和两个按钮,一个点击调用渠道SDK的登录, 一个点击调用SDK的支付。
对应代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 |
public class TestView extends TestPageUI { public static var self:TestView; public function TestView() { //btn是编辑器界面设定的,代码里面能直接使用,并且有代码提示 loginBtn.on(Event.CLICK, this, onLoginBtnClick); payBtn.on(Event.CLICK, this, onPayBtnClick); lblAccount.text = "未登录"; self = this; } private function onLoginBtnClick(e:Event):void { //调用登录api Laya.conchMarket.login("", onLoginSucCallback); } private function onPayBtnClick(e:Event):void { //调用支付api var data:U8PayParams = new U8PayParams(); data.buyNum = 1; data.coinNum = 100; data.extension = "111"; data.price = 100; data.productId = "1"; data.productName = "元宝"; data.productDesc = "购买100元宝"; data.roleId = "1"; data.roleLevel = 1; data.roleName = "测试角色名"; data.serverId = 10; data.serverName = "测试"; data.vip = "vip1"; data.payNotifyUrl = "http://www.uustory.com"; Laya.conchMarket.recharge(JSON.stringify(data), onPaySucCallback); } private function submitGameData(dataType:int):void { var data:U8ExtraGameData = new U8ExtraGameData(); data.dataType = dataType; data.roleID = "1"; data.roleName = "test1"; data.roleLevel = "1"; data.serverID = 1; data.serverName = "server1"; data.moneyNum = 100; data.roleCreateTime = "3121453412"; data.roleLevelUpTime = "0"; Laya.conchMarket.sendMessageToPlatform(JSON.stringify(data), onSendMsgCallback); } public function onLoginSucCallback(data:String):void { console.log(data); //登录成功回调 var result:U8LoginResult = U8LoginResult(JSON.parse(data)); self.lblAccount.text = "登录成功:"+result.username; //创建角色成功, 进入游戏, 角色升级, 退出游戏等几个地方, 都需要调用submitGameData() self.submitGameData(U8ExtraGameData.TYPE_ENTER_GAME); } private function onPaySucCallback(data:String):void { console.log(data); } private function onSendMsgCallback(data:String):void{ //nothing to do } } } |
如上面代码所示, 我们在点击登录的时候, 调用Laya.conchMarket.login方法, 该方面就是Layabox为我们封装好的登录接口。支付接口也是一样。可以看到,接口很简单。接口参数的传递,统一采用json格式。
游戏层的接口我们调用之后, 最终是调用到Android平台中的原生代码, Layabox IDE中,我们点击app构建, 生成一个Android Studio工程。 默认, 这个渠道SDK相关接口的实现,他是让我们写在layaair.game.Market.MarketTest类中, 该类实现了LayaPlatformInterface接口。那么我们这里也直接在该类中,将默认的实现,改为调用U8SDK对应的api接口。
U8SDK框架API接口,请看这篇文档:【U8SDK Api接入文档】
首先我们将u8sdk抽象层框架的jar包u8sdk3.jar拷贝到as工程的libs下面, 右键, 添加到依赖中。紧接着我们就可以编写代码了。
MarketTest里面预定义的接口很多, 不是每个都需要的。 只需要在如下几个函数中调用u8sdk对应的接口api即可。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 |
@Override public void LP_Init(final Context activity) { Log.d(TAG,">>>>>>>>>>>>>>>>MarketLaya init ok"); context = activity; LayaPlatformCallback.GetInstance().LP_InitCallback( 0 ); Log.d("U8SDK", "LP_onCreate called"); U8Platform.getInstance().init((Activity) activity, new U8InitListener() { @Override public void onInitResult(int i, String s) { Log.d("U8SDK", "init result. code:"+i+";msg:"+s); //LayaPlatformCallback.GetInstance().LP_InitCallback( 0 ); } @Override public void onLoginResult(int code, UToken authResult) { if(code == U8Code.CODE_LOGIN_SUCCESS){ if(authResult == null || !authResult.isSuc()){ Toast.makeText(context,"SDK登录认证失败,确认U8Server是否配置", Toast.LENGTH_SHORT).show(); return; } JSONObject json = new JSONObject(); try{ json.put("isSwitchAccount", "false"); json.put("userID", authResult.getUserID()); json.put("sdkUserID", authResult.getSdkUserID()); json.put("username", authResult.getUsername()); json.put("sdkUsername", authResult.getSdkUsername()); json.put("token", authResult.getToken()); }catch(Exception e){ e.printStackTrace(); } LayaPlatformCallback.GetInstance().LP_LoginCallback( json.toString()); } } @Override public void onSwitchAccount(UToken authResult) { JSONObject json = new JSONObject(); try{ json.put("isSwitchAccount", "true"); json.put("userID", authResult.getUserID()); json.put("sdkUserID", authResult.getSdkUserID()); json.put("username", authResult.getUsername()); json.put("sdkUsername", authResult.getSdkUsername()); json.put("token", authResult.getToken()); }catch(Exception e){ e.printStackTrace(); } LayaPlatformCallback.GetInstance().LP_LoginCallback( json.toString()); } @Override public void onLogout() { LayaPlatformCallback.GetInstance().LP_onLogoutCallback(""); } @Override public void onPayResult(int code, String s) { if(code == U8Code.CODE_PAY_SUCCESS){ Toast.makeText(context, "支付成功", Toast.LENGTH_SHORT).show(); LayaPlatformCallback.GetInstance().LP_onRechargeCallback("1"); }else{ LayaPlatformCallback.GetInstance().LP_onRechargeCallback("0"); } } @Override public void onSinglePayResult(int i, U8Order u8Order) { //无需实现 } @Override public void onProductQueryResult(List<ProductQueryResult> list) { //无需实现 } @Override public void onDestroy() { //无特殊需要,无需实现 } @Override public void onResult(int code, String msg) { Log.d("U8SDK", "code:"+code+";msg:"+msg); //无特殊需要, 无需实现 } }); } @Override public void LP_Login(final String jsonParam) { Log.d(TAG,">>>>>>>>>>>>> plugin LP_Login param = "+jsonParam); Log.d("U8SDK", "LP_Login called"); U8Platform.getInstance().login((Activity)context); } @Override public void LP_SwitchUser(final String jsonParam) { Log.d("U8SDK", "LP_SwitchUser called"); U8Platform.getInstance().switchAccount(); } @Override public void LP_Logout(final String jsonParam) { Log.d(TAG, ">>>>>LP_Logout jsonParam= " + jsonParam); Log.d("U8SDK", "LP_Logout called"); U8Platform.getInstance().logout(); } @Override public void LP_sendMessageToPlatform(final String jsonParam) { Log.d("U8SDK", "LP_sendMessageToPlatform called"); UserExtraData data = parseGameData(jsonParam); U8Platform.getInstance().submitExtraData(data); } @Override public void LP_Recharge(final String jsonParam) { Log.d("U8SDK","LP_recharge called."+jsonParam); PayParams payParams = parsePayParams(jsonParam); U8Platform.getInstance().pay((Activity)context, payParams); } |
上面这些接口从上到下, 分别调用了U8SDK的初始化,登录,切换帐号,登出, 提交游戏扩展数据,支付接口。同时,在登录回调中, 将登录结果回调给游戏层。游戏层收到登录回调结果,展示在界面上面。
接下来,我们需要在游戏主Activity的生命周期函数中,调用U8SDK中对应的生命周期函数。 这个就更简单了, 生成的Android工程中, 主Activity是MainActivity, 我们打开MainActivity,如下编写:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
public void onActivityResult(int requestCode, int resultCode,Intent intent) { if (requestCode == AR_CHECK_UPDATE) { checkApkUpdate(this); } U8SDK.getInstance().onActivityResult(requestCode, resultCode, intent); } protected void onPause() { super.onPause(); if(isLoad)mPlugin.game_plugin_onPause(); U8SDK.getInstance().onPause(); } //------------------------------------------------------------------------------ protected void onResume() { super.onResume(); if(isLoad)mPlugin.game_plugin_onResume(); U8SDK.getInstance().onResume(); } protected void onDestroy() { super.onDestroy(); if(isLoad)mPlugin.game_plugin_onDestory(); U8SDK.getInstance().onDestroy(); } protected void onRestart(){ super.onRestart(); U8SDK.getInstance().onRestart(); } protected void onStop(){ super.onStop(); U8SDK.getInstance().onStop(); } protected void onNewIntent(Intent intent){ super.onNewIntent(intent); U8SDK.getInstance().onNewIntent(intent); } protected void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults){ U8SDK.getInstance().onRequestPermissionResult(requestCode, permissions, grantResults); } |
部分渠道SDK要求,玩家退出游戏的时候, 需要调用渠道SDK的退出接口。 看LayaAir生成的Android工程,是在layaair.game.Market.GameEngine中。 对应调用代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
public void ExitGame() { Log.i("=======", "======exit"); //activity.finish(); //activity = null; //mLayaEngine.onDestroy(); //System.exit(0); U8Platform.getInstance().exitSDK(new U8ExitListener() { @Override public void onGameExit() { activity.finish(); System.exit(0); } }); } |
最后,我们打开Android工程的AndroidManifest.xml文件, 在application节点中,增加一个android:name,将值设置为:com.u8.sdk.U8Application。
1 2 3 4 5 6 7 8 9 |
<application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:name="com.u8.sdk.U8Application"> |
好了,到这里,我们在LayaAir中就接入了U8SDK。 接下来,我们build运行, 将生成的apk作为母包, 拷贝到打包工具中随便打出两个渠道包,看下效果吧。我们打一个百度和360的包,运行看下登录和支付效果:
本文出自 U8SDK技术博客,转载时请注明出处及相应链接。
本文永久链接: http://www.uustory.com/?p=2239