前言 :

各位同学的大家好 , 最近在学习鸿蒙开发, 因为我是从事手游SDK 开发的 之前也写过iOS 手游sdk 开发和安卓手游sdk 开发(kotlin 版本)

效果图:


设计思路

我们需要封装 init login servicelogin updateuserinfo 等对外接口给到游戏去调用

 package com.example.myapplication;import com.example.myapplication.bean.BackInfo;
import com.example.myapplication.bean.RoleInfo;
import com.example.myapplication.bean.ServiceInfo;
import com.example.myapplication.lisenter.InitListener;
import com.example.myapplication.lisenter.LoginLisenter;
import com.example.myapplication.lisenter.ServiceListener;
import com.example.myapplication.lisenter.UpdateUserListener;
import com.google.gson.Gson;
import com.zhy.http.okhttp.OkHttpUtils;
import com.zhy.http.okhttp.callback.StringCallback;
import ohos.app.Context;
import okhttp3.Call;import java.util.HashMap;
import java.util.Map;public class NineFunSdk {private   Boolean  initFlag=false;private static  NineFunSdk instance;private NineFunSdk() {}public  static NineFunSdk getInstance(){if(instance==null){synchronized (NineFunSdk.class){if(instance==null){instance=new NineFunSdk();}}}return  instance;}public void init(InitListener listener){Map<String,String> map=new HashMap<>();map.put("deviceid","2341414");map.put("system_type","android");map.put("version","1.1");map.put("gid","35");map.put("device","saff");map.put("device_model","1214141");map.put("device_model","WEFWF");map.put("device_model","21E131");OkHttpUtils.post().url(Config.INIT).params(map).build().execute(new StringCallback() {@Overridepublic void onError(Call call, Exception e, int i) {listener.initError();}@Overridepublic void onResponse(String s, int i) {Gson gson=new Gson();BackInfo backInfo=gson.fromJson(s,BackInfo.class);if(backInfo.getCode()==200){initFlag=true;listener.initSuccess();}else{listener.initError();}}});}public   void  checkLogin(Context context, LoginLisenter lisenter){if(initFlag){LoginDialog loginDialog = new LoginDialog(context,lisenter);loginDialog.show();}else{ToastUtils.showInfo(context,"请先调用初始化");}}/***** @param serviceInfo* @param lisenter*/public   void  serviceLogin(ServiceInfo  serviceInfo, ServiceListener lisenter){StringBuilder preSign = new StringBuilder();preSign.append("sid=").append(serviceInfo.getSid());preSign.append("&role_id=").append(serviceInfo.getRole_id());preSign.append("&role_name=").append(serviceInfo.getRole_name());preSign.append("||").append("0a649d6b-df9f-4583-bf7d-3fae84838519");Map<String,String> map=new HashMap<>();map.put("gid",serviceInfo.getGid());map.put("sid",serviceInfo.getGid());map.put("role_name",serviceInfo.getGid());map.put("role_level",serviceInfo.getGid());map.put("role_id",serviceInfo.getGid());map.put("sign",preSign.toString());OkHttpUtils.post().url(Config.SERVICE_LOGIN).params(map).build().execute(new StringCallback() {@Overridepublic void onError(Call call, Exception e, int i) {}@Overridepublic void onResponse(String s, int i) {Gson gson=new Gson();BackInfo backInfo=gson.fromJson(s,BackInfo.class);if(backInfo.getCode()==200){lisenter.serviceLoginSuccess();}}});}/**** @param roleInfo* @param lisenter*/public   void  updateUserInfo(RoleInfo roleInfo, UpdateUserListener lisenter){StringBuilder preSign = new StringBuilder();preSign.append("sid=").append(roleInfo.getGid());preSign.append("&role_id=").append(roleInfo.getRole_id());preSign.append("&role_name=").append(roleInfo.getRole_name());preSign.append("||").append("0a649d6b-df9f-4583-bf7d-3fae84838519");Map<String,String> map=new HashMap<>();map.put("gid",roleInfo.getGid());map.put("sid",roleInfo.getGid());map.put("role_name",roleInfo.getGid());map.put("role_level",roleInfo.getGid());map.put("role_id",roleInfo.getGid());map.put("sign",preSign.toString());OkHttpUtils.post().url(Config.UPDATE_USERINFO).params(map).build().execute(new StringCallback() {@Overridepublic void onError(Call call, Exception e, int i) {}@Overridepublic void onResponse(String s, int i) {Gson gson=new Gson();BackInfo backInfo=gson.fromJson(s,BackInfo.class);if(backInfo.getCode()==200){lisenter.updateuserSuccess();}}});}
}

登录框实现:

  • 布局

