0
点赞
收藏
分享

微信扫一扫

uniapp 用web-view 嵌套uniapp

启动远程PageAbility同样通过featureAbility中的startAbility接口实现。

除引入’@ohos.ability.featureAbility’外,还需引入’@ohos.distributedHardware.deviceManager’,通过DeviceManager(该组件提供帐号无关的分布式设备的认证组网能力)的getTrustedDeviceListSync接口(获取信任设备列表)获取远端的deviceId,写入want中,用于启动远程PageAbility。

由于当前DeviceManager的getTrustedDeviceListSync接口仅对系统应用开放,故现阶段非系统应用无法获取其他设备信息,无远程启动设备选择入口,远程启动Ability开发。

表1 featureAbility接口说明

接口名接口描述
startAbility(parameter: StartAbilityParameter)启动Ability。
startAbilityForResult(parameter: StartAbilityParameter)启动Ability,并在该Ability被销毁时返回执行结果。

表2 deviceManager接口说明

接口名接口描述
getTrustedDeviceListSync(): Array同步获取所有可信设备列表。

在跨设备场景下,启动远程PageAbility首先需要向用户申请数据同步的权限,相关接口说明如下:

表3 AtManager接口说明

接口名接口描述
checkAccessToken(tokenID: number, permissionName: string)
: Promise校验应用是否授予权限。使用Promise异步回调。返回值GrantStatus。建议使用checkAccessToken代替verifyAccessToken(已废弃),verifyAccessToken从API version 9开始不再维护。

表4 context接口说明


trequestpermissionsfromuser7-1)。 |

如下示例代码展示了向用户申请数据同步权限的方法:

import abilityAccessCtrl from "@ohos.abilityAccessCtrl";
import featureAbility from '@ohos.ability.featureAbility';
import bundle from '@ohos.bundle.bundleManager';
import Logger from '../../utils/Logger';

const TAG: string = 'PagePageAbilitySecond';

async requestPermission(): Promise<void> {
  Logger.info(TAG, 'RequestPermission begin');
  let array: Array<string> = ['ohos.permission.DISTRIBUTED_DATASYNC'];
  let bundleFlag = 0;
  let tokenID: number | undefined = undefined;
  let userID = 100;
  let appInfo = await bundle.getApplicationInfo('com.samples.famodelabilitydevelop', bundleFlag, userID);
  tokenID = appInfo.accessTokenId;
  let atManager = abilityAccessCtrl.createAtManager();
  let requestPermissions: Array<string> = [];
  for (let i = 0;i < array.length; i++) {
    let result = await atManager.verifyAccessToken(tokenID, array[i]);
    Logger.info(TAG, 'checkAccessToken result:' + JSON.stringify(result));
    if (result != abilityAccessCtrl.GrantStatus.PERMISSION_GRANTED) {
      requestPermissions.push(array[i]);
    }
  }
  Logger.info(TAG, 'requestPermissions:' + JSON.stringify(requestPermissions));
  if (requestPermissions.length == 0) {
    return;
  }
  let context = featureAbility.getContext();
  context.requestPermissionsFromUser(requestPermissions, 1, (error, data) => {
    Logger.info(TAG, 'error:' + error.message + ',data:' + JSON.stringify(data));
    Logger.info(TAG, 'data requestCode:' + data.requestCode);
    Logger.info(TAG, 'data permissions:' + data.permissions);
    Logger.info(TAG, 'data authResults:' + data.authResults);
  });
  Logger.info(TAG, 'RequestPermission end');
}

在获取数据同步权限后,需要获取可信设备列表,进行设备选择。

如下示例展示了通过getAvailableDeviceListSync获取可信设备列表,选择设备的方法。

import deviceManager from '@ohos.distributedDeviceManager';
import promptAction from '@ohos.promptAction';
import Logger from '../../utils/Logger';

const TAG: string = 'PagePageAbilitySecond';

@State deviceID: string = '';

