U8SDK——Egret(白鹭引擎)中集成U8SDK
随着H5游戏和微信小游戏越来越火, 使用H5游戏引擎来开发的游戏会越来越多,H5游戏不仅仅可以作为纯H5来运行,也可以打包成原生app包或者微端来运行。
如果你希望将H5游戏打包成微端或者原生app包,分发到国内各大渠道平台, 那么你可能就会使用U8SDK这样的聚合SDK产品,来快速地完成渠道SDK的接入和分发。
这篇博客,我们就来看下如何在Egret(白鹭引擎)中接入U8SDK Android平台api接口。
前面我们已经写了一篇博客,讲解了H5引擎Layabox开发的游戏如何集成U8SDK,感兴趣的同学可以参考一下:【Layabox集成U8SDK】
Egret提供了Egret Native组件来帮助我们和原生API进行通信。 Egret中和Android平台api相互调用 也就是js和android平台之间的相互调用。我们只需要按照引擎为我们提供好的调用api来进行U8SDK API的调用和封装即可。
我们先看从js或者从Egret程序中,我们如何调用Android层(java)中的一个方法。 比如我需要在js中调用Android层一个登录方法, 比如方法名叫login。
第一步, 我们需要在Android层代码中,调用Egret的api来注册这个方法:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
nativeAndroid.setExternalInterface("u8Login", new INativePlayer.INativeInterface() { @Override public void callback(String dataFromJs) { //在回调中,实际来调用java层中你需要调用的函数 login(dataFromJs); } }); public void login(String dataFromJs){ Log.d("U8SDK", "the login method in java is called. data from js:"+dataFromJs); } |
可以看到, 我们调用nativeAndroid的setExternalInterface接口,注册了一个u8Login的方法, 然后在回调中, 才真正调用了我们想要调用的login函数。
注意, 后面js中调用的时候,需要指定的方法名称是u8Login,而不是login。
紧接着,我们可以在js代码中这样调用我们的登录方法了:
1 2 3 4 5 |
egret.ExternalInterface.call("u8Login", "data from js"); |
上面可以看到, 在js代码中,我们只需要调用egret.ExternalInterface.call接口,然后传入我们在android层注册好的方法名称,就可以完成原生层api的调用了。
然后我们再来看, 如何从Android层代码中,调用到js层或者Egret程序的方法:
1 2 3 4 5 6 7 |
egret.ExternalInterface.addCallback("onU8LoginSuccess", function(dataFromJava) { console.log(dataFromJava); }); |
上面可以看到, 和上面的思路一样。 在js代码中, 我们通过调用egret.ExternalInterface.addCallback来注册需要被原生层调用的方法。 上面我们注册了一个onU8LoginSuccess的js方法。
然后我们从Android层来调用这个注册了的js方法:
1 2 3 4 5 |
nativeAndroid.callExternalInterface("onU8LoginSuccess", "data from java"); |
上面可以看到,在java代码中,我们只需要调用nativeAndroid.callExternalInterface接口,然后传入我们在js层注册好的方法名称,就可以调用到js层的方法了。
Egret Native已经为我们封装了一套极其简单的API,来完成原生层和js层的相互调用。 我们接下来就按照上面的知识, 来封装一套js中的U8SDK的相关API。 下面直接贴代码了, 相关说明见代码注释。
Egret中js层U8SDK.ts文件中封装了U8SDK相关组件:
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 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 |
//#U8SDK for Egret //支付参数对象 class U8PayParams{ //游戏中商品ID productId : string; //游戏中商品名称,比如元宝,钻石... productName : string; //游戏中商品描述 productDesc : string; //价格,单位为元 price : number; //购买数量,一般都为1. buyNum : number; //当前玩家身上剩余的虚拟币数量 coinNum : number; //当前角色所在的服务器ID serverId : string; //当前角色所在的服务器名称 serverName : string; //当前角色ID roleId : string; //当前角色名称 roleName : string; //当前角色等级 roleLevel : number; //游戏服的支付回调地址,用于接收支付回调通知 payNotifyUrl : string; //当前角色的vip等级 vip : string; //扩展数据, 支付成功回调通知游戏服务器的时候,会原封不动返回这个值 extension : string; } //上报数据对象 class U8GameData{ //调用时机———— 2 : 创建角色; 3:进入游戏; 4:登记提升;5:退出游戏 dataType : number; //角色ID roleID:string; //角色名称 roleName : string; //角色等级 roleLevel : number; //服务器ID serverID : string; //服务器名称 serverName : string; //当前角色生成拥有的虚拟币数量 moneyNum : number; //角色创建时间,从1970年到现在的时间,单位秒 roleCreateTime : string; //角色等级变化时间,从1970年到现在的时间,单位秒, 没有传0 roleLevelUpTime : string; } //抽象的SDK api接口 declare interface IU8Platform { //登录接口 login(): Promise<any>; //支付接口 pay(data : U8PayParams): Promise<any>; //上报数据接口, 需要分别在创建角色,进入游戏,登记升级, 退出游戏四个地方调用 //每个地方调用时,U8GameData中的dataType注意设置为对应的值。 submitGameData(data : U8GameData) : Promise<any>; //退出游戏接口, 调用会弹出渠道SDK的退出确认框 exit(): Promise<any>; //获取渠道号 getChannelID(): Promise<any>; } //U8SDK Android平台调用接口实现 class U8AndroidPlatform implements IU8Platform{ async login(){ egret.ExternalInterface.call("u8Login", ""); } async pay(data:U8PayParams){ let payData = JSON.stringify(data); egret.ExternalInterface.call("u8Pay", payData); } async submitGameData(data:U8GameData){ let gameData = JSON.stringify(data); egret.ExternalInterface.call("u8Submit", gameData); } async exit(){ egret.ExternalInterface.call("u8Exit", ""); } async getChannelID(){ egret.ExternalInterface.call("u8GetChannel", ""); } } //U8SDK iOS平台调用接口实现 class U8IOSPlatform implements IU8Platform{ async login(){ //wait to implements } async pay(data:U8PayParams){ //wait to implements } async submitGameData(data:U8GameData){ //wait to implements } async exit(){ //wait to implements } async getChannelID(){ //wait to implements } } //U8SDK windows等平台默认实现 class U8DebugPlatform implements IU8Platform{ async login(){ console.debug("u8 login called."); } async pay(data:U8PayParams){ console.debug("u8 pay called."); } async submitGameData(data:U8GameData){ console.debug("u8 submitGameData called."); } async exit(){ console.debug("u8 exit called."); } async getChannelID(){ console.debug("u8 getChannelID called."); } } //U8SDK接口对外调用类 //这里处理原生层的api调用,以及收到原生层的回调接口处理 class U8SDKWrapper{ platform : IU8Platform; public constructor() { } //初始化SDK initSDK(){ if(!this.platform){ let osType = egret.Capabilities.os; if(osType == 'Android'){ this.platform = new U8AndroidPlatform(); }else if(osType == 'iOS'){ this.platform = new U8IOSPlatform(); }else{ this.platform = new U8DebugPlatform(); } //注册SDK登录成功回调,在这里可以获取到SDK登录成功返回的用户ID, 用户名,token等数据 egret.ExternalInterface.addCallback("onU8LoginSuccess", this.onLoginSuccess); //注册SDK登出回调, 玩家从SDK悬浮窗中点击注销SDK账号, 会触发该回调, 游戏需要在这里引导玩家登出游戏,返回登录界面,重新拉起SDK登录界面,让玩家重新登录 egret.ExternalInterface.addCallback("onU8Logout", this.onLogout); //注册SDK切换账号回调, 玩家从SDK中切换账号,并登录新账号成功, 游戏需要在这里引导玩家返回游戏登录界面,让玩家以新的userId对应的角色进入游戏 egret.ExternalInterface.addCallback("onU8SwitchAccountSuccess", this.onSwitchAccountSuccess); //支付回调 egret.ExternalInterface.addCallback("onU8PayResult", this.onPayResult); //获取渠道号回调 egret.ExternalInterface.addCallback("onU8GetChannel", this.onGetChannel); console.debug("u8sdk inited in wrapper"); } } //登录 async login(){ console.debug("u8 login called in wrapper."); await this.platform.login(); } //支付 async pay(data:U8PayParams){ console.debug("u8 pay called in wrapper."); await this.platform.pay(data); } //提交扩展数据 async submitGameData(data:U8GameData){ console.debug("u8 submitGameData called in wrapper."); await this.platform.submitGameData(data); } //退出游戏 async exit(){ console.debug("u8 exit called in wrapper."); await this.platform.exit(); } //获取渠道号 async getChannelID(){ console.debug("u8 getChannelID called in wrapper."); await this.platform.getChannelID(); } //=====================原生层回调接口处理Begin========================================== //SDK登录成功回调, loginResult是json格式的登录结果 //userID : 唯一账号ID //sdkUserID : 渠道平台那边的玩家唯一账号(不可以用这个单独作为和游戏角色绑定的字段) //username : 用户名, 无意义 //sdkUsername : 渠道平台用户名 //token : 聚合server返回的token, 携带给游戏服务器, 游戏服务器去聚合server做二次登陆校验使用 onLoginSuccess(loginResult:string){ console.log("onLoginSuccess called in egret."+loginResult); } //SDK登出回调,游戏需要在这里引导玩家登出游戏,返回登录界面,重新拉起SDK登录界面,让玩家重新登录 onLogout(){ console.log("onLogout called in egret."); } //SDK切换账号回调, 游戏需要在这里引导玩家登出游戏,返回登录界面,重新拉起SDK登录界面,让玩家重新登录 onSwitchAccountSuccess(loginResult:string){ console.log("onSwitchAccountSuccess called in egret."+loginResult); } //SDK支付客户端结果, 注意发货不要依赖这个接口, 以游戏服务器收到聚合服务器的支付回调通知为准。 //payCode为0,说明支付成功,其他为支付失败。 onPayResult(payCode:string){ console.log("onPayResult called in egret."+payCode); } //获取渠道号回调 onGetChannel(channel:string){ console.log("onGetChannel called in egret."+channel); } //=====================原生层回调接口处理End========================================== } //以下代码将U8SDKWrapper放到window组件下面,调用可以直接使用u8sdkApi来调用 if(!window.u8sdkApi){ window.u8sdkApi = new U8SDKWrapper(); } declare let u8sdkApi: U8SDKWrapper; declare interface Window { u8sdkApi: U8SDKWrapper; } |
调用的话, 我们弄几个按钮, 然后在按钮中,调用对应的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 |
private createGameScene() { //other code... //初始化SDK u8sdkApi.initSDK(); } private async onLoginBtnClicked(evt:egret.TouchEvent){ console.debug("login btn clicked..."); await u8sdkApi.login(); } private async onPayBtnClicked(evt:egret.TouchEvent){ console.debug("pay btn clicked..."); let payData = new U8PayParams(); payData.productId = "1"; payData.productName = "100元宝"; payData.productDesc = "购买100元宝,送20"; payData.price = 1; payData.buyNum = 1; payData.coinNum = 1000; payData.serverId = "1"; payData.serverName = "刺激战场"; payData.roleId = "1"; payData.roleName = "u8demo"; payData.roleLevel = 1; payData.payNotifyUrl = "http://game.h5.com/gameCallback"; payData.vip = "10"; payData.extension = "custom data will be sent to game server with pay callback."; await u8sdkApi.pay(payData); } private async onSubmitBtnClicked(evt:egret.TouchEvent){ console.debug("submit btn clicked..."); let data = new U8GameData(); data.dataType = 2; //创建角色 data.roleID = "1"; data.roleName = "u8demo"; data.roleLevel = 1; data.serverID = "1"; data.serverName = "刺激战场"; data.moneyNum = 1000; data.roleCreateTime = "1000035434"; data.roleLevelUpTime = "0"; await u8sdkApi.submitGameData(data); } private async onExitBtnClicked(evt:egret.TouchEvent){ console.debug("exit btn clicked..."); await u8sdkApi.exit(); } |
接下来,我们将工程发布成微端或者原生app工程, 会生成一个AndroidStudio Android原生工程。 我们打开这个工程,写Android层对应的代码:
我们封装了一个U8SDKForEgret的单例对象,里面做相关方法的注册,以及U8SDK的调用:
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 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 |
package org.egret.launcher.u8sdk; import android.app.Activity; import android.app.AlertDialog; import android.content.DialogInterface; import android.text.TextUtils; import android.util.Log; import android.widget.Toast; import com.u8.sdk.PayParams; import com.u8.sdk.ProductQueryResult; import com.u8.sdk.U8Code; import com.u8.sdk.U8Order; import com.u8.sdk.U8SDK; import com.u8.sdk.UserExtraData; import com.u8.sdk.platform.U8ExitListener; import com.u8.sdk.platform.U8InitListener; import com.u8.sdk.platform.U8Platform; import com.u8.sdk.verify.UToken; import org.egret.launcher.egret_android_launcher.NativeLauncher; import org.egret.runtime.launcherInterface.INativePlayer; import org.json.JSONObject; import java.util.List; public class U8SDKForEgret { private static U8SDKForEgret instance; private NativeLauncher launcher; private Activity context; public static U8SDKForEgret getInstance(){ if(instance == null){ instance = new U8SDKForEgret(); } return instance; } public void initSDK(final Activity context, final NativeLauncher launcher){ this.launcher = launcher; this.context = context; U8Platform.getInstance().init(context, new U8InitListener() { @Override public void onLogout() { //用户登出回调(需要收到该回调需要返回游戏登录界面,并调用login接口,打开SDK登录界面) launcher.callExternalInterface("onU8Logout", ""); } @Override public void onSwitchAccount(UToken data) { //游戏中通过SDK切换到新账号的回调,游戏收到该回调,需要引导用户重新登录,重新加载该新用户对应的角色数据 //Toast.makeText(context, "切换账号并登陆成功", Toast.LENGTH_LONG).show(); launcher.callExternalInterface("onU8SwitchAccountSuccess", loginResult2Json(data)); } @Override public void onPayResult(int code, String msg) { Log.d("U8SDK", "pay result. code:"+code+";msg:"+msg); int payCode = 0; //成功 switch(code){ case U8Code.CODE_PAY_SUCCESS: Toast.makeText(context, "支付成功", Toast.LENGTH_LONG).show(); //因为部分SDK支付成功回调触发的时机并不是真的支付成功,所以这里最好不要主动给用户提示, 以SDK充值界面中显示的状态为准。 break; case U8Code.CODE_PAY_FAIL: Toast.makeText(context, "支付失败", Toast.LENGTH_LONG).show(); payCode = 1; //因为部分SDK支付界面关闭可能也会触发支付失败回调,所以这里最好不要主动给用户提示, 以SDK充值界面中显示的状态为准。 break; case U8Code.CODE_PAY_CANCEL: Toast.makeText(context, "支付取消", Toast.LENGTH_LONG).show(); payCode = 1; break; case U8Code.CODE_PAY_UNKNOWN: payCode = 1; Toast.makeText(context, "未知错误", Toast.LENGTH_LONG).show(); break; default: payCode = 1; } launcher.callExternalInterface("onU8PayResult", payCode+""); } @Override public void onLoginResult(int code, UToken data) { switch(code){ case U8Code.CODE_LOGIN_SUCCESS: //SDK登录成功回调 launcher.callExternalInterface("onU8LoginSuccess", loginResult2Json(data)); break; case U8Code.CODE_LOGIN_FAIL: Log.d("U8SDK", "login failed from sdk."); Toast.makeText(context, "登录失败", Toast.LENGTH_LONG).show(); break; } } @Override public void onInitResult(int code, String msg) { Log.d("U8SDK", "init result.code:"+code+";msg:"+msg); switch(code){ case U8Code.CODE_INIT_SUCCESS: Toast.makeText(context, "初始化成功", Toast.LENGTH_LONG).show(); break; case U8Code.CODE_INIT_FAIL: Toast.makeText(context, "初始化失败", Toast.LENGTH_LONG).show(); break; } } @Override public void onProductQueryResult(List<ProductQueryResult> result) { //不需要处理 } @Override public void onDestroy() { Log.d("U8SDK", "game onDestroy callback called."); } @Override public void onSinglePayResult(int code, U8Order order) { //单机游戏支付回调处理接口 Log.d("U8SDK", "single pay callback. code:"+code); } @Override public void onResult(int code, String msg) { //不需要处理 } }); registerForJsCall(); } private void registerForJsCall(){ //登录 launcher.setExternalInterface("u8Login", new INativePlayer.INativeInterface() { @Override public void callback(String s) { Log.d("U8SDK","u8Login called in java. begin call sdk login." + s); context.runOnUiThread(new Runnable() { @Override public void run() { U8Platform.getInstance().login(context); } }); } }); //支付 launcher.setExternalInterface("u8Pay", new INativePlayer.INativeInterface() { @Override public void callback(final String s) { Log.d("U8SDK","u8Pay called in java. begin call sdk pay. params from js:" + s); context.runOnUiThread(new Runnable() { @Override public void run() { PayParams payParams = parsePayParams(s); U8Platform.getInstance().pay(context, payParams); } }); } }); //上报数据 launcher.setExternalInterface("u8Submit", new INativePlayer.INativeInterface() { @Override public void callback(final String s) { Log.d("U8SDK","u8Submit called in java. begin call sdk submit. params from js:" + s); context.runOnUiThread(new Runnable() { @Override public void run() { UserExtraData data = parseGameData(s); U8Platform.getInstance().submitExtraData(data); } }); } }); //退出游戏 launcher.setExternalInterface("u8Exit", new INativePlayer.INativeInterface() { @Override public void callback(final String s) { Log.d("U8SDK","u8Exit called in java. begin call sdk exit."); context.runOnUiThread(new Runnable() { @Override public void run() { exitSDK(); } }); } }); //获取渠道号 launcher.setExternalInterface("u8GetChannel", new INativePlayer.INativeInterface() { @Override public void callback(final String s) { Log.d("U8SDK","u8GetChannel called in java. begin call get channel id."); int channelID = U8SDK.getInstance().getCurrChannel(); launcher.callExternalInterface("onU8GetChannel", ""+channelID); } }); } public void exitSDK(){ U8Platform.getInstance().exitSDK(new U8ExitListener() { @Override public void onGameExit() { //游戏自己的退出确认框 AlertDialog.Builder builder = new AlertDialog.Builder(context); builder.setTitle("退出确认"); builder.setMessage("现在还早,要不要再玩一会?"); builder.setCancelable(true); builder.setPositiveButton("好吧", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { //这里什么都不用做 } }); builder.setNeutralButton("一会再玩", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { //退出游戏 context.finish(); System.exit(0); } }); builder.show(); } }); } //反序列化从js层传过来的上报参数 private UserExtraData parseGameData(String str){ UserExtraData data = new UserExtraData(); JSONObject json = null; try { json = new JSONObject(str); data.setDataType(json.getInt("dataType")); data.setRoleID(json.getString("roleID")); data.setRoleName(json.getString("roleName")); data.setRoleLevel(json.getString("roleLevel")); data.setServerID(json.getInt("serverID")); data.setServerName(json.getString("serverName")); data.setMoneyNum(json.getInt("moneyNum")); String roleCreateTime = json.getString("roleCreateTime"); String roleLevelUpTime = json.getString("roleLevelUpTime"); if(!TextUtils.isEmpty(roleCreateTime.trim())){ data.setRoleCreateTime(Long.valueOf(roleCreateTime.trim())); } if(!TextUtils.isEmpty(roleLevelUpTime.trim())){ data.setRoleLevelUpTime(Long.valueOf(roleLevelUpTime.trim())); } data.setVip(json.optString("vip", "0")); } catch (Exception e) { e.printStackTrace(); } return data; } //反序列化从js层传来的支付参数 private PayParams parsePayParams(String str){ PayParams params = new PayParams(); try{ JSONObject json = new JSONObject(str); params.setProductId(json.getString("productId")); params.setProductName(json.getString("productName")); params.setProductDesc(json.getString("productDesc")); params.setPrice(json.getInt("price")); params.setRatio(0);//该字段废弃不用 params.setBuyNum(json.getInt("buyNum")); params.setCoinNum(json.getInt("coinNum")); params.setServerId(json.getString("serverId")); params.setServerName(json.getString("serverName")); params.setRoleId(json.getString("roleId")); params.setRoleName(json.getString("roleName")); params.setRoleLevel(json.getInt("roleLevel")); params.setPayNotifyUrl(json.getString("payNotifyUrl")); params.setVip(json.getString("vip")); params.setExtension(json.getString("extension")); }catch(Exception e){ e.printStackTrace(); } return params; } //登录结果转json private String loginResult2Json(UToken authResult){ JSONObject json = new JSONObject(); try{ 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(); } return json.toString(); } } |
然后在生成的MainActivity中, 进行相关api的调用, 以及U8SDK生命周期函数的调用:
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 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 |
package org.egret.launcher.u8sdk; import android.content.Intent; import android.content.res.Configuration; import android.os.Bundle; import android.os.Handler; import android.util.Log; import android.view.KeyEvent; import android.widget.FrameLayout; import com.u8.sdk.U8SDK; import org.egret.launcher.egret_android_launcher.NativeActivity; import org.egret.launcher.egret_android_launcher.NativeCallback; import org.egret.launcher.egret_android_launcher.NativeLauncher; public class MainActivity extends NativeActivity { private final String token = "0f0f04f75f110ef55a9435e305cfab5111ff088a885f9eb337ed6c0e5b2180fb"; /* * 设置是否显示FPS面板 * true: 显示面板 * false: 隐藏面板 * Set whether to show FPS panel * true: show FPS panel * false: hide FPS panel * */ private final boolean showFPS = true; private FrameLayout rootLayout = null; private Handler handler = new Handler(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); rootLayout = (FrameLayout)findViewById(R.id.rootLayout); launcher.initViews(rootLayout); //初始化SDK组件 U8SDKForEgret.getInstance().initSDK(this, launcher); /* * 设置是否自动关闭启动页 * 1: 自动关闭启动页 * 0: 手动关闭启动页 * Set whether to close the startup page automatically * 1. close the startup page automatically * 0. close the startup page manually * */ launcher.closeLoadingViewAutomatically = 1; /* * 设置是否每次启动都重新下载游戏资源 * 0: 版本更新才重新下载 * 1: 每次启动都重新下载 * Set whether to re-download game resources each time the application starts * 0: re-download game resources if version updated * 1: re-download game resources each time the application starts * */ launcher.clearGameCache = 0; /* * 设置runtime代码log的等级 * 0: Debug * 1: Info * 2: Warning * 3: Error * Set log level for runtime code * 0: Debug * 1: Info * 2: Warning * 3: Error * */ launcher.logLevel = 2; progressCallback = new NativeCallback() { @Override public void onCallback(String msg, int val) { switch (msg) { case NativeLauncher.LoadingRuntime: /* * 下载和加载runtime * Download and load runtime * */ break; case NativeLauncher.LoadingGame: /* * 下载和加载游戏资源 * Download and load game resources * */ launcher.startRuntime(showFPS); break; case NativeLauncher.GameStarted: /* * 游戏启动 * Game started * */ break; case NativeLauncher.LoadRuntimeFailed: /* * 加载runtime和游戏信息失败 * Loading runtime and game resources failed * */ break; default: break; } } }; launcher.loadRuntime(token); } //******************系统事件 Start******************** public void onActivityResult(int requestCode, int resultCode, Intent data){ super.onActivityResult(requestCode, resultCode, data); U8SDK.getInstance().onActivityResult(requestCode, resultCode, data); } public void onStart(){ Log.d("U8SDK", "onStart"); super.onStart(); U8SDK.getInstance().onStart(); } public void onPause(){ Log.d("U8SDK", "onPause"); super.onPause(); U8SDK.getInstance().onPause(); } public void onResume(){ super.onResume(); Log.d("U8SDK", "onResume"); U8SDK.getInstance().onResume(); } public void onNewIntent(Intent newIntent){ super.onNewIntent(newIntent); Log.d("U8SDK", "onNewIntent"); U8SDK.getInstance().onNewIntent(newIntent); } public void onStop(){ super.onStop(); Log.d("U8SDK", "onStop"); U8SDK.getInstance().onStop(); } public void onDestroy(){ super.onDestroy(); Log.d("U8SDK", "onDestroy"); U8SDK.getInstance().onDestroy(); } public void onRestart(){ super.onRestart(); Log.d("U8SDK", "onReStart"); U8SDK.getInstance().onRestart(); } public void onConfigurationChanged(Configuration newConfig){ super.onConfigurationChanged(newConfig); } public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults){ U8SDK.getInstance().onRequestPermissionResult(requestCode, permissions, grantResults); } //******************系统事件 End******************** public boolean onKeyDown(int keyCode, KeyEvent event){ Log.d("U8SDK", "OnKeyDown:"+keyCode); super.onKeyDown(keyCode, event); if(keyCode == KeyEvent.KEYCODE_BACK){ U8SDKForEgret.getInstance().exitSDK(); } return true; } } |
好了,到这里Egret中集成U8SDK就完成了, 接下来你可以将生成的apk母包,上传到U8SDK打包后台, 随便打一个渠道apk试试看效果吧。
本文出自 U8SDK技术博客,转载时请注明出处及相应链接。
本文永久链接: http://www.uustory.com/?p=2273