文档开发者中心
我的

#HarmonyOS挑战赛第三期#1024程序员节,分布式协同-你画我猜

“#我正在参加HarmonyOS线上Codelabs系列挑战赛”


应活动要求 

本期挑战赛将继续围绕HarmonyOS的分布式特性展开。大家可以发挥奇思妙想,构建一款互动体验应用,应用需实现最少两台设备间的互动。大家可以根据自己的需求构建应用,可以是合成1024有趣的互动应用,也可以是绘画多屏互动应用等。

重点要突出  多屏的互动要求,那也就是又分布式协同的技术在里面,而不是之前的流转 ,

个人心得:如有错误还请大佬及时指正  .

分布式流转:  一个APP应用再设备之间互相拉起迁移 ,只在   一个  ! 终端上运行.

分布式协同: 一个APP   同时  ! 在多个设备上运行 ,画面实时共享,数据实时传输.

首先有个很重要的事情那就是验权 

1.这个分布式协同会用到一个权限接口  去MainAbilitySlice里面申请

分布式数据管理

ohos.permission.DISTRIBUTED_DATASYNC

允许不同设备间的数据交换。

收起
自动换行
深色代码主题
复制

void grantPermission() { //获取验证权限 数据交互 允许不同设备间的数据交换。 if (verifySelfPermission(DISTRIBUTED_DATASYNC) != IBundleManager.PERMISSION_GRANTED) { if (canRequestPermission(DISTRIBUTED_DATASYNC)) { requestPermissionsFromUser(new String[] {DISTRIBUTED_DATASYNC}, PERMISSION_CODE); } } }

文档链接: 权限接口

2.申请了权限然后就要去验证权限,那么是在config.json文件里 

收起
自动换行
深色代码主题
复制

{ "name": "ohos.permission.DISTRIBUTED_DEVICE_STATE_CHANGE" //允许获取分布式组网内设备的状态变化。 }, { "name": "ohos.permission.GET_DISTRIBUTED_DEVICE_INFO" // 允许获取分布式组网内的设备列表和设备信息。 }, { "name": "ohos.permission.GRT_BUNDLE_INFO" //查询其他应用的信息。 }, { "name": "ohos.permission.INTERNET" //允许使用网络socket。 }

文档链接: 权限开发指导

权限名

说明

ohos.permission.GET_NETWORK_INFO

允许应用获取数据网络信息。

ohos.permission.GET_WIFI_INFO

允许获取WLAN信息。

ohos.permission.USE_BLUETOOTH

允许应用查看蓝牙的配置。

ohos.permission.DISCOVER_BLUETOOTH

允许应用配置本地蓝牙,并允许其查找远端设备且与之配对连接。

ohos.permission.SET_NETWORK_INFO

允许应用控制数据网络。

ohos.permission.SET_WIFI_INFO

允许配置WLAN设备。

ohos.permission.SPREAD_STATUS_BAR

允许应用以缩略图方式呈现在状态栏。

ohos.permission.INTERNET

允许使用网络socket。

ohos.permission.MODIFY_AUDIO_SETTINGS

允许应用程序修改音频设置。

ohos.permission.RECEIVER_STARTUP_COMPLETED

允许应用接收设备启动完成广播。

ohos.permission.RUNNING_LOCK

允许申请休眠运行锁,并执行相关操作。

ohos.permission.ACCESS_BIOMETRIC

允许应用使用生物识别能力进行身份认证。

ohos.permission.RCV_NFC_TRANSACTION_EVENT

允许应用接收卡模拟交易事件。

页面结构 

image.png

在resources下面的 

graphic:页面样式效果调配

layoput:此demo的java UI页面布局结构

主页面入口布局代码   ability_main

收起
自动换行
深色代码主题
复制

<?xml version="1.0" encoding="utf-8"?><DirectionalLayout xmlns:ohos="http://schemas.huawei.com/res/ohos" ohos:height="match_parent" ohos:width="match_parent" ohos:orientation="vertical" ohos:background_element="$graphic:background_button"> <Text ohos:height="match_content" ohos:width="match_content" ohos:top_margin="150px" ohos:layout_alignment="horizontal_center" ohos:text=" 你好鸿蒙_你画我猜" ohos:text_size="38fp" /> <Image ohos:id="$+id:imageComponent" ohos:height="200vp" ohos:width="1080" ohos:top_margin="150px" ohos:image_src="$media:HM" /> <Button ohos:id="$+id:help_btn" ohos:height="100vp" ohos:width="300vp" ohos:background_element="$graphic:background_button" ohos:layout_alignment="horizontal_center" ohos:left_padding="15vp" ohos:right_padding="15vp" ohos:text="进入游戏" ohos:text_size="30vp" ohos:top_margin="20vp"> </Button></DirectionalLayout>

游戏匹配页面布局 math_game

收起
自动换行
深色代码主题
复制

<?xml version="1.0" encoding="utf-8"?><DirectionalLayout xmlns:ohos="http://schemas.huawei.com/res/ohos" ohos:height="match_parent" ohos:width="match_parent" ohos:orientation="vertical"> <Button ohos:id="$+id:help_btn" ohos:height="match_content" ohos:width="500px" ohos:background_element="$graphic:background_begin" ohos:layout_alignment="horizontal_center" ohos:left_padding="15vp" ohos:right_padding="15vp" ohos:text="匹配对手" ohos:text_size="30vp" ohos:top_margin="200vp"> </Button> <Image ohos:id="$+id:imageComponent" ohos:height="200vp" ohos:width="1080" ohos:top_margin="100px" ohos:image_src="$media:NHWC" /></DirectionalLayout>

MainAbilitySlice

收起
自动换行
深色代码主题
复制


package com.huawei.codelab.slice;import static ohos.security.SystemPermission.DISTRIBUTED_DATASYNC;import com.huawei.codelab.ResourceTable;import com.huawei.codelab.utils.CommonData;import com.huawei.codelab.utils.LogUtil;import ohos.aafwk.ability.AbilitySlice;import ohos.aafwk.content.Intent;import ohos.aafwk.content.Operation;import ohos.agp.components.Component;import ohos.bundle.IBundleManager;public class MainAbilitySlice extends AbilitySlice { private static final String TAG = CommonData.TAG + MainAbilitySlice.class.getSimpleName(); private static final int PERMISSION_CODE = 10000000; @Override public void onStart(Intent intent) { super.onStart(intent); super.setUIContent(ResourceTable.Layout_ability_main); grantPermission(); initView(); } void grantPermission() { //获取验证权限 数据交互 允许不同设备间的数据交换。 if (verifySelfPermission(DISTRIBUTED_DATASYNC) != IBundleManager.PERMISSION_GRANTED) { if (canRequestPermission(DISTRIBUTED_DATASYNC)) { requestPermissionsFromUser(new String[] {DISTRIBUTED_DATASYNC}, PERMISSION_CODE); } } }// private void initView() { findComponentById(ResourceTable.Id_help_btn).setClickedListener(new ButtonClick()); } private void mathGame() { //数学游戏 LogUtil.info(TAG, "Click ResourceTable Id_math_game"); Intent mathGameIntent = new Intent(); Operation operationMath = new Intent.OperationBuilder().withBundleName(getBundleName()) .withAbilityName(CommonData.ABILITY_MAIN) .withAction(CommonData.MATH_PAGE) .build(); mathGameIntent.setOperation(operationMath); startAbility(mathGameIntent); } //进入游戏 private class ButtonClick implements Component.ClickedListener { @Override public void onClick(Component component) { mathGame(); } }}

MathGameAbilitySlice

收起
自动换行
深色代码主题
复制


package com.huawei.codelab.slice;import com.huawei.codelab.ResourceTable;import com.huawei.codelab.devices.SelectDeviceDialog;import com.huawei.codelab.utils.CommonData;import com.huawei.codelab.utils.LogUtil;import ohos.aafwk.ability.AbilitySlice;import ohos.aafwk.content.Intent;import ohos.aafwk.content.Operation;import ohos.agp.components.Button;import ohos.agp.components.Component;import ohos.data.distributed.common.KvManagerConfig;import ohos.data.distributed.common.KvManagerFactory;import ohos.distributedschedule.interwork.DeviceInfo;import ohos.distributedschedule.interwork.DeviceManager;import java.util.ArrayList;import java.util.List;public class MathGameAbilitySlice extends AbilitySlice { private static final String TAG = CommonData.TAG + MathGameAbilitySlice.class.getSimpleName(); private Button helpBtn; private List<DeviceInfo> devices = new ArrayList<>(); @Override public void onStart(Intent intent) { super.onStart(intent); super.setUIContent(ResourceTable.Layout_math_game); initView(); } private void initView() { if (findComponentById(ResourceTable.Id_help_btn) instanceof Button) { helpBtn = (Button) findComponentById(ResourceTable.Id_help_btn); } helpBtn.setClickedListener(new ButtonClick()); } private void getDevices() { if (devices.size() > 0) { devices.clear(); } List<DeviceInfo> deviceInfos = DeviceManager.getDeviceList(ohos.distributedschedule.interwork.DeviceInfo.FLAG_GET_ONLINE_DEVICE); LogUtil.info(TAG, "MathGameAbilitySlice deviceInfos size is :" + deviceInfos.size()); devices.addAll(deviceInfos); showDevicesDialog(); } private void showDevicesDialog() { new SelectDeviceDialog(this, devices, deviceInfo -> { startLocalFa(deviceInfo.getDeviceId()); startRemoteFa(deviceInfo.getDeviceId()); }).show(); } private void startLocalFa(String deviceId) { LogUtil.info(TAG, "startLocalFa......"); Intent intent = new Intent(); intent.setParam(CommonData.KEY_REMOTE_DEVICEID, deviceId); intent.setParam(CommonData.KEY_IS_LOCAL, true); Operation operation = new Intent.OperationBuilder().withBundleName(getBundleName()) .withAbilityName(CommonData.ABILITY_MAIN) .withAction(CommonData.DRAW_PAGE) .build(); intent.setOperation(operation); startAbility(intent); } private void startRemoteFa(String deviceId) { LogUtil.info(TAG, "startRemoteFa......"); String localDeviceId = KvManagerFactory.getInstance().createKvManager(new KvManagerConfig(this)).getLocalDeviceInfo().getId(); Intent intent = new Intent(); intent.setParam(CommonData.KEY_REMOTE_DEVICEID, localDeviceId); intent.setParam(CommonData.KEY_IS_LOCAL, false); Operation operation = new Intent.OperationBuilder().withDeviceId(deviceId) .withBundleName(getBundleName()) .withAbilityName(CommonData.ABILITY_MAIN) .withAction(CommonData.DRAW_PAGE) .withFlags(Intent.FLAG_ABILITYSLICE_MULTI_DEVICE) .build(); intent.setOperation(operation); startAbility(intent); } private class ButtonClick implements Component.ClickedListener { @Override public void onClick(Component component) { getDevices();//启动机器匹配 } }}
点赞
5
收藏
6
回复
3
分享
举报
浏览1097 发布于2021-10-19 08:31未知归属地
全部评论
最多点赞
最新发布
最早发布
认真审题了,这才是真分布式协同.  辛苦大佬
1
2楼回复于2021-10-19 11:44 未知归属地
  • 人土土
    是的  协同和流转不一样 ,在官方的学员用书里面有很详细的解释, 需要分布式数据管理 软总线 调度 等等 系统层支持的功能
    2021-10-19 11:48 未知归属地
大佬文章如此优秀,过来点赞支持一下!
1楼回复于2021-10-19 08:43 未知归属地
写回答
新增插入模板功能
一键使用模板,快速填写内容,轻松发帖~
知道了
  • 为了保障您的信息安全,请勿上传您的敏感个人信息(如您的密码等信息)和您的敏感资产信息(如关键源代码、签名私钥、调试安装包、业务日志等信息),且您需自行承担由此产生的信息泄露等安全风险。
  • 如您发布的内容为转载内容,请注明内容来源。

我要发帖子

目录 收起
应活动要求
首先有个很重要的事情那就是验权
页面结构
了解社区公约,与您携手共创和谐专业的开发者社区。