前言 :
各位同學(xué)的大家好 循头, 最近在學(xué)習(xí)鴻蒙開(kāi)發(fā), 因?yàn)槲沂菑氖率钟蜸DK 開(kāi)發(fā)的 之前也寫(xiě)過(guò)iOS 手游sdk 開(kāi)發(fā)和安卓手游sdk 開(kāi)發(fā)(kotlin 版本)
效果圖:
設(shè)計(jì)思路
我們需要封裝 init login servicelogin updateuserinfo 等對(duì)外接口給到游戲去調(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() {
@Override
public void onError(Call call, Exception e, int i) {
listener.initError();
}
@Override
public 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,"請(qǐng)先調(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() {
@Override
public void onError(Call call, Exception e, int i) {
}
@Override
public 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() {
@Override
public void onError(Call call, Exception e, int i) {
}
@Override
public 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"?>
<DependentLayout
xmlns:ohos="http://schemas.huawei.com/res/ohos"
ohos:height="240vp"
ohos:width="300vp"
ohos:alignment="center"
>
<DirectionalLayout
ohos:height="match_parent"
ohos:width="match_parent"
ohos:left_margin="20vp"
ohos:right_margin="20vp"
ohos:orientation="vertical"
>
<DirectionalLayout
ohos:height="60vp"
ohos:width="match_parent"
ohos:orientation="horizontal"
>
<Text
ohos:id="$+id:text_account"
ohos:height="35vp"
ohos:width="35vp"
ohos:layout_alignment="center"
ohos:text="賬號(hào)"
ohos:text_alignment="horizontal_center"
ohos:text_size="15vp"
ohos:text_color="#000000"
ohos:top_margin="10vp"
/>
<TextField
ohos:id="$+id:tf_account"
ohos:height="40vp"
ohos:width="match_parent"
ohos:hint="請(qǐng)輸入賬號(hào)"
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>
<DirectionalLayout
ohos:height="60vp"
ohos:width="match_parent"
ohos:orientation="horizontal"
>
<Text
ohos: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"
/>
<TextField
ohos:id="$+id:tf_password"
ohos:height="40vp"
ohos:width="match_parent"
ohos:hint="請(qǐng)輸入密碼"
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>
<DirectionalLayout
ohos:height="match_parent"
ohos:width="match_parent"
ohos:orientation="horizontal"
ohos:top_margin="20vp"
>
<Button
ohos:id="$+id:registerbtn"
ohos:height="40vp"
ohos:width="0vp"
ohos:background_element="$graphic:background_btn_blue"
ohos:text_color="#ffffff"
ohos:text="快速注冊(cè)"
ohos:weight="1"
ohos:left_margin="10vp"
ohos:right_margin="10vp"
ohos:text_size="15vp"
>
</Button>
<Button
ohos: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)建時(shí)間:2022年5月12日11:55:53
* 類(lèi)說(shuō)明: 登錄彈窗
*
*/
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() {
@Override
public 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,"賬號(hào)密碼不能為空");
}
}
});
}
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() {
@Override
public void onError(Call call, Exception e, int i) {
System.out.println("Exception --- > "+e);
}
@Override
public 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();
}
}
});
}
}
-
登錄對(duì)外接口
public void checkLogin(Context context, LoginLisenter lisenter){
if(initFlag){
LoginDialog loginDialog = new LoginDialog(context,lisenter);
loginDialog.show();
}else{
ToastUtils.showInfo(context,"請(qǐng)先調(diào)用初始化");
}
}
-
登錄調(diào)用
private void login() {
NineFunSdk.getInstance().checkLogin(MainAbility.this, new LoginLisenter() {
@Override
public void loginSuccess(String data) {
System.out.println("data --- > "+data );
}
@Override
public void loginError() {
}
});
}
登錄彈窗 里面邏輯也比較簡(jiǎn)單就是游戲在外部調(diào)用SDK 我們?cè)诔跏蓟晒σ院?我們顯示登錄彈窗 止潮。然后用戶(hù)輸入賬號(hào)密碼 我們?nèi)サ卿?請(qǐng)求服務(wù)器 如果登錄成功我們將服務(wù)器返回?cái)?shù)據(jù)結(jié)構(gòu)回調(diào)給游戲游戲拿到token和userid 去請(qǐng)求api/token驗(yàn)證接口進(jìn)行驗(yàn)證登錄效果即可
區(qū)服上報(bà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() {
@Override
public void onError(Call call, Exception e, int i) {
}
@Override
public 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() {
@Override
public void serviceLoginSuccess() {
}
@Override
public void serviceLoginError() {
}
});
同理 等級(jí)變化更新也是一樣的 我就不展開(kāi)講了。
-
打包 har
安卓本地庫(kù)是aar 華為是har 最早以前我用eclipse 開(kāi)發(fā)的時(shí)候我是分開(kāi)打的 jar包和資源 用了android studio 就打包aar了 鴻蒙和安卓差不多的我們需要?jiǎng)?chuàng)建一個(gè)library 的本地庫(kù)
然后在打包以后在build里面 可以看到我們的har 文件
最后總結(jié):
鴻蒙的手游sdk 開(kāi)發(fā) 和安卓的手游sdk開(kāi)發(fā)比較類(lèi)似 不過(guò)這里的SDK里面的界面我用的是彈窗 但是在安卓里面我用的是透明的視圖activity 安卓里面你也可以用彈窗 這個(gè)看具體實(shí)現(xiàn)。整個(gè)的開(kāi)發(fā)難度不大主要是對(duì)外接口的設(shè)計(jì) 還有就是避免使用三方庫(kù) 還有就是代碼的混淆,對(duì)外類(lèi)和對(duì)外接口我們一定不能混淆否則會(huì)導(dǎo)致本地庫(kù)不能正常接入屿附。 最后希望我的文章能幫助到各位解決問(wèn)題 ,以后我還會(huì)貢獻(xiàn)更多有用的代碼分享給大家哥童。各位同學(xué)如果覺(jué)得文章還不錯(cuò) 挺份,麻煩給關(guān)注和star,小弟在這里謝過(guò)啦!