日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

鸿蒙 手游sdk 开发教程

發(fā)布時間:2023/12/8 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 鸿蒙 手游sdk 开发教程 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

前言 :

各位同學的大家好 , 最近在學習鴻蒙開發(fā), 因為我是從事手游SDK 開發(fā)的 之前也寫過iOS 手游sdk 開發(fā)和安卓手游sdk 開發(fā)(kotlin 版本)

效果圖:


設(shè)計思路

我們需要封裝 init login servicelogin updateuserinfo 等對外接口給到游戲去調(diào)用

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,"請先調(diào)用初始化");}}/***** @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();}}});} }

登錄框?qū)崿F(xiàn):

  • 布局

<?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;/**** 創(chuàng)建人:xuqing* 創(chuàng)建時間: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,"請先調(diào)用初始化");}}
  • 登錄調(diào)用

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

登錄彈窗 里面邏輯也比較簡單就是游戲在外部調(diào)用SDK 我們在初始化成功以后 我們顯示登錄彈窗 。然后用戶輸入賬號密碼 我們?nèi)サ卿?請求服務(wù)器 如果登錄成功我們將服務(wù)器返回數(shù)據(jù)結(jié)構(gòu)回調(diào)給游戲游戲拿到token和userid 去請求api/token驗證接口進行驗證登錄效果即可

區(qū)服上報接口

/***** @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();}}});}

區(qū)服登錄調(diào)用

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 開發(fā)的時候我是分開打的 jar包和資源 用了android studio 就打包aar了 鴻蒙和安卓差不多的我們需要創(chuàng)建一個library 的本地庫

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

最后總結(jié):

鴻蒙的手游sdk 開發(fā) 和安卓的手游sdk開發(fā)比較類似 不過這里的SDK里面的界面我用的是彈窗 但是在安卓里面我用的是透明的視圖activity 安卓里面你也可以用彈窗 這個看具體實現(xiàn)。整個的開發(fā)難度不大主要是對外接口的設(shè)計 還有就是避免使用三方庫 還有就是代碼的混淆,對外類和對外接口我們一定不能混淆否則會導致本地庫不能正常接入。 最后希望我的文章能幫助到各位解決問題 ,以后我還會貢獻更多有用的代碼分享給大家。各位同學如果覺得文章還不錯 ,麻煩給關(guān)注和star,小弟在這里謝過啦!

總結(jié)

以上是生活随笔為你收集整理的鸿蒙 手游sdk 开发教程的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。