getRemoteDeviceId(): void {
  let dmClass: deviceManager.DeviceManager;
  dmClass = deviceManager.createDeviceManager('com.samples.famodelabilitydevelop');
  try {
    if (typeof dmClass === 'object' && dmClass !== null) {
      let list = dmClass.getAvailableDeviceListSync();
      if (typeof (list) == undefined || list.length == 0) {
        Logger.info(TAG, 'EntryAbility onButtonClick getRemoteDeviceId err: list is null');
        return;
      }
      Logger.info(TAG, `EntryAbility onButtonClick getRemoteDeviceId success[${list.length}]:` + JSON.stringify(list[0]));
      if (list[0].networkId != undefined) {
        this.deviceID = list[0].networkId;
      }
      promptAction.showToast({
        message: this.deviceID
      });
    } else {
      Logger.info(TAG, 'EntryAbility onButtonClick getRemoteDeviceId err: dmClass is null');
    }
  } catch (error) {
    Logger.info(TAG, `getRemoteDeviceId error, error=${error}, message=${error.message}`);
  }
}

设备选择完成后,通过调用startAbility接口,显式启动远程PageAbility。

如下示例展示了通过startAbility显式启动远程PageAbility的方法。

import featureAbility from '@ohos.ability.featureAbility';
import Want from '@ohos.app.ability.Want';
import promptAction from '@ohos.promptAction';
import { BusinessError } from '@ohos.base';
import Logger from '../../utils/Logger';

const TAG: string = 'PagePageAbilitySecond';;

@State deviceID: string = '';

onStartRemoteAbility(): void {
  Logger.info(TAG, 'onStartRemoteAbility begin');
  let wantValue: Want = {
    bundleName: 'ohos.samples.distributedmusicplayer',
    abilityName: 'ohos.samples.distributedmusicplayer.MainAbility',
    deviceId: this.deviceID, // this.deviceID的获取方式在前面的示例代码中
  };
  Logger.info(TAG, 'onStartRemoteAbility want=' + JSON.stringify(wantValue));
  featureAbility.startAbility({
    want: wantValue
  }).then((data) => {
    promptAction.showToast({
      message: $r('app.string.start_remote_success_toast')
    });
    Logger.info(TAG, 'onStartRemoteAbility finished, ' + JSON.stringify(data));
  }).catch((error: BusinessError) => {
    promptAction.showToast({
      message: JSON.stringify(error)
    });
    Logger.error(TAG, 'onStartRemoteAbility failed: ' + JSON.stringify(error));
  });
  Logger.info(TAG, 'onStartRemoteAbility end');
}

为了能让大家更好的学习鸿蒙(HarmonyOS NEXT)开发技术,这边特意整理了《鸿蒙开发学习手册》(共计890页),希望对大家有所帮助:https://qr21.cn/FV7h05

《鸿蒙开发学习手册》:

如何快速入门:https://qr21.cn/FV7h05

  1. 基本概念
  2. 构建第一个ArkTS应用
  3. ……

开发基础知识:https://qr21.cn/FV7h05

  1. 应用基础知识
  2. 配置文件
  3. 应用数据管理
  4. 应用安全管理
  5. 应用隐私保护
  6. 三方应用调用管控机制
  7. 资源分类与访问
  8. 学习ArkTS语言
  9. ……

基于ArkTS 开发:https://qr21.cn/FV7h05

  1. Ability开发
  2. UI开发
  3. 公共事件与通知
  4. 窗口管理
  5. 媒体
  6. 安全
  7. 网络与链接
  8. 电话服务
  9. 数据管理
  10. 后台任务(Background Task)管理
  11. 设备管理
  12. 设备使用信息统计
  13. DFX
  14. 国际化开发
  15. 折叠屏系列
  16. ……

鸿蒙开发面试真题(含参考答案):https://qr18.cn/F781PH

鸿蒙开发面试大盘集篇(共计319页):https://qr18.cn/F781PH

1.项目开发必备面试题
2.性能优化方向
3.架构方向
4.鸿蒙开发系统底层方向
5.鸿蒙音视频开发方向
6.鸿蒙车载开发方向
7.鸿蒙南向开发方向

举报

相关推荐

0 条评论