DeviceManager.initDistributedEnvironment初始化分布式环境调用异常

有人调用过这个接口吗,目前我调了之后,没有回调返回,也catch不到异常。

harmony
2021-07-02 11:51:24
浏览
收藏 0
回答 1
待解决
回答 1
按赞同
/
按时间
红叶亦知秋

楼主您好,这个问题给您提供两种解决方式,第一种是目前主推的,可以满足灵活多变的组网要求,第二种是您目前的方式,并解决您现在代码的问题,但已经不推荐

第一种:流转方式组网

同一网络下, 账号的设备发现参考如下:

1.开启A,B设备的wifi,蓝牙

2.MainAbility中实现IAbilityContinuation

3.在FA对应的config.json中声明多设备协同访问的权限:ohos.permission.DISTRIBUTED_DATASYNC

4.FA的onStart()中,调用requestPermissionsFromUser()方法向用户申请权限

5.设置流转任务管理服务回调函数,注册流转任务管理服务,管理流转的目标设备,同时需要在流转结束时解注册流转任务管理服务

6.通过流转任务管理服务提供的showDeviceList()接口获取选择设备列表,用户选择设备后在IContinuationDeviceCallback回调中获取设备ID

参考代码如下:

config.js
{
    "module": {
        "reqPermissions": [{"name": "ohos.permission.DISTRIBUTED_DATASYNC" }],
        ...
    }
    ...
}
MainAbility
public class MainAbility extends Ability implements IAbilityContinuation {
    ...
    @Override
    public void onStart(Intent intent) {
...
        // 开发者显示声明需要使用的权限
        requestPermissionsFromUser(new String[]{"ohos.permission.DISTRIBUTED_DATASYNC"}, 0);
    }
}
MainAbilitySlice
public class MainAbilitySlice extends AbilitySlice {
    private static final HiLogLabel LABEL_LOG = new HiLogLabel(3, 0xD001100, "MainAbilitySlice");
    // 注册流转任务管理服务后返回的Ability token
    private int abilityToken;
    // 获取流转任务管理服务管理类
    private IContinuationRegisterManager continuationRegisterManager;
    @Override
    public void onStart(Intent intent) {
        ...
        continuationRegister();
        // 点击按钮,触发发现设备方法
        findComponentById(ResourceTable.Id_button).setClickedListener(component -> showDeviceList());
    }
    //初始化设备注册
    private void continuationRegister() {
        continuationRegisterManager = getContinuationRegisterManager();
        // 增加过滤条件
        ExtraParams params = new ExtraParams();
        String[] devTypes = new String[]{ExtraParams.DEVICETYPE_SMART_PAD,
                ExtraParams.DEVICETYPE_SMART_PHONE};
        params.setDevType(devTypes);
        // jsonParams 主要用于设置过滤参数,groupType':'1|256'不要求同账号
        String jsonParams = "{'filter':{'commonFilter':{'system':{'harmonyVersion':'2.0.0'},'groupType':'1|256','curComType': 0x00030004,'faFilter':'{\"targetBundleName\": \"com.xxx.yyy\"}'}},'transferScene':1,'remoteAuthenticationDescription': '拉起HiVision扫描弹框描述','remoteAuthenticationPicture':''}";
        params.setJsonParams(jsonParams);
        // 注册FA流转管理服务
        continuationRegisterManager.register(getBundleName(), params, callback, requestCallback);
    }
    // 设置监听FA流转管理服务设备状态变更的回调
    private IContinuationDeviceCallback callback = new IContinuationDeviceCallback() {
        @Override
        public void onDeviceConnectDone(String deviceId, String s1) {
            getUITaskDispatcher().asyncDispatch(() -> {
                LogUtils.info("324s43","deviceId:"+deviceId);
                continuationRegisterManager.updateConnectStatus(abilityToken,
                        deviceId, DeviceConnectState.IDLE.getState(), null);
            });
        }
        @Override
        public void onDeviceDisconnectDone(String deviceId) {
        }
    };
    // 设置注册FA流转管理服务服务回调
    private RequestCallback requestCallback = new RequestCallback() {
        @Override
        public void onResult(int result) {
            abilityToken = result;
        }
    };
    /**
     * 显示流转设备列表
     */
    private void showDeviceList() {
        ExtraParams extraParams = new ExtraParams();
        extraParams.setDevType(new String[]{ExtraParams.DEVICETYPE_SMART_TV,
                ExtraParams.DEVICETYPE_SMART_PAD,
                ExtraParams.DEVICETYPE_SMART_PHONE});
        extraParams.setDescription("小设备合成");
        continuationRegisterManager.showDeviceList(abilityToken, extraParams, null);
    }
}
详细操作与参数设置请参考官方文档:
https://developer.harmonyos.com/cn/docs/documentation/doc-guides/hop-multi-device-collaboration-guidelines-0000001139737211
第二种:传统方式
public class MainAbilitySlice extends AbilitySlice {
    private Button btn;
    @Override
    public void onStart(Intent intent) {
        super.onStart(intent);
        super.setUIContent(ResourceTable.Layout_ability_main);
        btn = (Button) findComponentById(ResourceTable.Id_button);
        btn.setClickedListener(component -> {
            SelectDeviceDialog selectDeviceDialog = showDialog();
            selectDeviceDialog.initDialog();
            selectDeviceDialog.show();
        });
    }
    // 设备选择弹出框
    private SelectDeviceDialog showDialog() {
        SelectDeviceDialog selectDeviceDialog = new SelectDeviceDialog(this, new SelectDeviceDialog.SelectResultListener() {
            public void callBack(List<DeviceInfo> deviceInfos) {
                for (DeviceInfo deviceInfo : deviceInfos) {
                  try {
                        DeviceManager.initDistributedEnvironment(deviceInfo.getDeviceId(), new IInitCallback() {
                            @Override
                            public void onInitSuccess(String s) {
                                System.out.print("showDevicesDialogonInitSuccess");
                                WidgetHelper.showTips(getAbility(),"onInitSuccess");
                            }
                            @Override
                            public void onInitFailure(String s, int i) {
                                System.out.print("showDevicesDialogonInitFailure");
                                WidgetHelper.showTips(getAbility(),"onInitFailure");
                            }
                        });
                    } catch (RemoteException e) {
                        e.printStackTrace();
                    }
                    Intent intent = new Intent();
                    Operation operation = new Intent.OperationBuilder()
                            .withDeviceId(deviceInfo.getDeviceId())
                            .withBundleName(getBundleName())
                            .withAbilityName(MainAbility.class.getName())
                            .withFlags(Intent.FLAG_ABILITYSLICE_MULTI_DEVICE)
                            .build();
                    intent.setOperation(operation);
                    startAbility(intent);
                }
            }
        });
        return selectDeviceDialog;
    }
}

