注册流转任务管理服务成功后,无法推荐设备或选择设备列表接口未返回任何设备
现象描述
注册流转任务管理服务成功后,无对应的推荐设备。调用选择设备列表接口,未返回任何设备。
可能原因
设备过滤条件不对,将设备过滤掉了。
解决办法
检查设备过滤条件,具体过滤条件参数说明,可以参考开发指导接口说明中ExtraParams说明。
在选择设备列表选择设备,并调用更新设备连接状态的接口后,列表中设备连接状态没有刷新
现象描述
在选择设备列表选择设备,并调用更新设备连接状态的接口后,列表中设备连接状态没有刷新。
可能原因
没有在UI主线程中调用更新设备连接状态的接口,导致界面内容不刷新。
解决办法
检查是否在UI主线程中调用更新设备连接状态接口。
设备不支持流转任务管理服务时如何实现跨端迁移
这种情况下实现跨端迁移时,需要指定对端设备的deviceId。开发者可通过设备管理类DeviceManager提供的getTrustedDeviceList接口,获取指定条件下匿名化处理的设备列表。getTrustedDeviceList可参考ohos.distributedhardware.devicemanager.DeviceManager的API描述。
之后,开发者需要自行实现流转任务管理,即设备选择、流转状态管理等。
操作步骤如下。
在对应的config.json文件中,声明获取设备列表及设备信息的权限。
{
“reqPermissions”: [
{
“name”: “ohos.permission.DISTRIBUTED_DATASYNC”,
“reason”: “need”,
“usedScene”: {
“ability”: [
“MainAbility”
],
“when”: “inuse”
}
},
{
“name”: “com.huawei.permission.ACCESS_SERVICE_DM”,
“reason”: “need”,
“usedScene”: {
“ability”: [
“MainAbility”
],
“when”: “inuse”
}
}
]
}
通过getTrustedDeviceList接口获取设备列表,用于指定目标设备。
// 设备列表按最近使用排序
int MOST_RECENTLY_USED = 0;
// 获取设备管理类
ohos.distributedhardware.devicemanager.DeviceManager devManager;
// ISelectResult是一个自定义接口,用来处理指定设备deviceId后执行的行为
interface ISelectResult {
void onSelectResult(String deviceId);
}
public void onStart(Intent intent) {
….
// 调用DeviceManager的getTrustedDeviceList接口获取在线设备列表
ohos.distributedhardware.devicemanager.DeviceManager.createInstance(new ohos.distributedhardware.devicemanager.DeviceManager.DeviceManagerCallback() {
public void onGet(ohos.distributedhardware.devicemanager.DeviceManager deviceManager) {
devManager = deviceManager;
}
public void onDied() {
HiLog.info(LABEL_LOG, “DeviceManager onDied call.”);
}
});
}
// 获取设备列表,开发者可在获取的在线设备列表中选择目标设备执行操作
private void scheduleRemoteAbility(ISelectResult listener) {
Map<String, Object> filter = new HashMap<>();
filter.put(ohos.distributedhardware.devicemanager.DeviceManager.TARGET_PACKAGE_NAME, BUNDLE_NAME);
filter.put(ohos.distributedhardware.devicemanager.DeviceManager.SORT_TYPE, MOST_RECENTLY_USED);
if (devManager ==null) {
HiLog.info(LABEL_LOG, “scheduleRemoteAbility devManager is null”);
return;
}
List<DeviceInfo> onlineDevices = devManager.getTrustedDeviceList(BUNDLE_NAME, filter);
// 判断组网设备是否为空
if (onlineDevices.isEmpty()) {
listener.onSelectResult(null);
return;
}
int numDevices = onlineDevices.size();
List<String> deviceIds = new ArrayList<>(numDevices);
onlineDevices.forEach((device) -> {
deviceIds.add(device.getNetworkId());
});
// 以选择首个设备作为目标设备为例
// 开发者也可按照具体场景,通过其它方式进行设备选择
String selectedDeviceId = deviceIds.get(0);
listener.onSelectResult(selectedDeviceId);
}
实现跨端迁移。
// 跨设备迁移FA
// 本地FA设置当前运行任务
private ClickedListener mContinueAbilityListener = new ClickedListener() {
public void onClick(Component arg0) {
// 用户选择设备后实现业务迁移
scheduleRemoteAbility(new ISelectResult() {
public void onSelectResult(String deviceId) {
continueAbility(deviceId);
}
});
}
};