手游海外SDK实战——Android客户端之接口篇
一、前言
随着国内手游版号申请难度的增加,以及防沉迷等一系列政策的影响,很多国内开发者纷纷开始寻求海外发行之路。那么手游出海首要的是需要一套适合海外发行和运营的手游SDK联运系统。
本系列我们就来开发一套这样的SDK,我们暂且称这套SDK为UGSDK。该SDK已经开发完成,如果有兴趣或者想体验完整功能的同学,可以加我们的海外技术交流QQ群:1055996444。
整个UGSDK项目,暂时可以分为三大部分——Android客户端SDK部分、iOS客户端SDK部分以及服务端部分(目前不考虑H5游戏部分)。
本篇主要介绍UGSDK项目中Android客户端部分中对外提供的统一API调用接口。
二、API调用接口设计
根据我们之前定的接口设置原则,不管我们SDK内部的功能有多繁杂, 我们对于游戏层提供的API接口调用都需要足够简单。
在UGSDK中, 我们封装了统一的API调用接口类:UGPlatform:
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 |
public class UGPlatform { private static UGPlatform instance; public static UGPlatform getInstance() { if (instance == null) { instance = new UGPlatform(); } return instance; } /** * 初始化, 需要在游戏启动的时候调用,一般在游戏Activity的onCreate中调用 * @param context * @param params * @param listener */ public void init(Activity context, UGInitParams params, UGSDKListener listener) { SDKManager.getInstance().init(context, params, listener); } /** * 登陆接口,调用之后, 弹出SDK的登陆界面 * @param activity */ public void login(Activity activity) { SDKManager.getInstance().login(activity); } /** * 登出接口, 调用之后, 清除当前登录状态 * @param activity */ public void logout(Activity activity) { SDKManager.getInstance().logout(activity); } /** * 支付接口, 调用之后,弹出Google支付界面 * @param activity * @param order */ public void pay(Activity activity, UGOrder order) { SDKManager.getInstance().pay(activity, order); } /** * 数据上报,需要在创建角色、进入游戏、等级升级、退出游戏等几个地方调用 * @param activity * @param roleData */ public void submit(Activity activity, UGRoleData roleData) { SDKManager.getInstance().submitGameData(activity, roleData); } /** * 在游戏Activity的onResume中调用 * @param activity */ public void onResume(Activity activity) { SDKManager.getInstance().onResume(activity); } /** * 在游戏Activity的onDestroy中调用 * @param context */ public void onDestroy(Context context) { SDKManager.getInstance().onDestroy(context); } } |
同时,我们对于每个调用事件的结果, 需要通知给游戏层, 我们抽象出一个UGSDKListener监听器接口,让游戏层来实现:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
public interface UGSDKListener { void onInitFailed(int code, String msg); void onInitSuccess(); void onLogout(); void onLoginSuccess(UGUser user); void onLoginFailed(int code, String msg); void onUpgradeSuccess(UGUser user); void onPaySuccess(UGOrder order); void onPayFailed(int code, String msg); void onExitSuccess(); } |
三、游戏层调用示例
按上面的设计, 如果最终我们提供给游戏研发SDK包之后, 研发就可以按照如下方式快速接入了。 假如MainActivity是游戏的当前主Activity:
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 |
public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // Button button_login = (Button) findViewById(R.id.button_login); button_login.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { clickLogin(); } }); Button button_pay = (Button) findViewById(R.id.button_pay); button_pay.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { clickPay(); } }); Button button_createRole = (Button)findViewById(R.id.button_createRole); button_createRole.setOnClickListener(new View.OnClickListener(){ @Override public void onClick(View view) { submitGameData(UGRoleData.TYPE_CREATE_ROLE); } }); Button button_enterGame = (Button)findViewById(R.id.button_enterGame); button_enterGame.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { submitGameData(UGRoleData.TYPE_ENTER_GAME); } }); Button button_logout = (Button)findViewById(R.id.button_logout); button_logout.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View arg0) { try{ UGPlatform.getInstance().logout(MainActivity.this); }catch(Exception e){ e.printStackTrace(); } } }); } private void initSDK() { String appID = "1"; String appKey = "1111111"; UGPlatform.getInstance().init(this, new UGInitParams(appID, appKey, UGInitParams.ORIENTATION_LANDSCAPE), new UGSDKListener() { @Override public void onInitFailed(int code, String msg) { } @Override public void onInitSuccess() { } @Override public void onLogout() { } @Override public void onLoginSuccess(UGUser user) { Log.d("UGSDKDemo", "sdk login success."+user.getUid()); } @Override public void onLoginFailed(int code, String msg) { Toast.makeText(MainActivity.this, "登陆失败", Toast.LENGTH_LONG).show(); } @Override public void onUpgradeSuccess(UGUser user) { } @Override public void onPaySuccess(UGOrder order) { } @Override public void onPayFailed(int code, String msg) { MainActivity.this.runOnUiThread(new Runnable() { @Override public void run() { Toast.makeText(MainActivity.this, "支付失败", Toast.LENGTH_LONG).show(); } }); } @Override public void onExitSuccess() { } }); } private void clickLogin() { UGPlatform.getInstance().login(this); } private void clickPay() { UGOrder order = new UGOrder(); order.setProductID("1"); order.setProductName("测试商品"); order.setProductDesc("测试商品描述"); order.setRoleID("1"); order.setRoleName("test_role_1"); order.setRoleLevel("1"); order.setVip("1"); order.setServerID("2"); order.setServerName("test_1"); order.setPrice(100); order.setCurrency("CNY"); order.setCpOrderID(System.currentTimeMillis()+""); order.setExtra("extra data"); UGPlatform.getInstance().pay(this, order); } private void submitGameData(int type) { UGRoleData data = new UGRoleData(); data.setType(type); data.setServerID("2"); data.setServerName("test_1"); data.setRoleID("1"); data.setRoleName("test_role_1"); data.setRoleLevel("1"); data.setVip("1"); data.setCreateTime(System.currentTimeMillis()/1000); data.setLastLevelUpTime(data.getCreateTime()); UGPlatform.getInstance().submit(this, data); } protected void onResume() { super.onResume(); UGPlatform.getInstance().onResume(this); } @Override protected void onDestroy() { super.onDestroy(); UGPlatform.getInstance().onDestroy(this); } } |
这样设计之后, 整个SDK接口对游戏来说,调用是及其简单的了。好了,本篇我们介绍了在UGSDK中尽可能设计出简单的对外API接口。感兴趣的同学可以加入我们的技术交流Q裙哦(1055996444)。
本文出自 U8SDK技术博客,转载时请注明出处及相应链接。
本文永久链接: http://www.uustory.com/?p=2411