<?xml version="1.0" encoding="utf-8"?>
<DependentLayoutxmlns:ohos="http://schemas.huawei.com/res/ohos"ohos:height="240vp"ohos:width="300vp"ohos:alignment="center"><DirectionalLayoutohos:height="match_parent"ohos:width="match_parent"ohos:left_margin="20vp"ohos:right_margin="20vp"ohos:orientation="vertical"><DirectionalLayoutohos:height="60vp"ohos:width="match_parent"ohos:orientation="horizontal"><Textohos:id="$+id:text_account"ohos:height="35vp"ohos:width="35vp"ohos:layout_alignment="center"ohos:text="账号"ohos:text_alignment="horizontal_center"ohos:text_size="15vp"ohos:text_color="#000000"ohos:top_margin="10vp"/><TextFieldohos:id="$+id:tf_account"ohos:height="40vp"ohos:width="match_parent"ohos:hint="请输入账号"ohos:text_size="15vp"ohos:right_margin="20vp"ohos:left_margin="20vp"ohos:text_color="#000000"ohos:layout_alignment="center"ohos:basement="#000099"ohos:multiple_lines="false"/></DirectionalLayout><DirectionalLayoutohos:height="60vp"ohos:width="match_parent"ohos:orientation="horizontal"><Textohos:id="$+id:text_password"ohos:height="match_parent"ohos:width="35vp"ohos:layout_alignment="center"ohos:text_alignment="horizontal_center"ohos:text="密码"ohos:text_size="15vp"ohos:text_color="#000000"ohos:top_margin="10vp"/><TextFieldohos:id="$+id:tf_password"ohos:height="40vp"ohos:width="match_parent"ohos:hint="请输入密码"ohos:text_size="15vp"ohos:right_margin="20vp"ohos:left_margin="20vp"ohos:layout_alignment="center"ohos:text_color="#000000"ohos:basement="#000099"ohos:multiple_lines="false"/></DirectionalLayout><DirectionalLayoutohos:height="match_parent"ohos:width="match_parent"ohos:orientation="horizontal"ohos:top_margin="20vp"><Buttonohos:id="$+id:registerbtn"ohos:height="40vp"ohos:width="0vp"ohos:background_element="$graphic:background_btn_blue"ohos:text_color="#ffffff"ohos:text="快速注册"ohos:weight="1"ohos:left_margin="10vp"ohos:right_margin="10vp"ohos:text_size="15vp"></Button><Buttonohos:id="$+id:logindialogbtn"ohos:height="40vp"ohos:width="0vp"ohos:background_element="$graphic:background_btn_blue"ohos:text_color="#ffffff"ohos:text="登录"ohos:weight="1"ohos:left_margin="10vp"ohos:right_margin="10vp"ohos:text_size="15vp"></Button></DirectionalLayout></DirectionalLayout></DependentLayout>
  • 布局效果

具体逻辑