按照这样写onInitSuccess方法能进入,程序也没出错

selectDeviceDialog对话框布局与initDialog()方法详情请参考:

https://developer.huawei.com/consumer/cn/codelabsPortal/carddetails/HarmonyOS-DistributedGamepad

代码地址:

https://gitee.com/openharmony/codelabs/tree/master/DistributionGamePad-master

https://github.com/huaweicodelabs/harmonyos-codelabs/tree/main/DistributionGamePad

 

 

已于2021-7-5 16:59:43修改
分享
微博
QQ
微信
回复1
2021-07-05 16:51:22
相关问题
请问如何实现异地分布式组网?
1360浏览 • 1回复 待解决
分布式软总线能否支持全协议
3248浏览 • 1回复 已解决
鸿蒙系统是如何实现分布式的?
6304浏览 • 2回复 待解决
求教大神,分布式软总线的流程问题
3229浏览 • 1回复 已解决
Hi3516进行分布式流转无法获取设备?
1455浏览 • 2回复 待解决
关于鸿蒙分布式数据库key疑问
1121浏览 • 1回复 待解决
JS调用PA出现RemoteInterfaceProxy异常
1487浏览 • 2回复 待解决
可信执行环境是什么?
2393浏览 • 1回复 已解决
import Sample 里异常显示
1096浏览 • 1回复 待解决
烧录捕获到异常信息,怎么解决?
2945浏览 • 2回复 待解决