package com.example.myapplication;import com.example.myapplication.lisenter.LoginLisenter;
import com.google.gson.Gson;
import com.zhy.http.okhttp.OkHttpUtils;
import com.zhy.http.okhttp.callback.StringCallback;
import ohos.agp.components.*;
import ohos.agp.utils.LayoutAlignment;
import ohos.agp.utils.TextAlignment;
import ohos.agp.window.dialog.CommonDialog;
import ohos.agp.window.dialog.ToastDialog;
import ohos.app.Context;
import ohos.hiviewdfx.HiLog;
import ohos.hiviewdfx.HiLogLabel;
import okhttp3.Call;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;import static com.example.myapplication.Config.LOGIN_URL;
import static ohos.agp.components.ComponentContainer.LayoutConfig.MATCH_CONTENT;/**** 创建人:xuqing* 创建时间:2022年5月12日11:55:53* 类说明: 登录弹窗**/public class LoginDialog   extends CommonDialog {static final HiLogLabel LABEL = new HiLogLabel(HiLog.LOG_APP, 0x00201, "MY_TAG");private Context context;private Component customComponent;private TextField account, pswtf;private String username, password;private Button loginbtn;private LoginLisenter lisenter;public LoginDialog(Context context,LoginLisenter lisenter) {super(context);this.context=context;this.lisenter=lisenter;setAlignment(TextAlignment.CENTER);setSize(MATCH_CONTENT, MATCH_CONTENT);initComponents();}private void initComponents() {customComponent = LayoutScatter.getInstance(context).parse(ResourceTable.Layout_dialog_login, null, true);super.setContentCustomComponent(customComponent);loginbtn = (Button) customComponent.findComponentById(ResourceTable.Id_logindialogbtn);account= (TextField) customComponent.findComponentById(ResourceTable.Id_tf_account);pswtf= (TextField) customComponent.findComponentById(ResourceTable.Id_tf_password);loginbtn.setClickedListener(new Component.ClickedListener() {@Overridepublic void onClick(Component component) {username=account.getText().toString();password=pswtf.getText().toString();if(!TextUtils.Isempty(username)&& !TextUtils.Isempty(password)){Map<String,String>loginmap=new HashMap<>();loginmap.put("username",username);loginmap.put("password",password);login(loginmap);}else{ToastUtils.showInfo(context,"账号密码不能为空");}}});}public  void  login(Map<String,String> map){HiLog.warn(LABEL, "Failed to visit %{private}map , ",  map.toString());// ToastUtils.showInfo(context,map.toString());ToastUtils.showInfo(context,LOGIN_URL);OkHttpUtils.get().url(LOGIN_URL).params(map).build().execute(new StringCallback() {@Overridepublic void onError(Call call, Exception e, int i) {System.out.println("Exception  --- > "+e);}@Overridepublic void onResponse(String s, int i) {System.out.println("okhttpUtilsNet  s  --- > "+s);HiLog.warn(LABEL, "Failed to visit %{private}s, ",  s);Gson gson=new Gson();LofinInfo lofinInfo=gson.fromJson(s,LofinInfo.class);int code=lofinInfo.getCode();if(code==200){ToastUtils.showInfo(context,"登录成功");lisenter.loginSuccess(s);LoginDialog.this.destroy();}}});}
}
  • 登录对外接口

    public   void  checkLogin(Context context, LoginLisenter lisenter){if(initFlag){LoginDialog loginDialog = new LoginDialog(context,lisenter);loginDialog.show();}else{ToastUtils.showInfo(context,"请先调用初始化");}}
  • 登录调用

 private void login() {NineFunSdk.getInstance().checkLogin(MainAbility.this, new LoginLisenter() {@Overridepublic void loginSuccess(String data) {System.out.println("data  --- > "+data );}@Overridepublic void loginError() {}});}

登录弹窗 里面逻辑也比较简单就是游戏在外部调用SDK 我们在初始化成功以后 我们显示登录弹窗 。然后用户输入账号密码 我们去登录 请求服务器 如果登录成功我们将服务器返回数据结构回调给游戏游戏拿到token和userid 去请求api/token验证接口进行验证登录效果即可

区服上报接口

 /***** @param serviceInfo* @param lisenter*/public   void  serviceLogin(ServiceInfo  serviceInfo, ServiceListener lisenter){StringBuilder preSign = new StringBuilder();preSign.append("sid=").append(serviceInfo.getSid());preSign.append("&role_id=").append(serviceInfo.getRole_id());preSign.append("&role_name=").append(serviceInfo.getRole_name());preSign.append("||").append("0a649d6b-df9f-4583-bf7d-3fae84838519");Map<String,String> map=new HashMap<>();map.put("gid",serviceInfo.getGid());map.put("sid",serviceInfo.getGid());map.put("role_name",serviceInfo.getGid());map.put("role_level",serviceInfo.getGid());map.put("role_id",serviceInfo.getGid());map.put("sign",preSign.toString());OkHttpUtils.post().url(Config.SERVICE_LOGIN).params(map).build().execute(new StringCallback() {@Overridepublic void onError(Call call, Exception e, int i) {}@Overridepublic void onResponse(String s, int i) {Gson gson=new Gson();BackInfo backInfo=gson.fromJson(s,BackInfo.class);if(backInfo.getCode()==200){lisenter.serviceLoginSuccess();}}});}

区服登录调用

   private void servicelogin() {ServiceInfo serviceInfo=new ServiceInfo();serviceInfo.setGid("11");serviceInfo.setRole_id("11");serviceInfo.setRole_name("齐天大圣");serviceInfo.setRole_level("1000");serviceInfo.setSid("1234");NineFunSdk.getInstance().serviceLogin(serviceInfo, new ServiceListener() {@Overridepublic void serviceLoginSuccess() {}@Overridepublic void serviceLoginError() {}});

同理 等级变化更新也是一样的 我就不展开讲了。

  • 打包 har

安卓本地库是aar 华为是har 最早以前我用eclipse 开发的时候我是分开打的 jar包和资源 用了android studio 就打包aar了 鸿蒙和安卓差不多的我们需要创建一个library 的本地库

然后在打包以后在build里面 可以看到我们的har 文件

最后总结:

鸿蒙的手游sdk 开发 和安卓的手游sdk开发比较类似 不过这里的SDK里面的界面我用的是弹窗 但是在安卓里面我用的是透明的视图activity 安卓里面你也可以用弹窗 这个看具体实现。整个的开发难度不大主要是对外接口的设计 还有就是避免使用三方库 还有就是代码的混淆,对外类和对外接口我们一定不能混淆否则会导致本地库不能正常接入。 最后希望我的文章能帮助到各位解决问题 ,以后我还会贡献更多有用的代码分享给大家。各位同学如果觉得文章还不错 ,麻烦给关注和star,小弟在这里谢过啦!

鸿蒙 手游sdk 开发教程相关推荐

  1. android手游sdk开发教程,Android SDK开发基本教程

    一.本文章总计460字,需要花费您5分钟时间进行阅读. A.先来理解SDK开发的基本流程.首先,在你的Project中新建一个module,指定为Android Library.再新建一个Activi ...

  2. 手游sdk开发有哪些功能?

    在游戏对接的时候,由于不同的游戏要接入不同的SDK,这些SDK参数多,接口不统一,而且更新和维护费用也很高.SDK现在的功能,就是在频道上建立一个统一的界面,让所有的用户家都能对接游戏. 手游SDK大 ...

  3. 关于android手游Sdk开发的专题(一)

    随着手游行业的蓬勃发展,以及各大IP加入,对于Android手游插件sdk的开发也多了起来. 下面我将给大家分享手游插件的开发细节 1.sdk开发与传统的app开发的不同点 首先做为sdk由于要兼容e ...

  4. 手游SDK到底是什么?

    一.SDK概念 SDK,即Software Development Kit,软件开发工具包的意思,通俗点说,就是辅助开发某一类软件的相关文档.范例和工具的集合,不过我们平时所说到的sdk其实会更加简单 ...

  5. 手游SDK是什么意思,可以解决哪些问题?

    SDK一般是指软件开发工具包(Software Development Kit),是软件工程师为项目特定的项目准备的软件包.软件框架.硬件平台.操作系统等建立应用软件时的开发工具的集合. 手游SDK是 ...

  6. Android手游SDK那点事(四)聚合打包

    更新: 聚合SDK 我们的SDK其实也可以称为聚合SDK,所谓聚合,就是CP游戏方接入聚合SDK,然后通过打包工具将游戏分发到更多渠道上,我们的SDK也有这个能力,相对渠道少一点 分发渠道包 以下操作 ...

  7. Android手游SDK那点事(二)SDK项目结构设计(初版,废弃)

    项目构建 上一个完整架构图 以KSDK为名称模拟项目构建 项目建议: 1.这里游戏sdk不使用mvp或者mmvm的方式,其实这两种模式开发者在开发应用的时候不要盲目的使用,根据自己项目业务情况选择一个 ...

  8. 手游SDK相关业务知识

    最近一直在做公司自研的手游SDK以及手游SDK发行平台,现年底闲下来整理一下SDK相关的知识 1.什么是SDK SDK,即Software Development Kit,软件开发工具包的意思,就是辅 ...

  9. Android手游SDK那点事(一)简述

    常见名词 CP:游戏厂商,就是开发游戏的,一般情况下CP常常指提供游戏的一方,不一定是研发,只要接入我们SDK,提供给我们游戏,你就是CP. 发行:代理游戏产品,进行渠道的发行. SDK:这里指游戏开 ...

最新文章

  1. PyTorch 笔记(02)— 常用创建 Tensor 方法(torch.Tensor、ones、zeros、eye、arange、linspace、rand、randn、new)
  2. 如何将SQL Server表驻留内存和检测
  3. 思科预计全球云数据流量将以66%的混合年增长率递增
  4. Spotify如何对Apache Storm进行规模扩展
  5. ESXI使用记录---安装vSphere(VCSA)
  6. cache/TLB里分别都有什么?
  7. 力扣 136. 只出现一次的数字 【异或运算】
  8. Springboot简单应用
  9. 【转】numpy-array自带的迭代器-----np.nditer
  10. 配置MongoDB复制集
  11. Unity3D如何有效地组织代码?(转)
  12. C++11保护共享数据的其他方法
  13. ESXI 6.7安装并部署主机
  14. 编程范式之字符和基本类型
  15. 杭电 hdu 3343
  16. JAVA关键字及作用
  17. ROI和widthStep
  18. 今日头条定位融资商业计划书
  19. oracle 19c pdb cdb,12c、19c 从 no-cdb升级到pdb步骤
  20. C++中的常成员函数以及const用于函数重载

热门文章

  1. 运用php做程序,PHP编程在WAP开发中的运用
  2. CPU 运行频率监控
  3. (1)一次意外的屠魔之旅
  4. MIT制作迷你猎豹机器人 将机器人丢出去可以自动著陆
  5. 中职计算机专业可以考什么大学,中职生可以考哪些大学?
  6. PMAC应用一简单介绍
  7. HDoj 2604 queuing
  8. ubuntu卸载旧的NVIDIA驱动,安装新驱动,并安装Nvidia-docker2
  9. 如何给TSM磁带机添加新磁带
  10. 2015年职称计算机考试宝典,2015年度职称计算机考试宝典.doc