0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

鸿蒙开发:启动远程PageAbility 仅对系统应用开放

jf_46214456 来源:jf_46214456 作者:jf_46214456 2024-06-19 09:34 次阅读

启动远程PageAbility(仅对系统应用开放)

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

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

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

表1 featureAbility接口说明

接口名接口描述 ** 开发前请熟悉鸿蒙开发指导文档**:[gitee.com/li-shizhen-skin/harmony-os/blob/master/README.md]点击或者复制转到。
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接口说明

接口名接口描述
requestPermissionsFromUser(permissions: Array, requestCode: number, resultCallback: AsyncCallback< PermissionRequestResult>): void以callback形式从系统请求某些权限,详见对应[接口文档]。

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

import abilityAccessCtrl from "@ohos.abilityAccessCtrl";
import featureAbility from '@ohos.ability.featureAbility';
import bundle from '@ohos.bundle.bundleManager';
import hilog from '@ohos.hilog';

const TAG: string = 'PagePageAbilitySecond'
const domain: number = 0xFF00;

@Entry
@Component
struct PagePageAbilitySecond {
  async requestPermission(): Promise< void > {
    hilog.info(domain, 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]);
      hilog.info(domain, TAG, 'checkAccessToken result:' + JSON.stringify(result));
      if (result != abilityAccessCtrl.GrantStatus.PERMISSION_GRANTED) {
        requestPermissions.push(array[i]);
      }
    }
    hilog.info(domain, TAG, 'requestPermissions:' + JSON.stringify(requestPermissions));
    if (requestPermissions.length == 0) {
      return;
    }
    let context = featureAbility.getContext();
    context.requestPermissionsFromUser(requestPermissions, 1, (error, data) = > {
      hilog.info(domain, TAG, 'error:' + error.message + ',data:' + JSON.stringify(data));
      hilog.info(domain, TAG, 'data requestCode:' + data.requestCode);
      hilog.info(domain, TAG, 'data permissions:' + data.permissions);
      hilog.info(domain, TAG, 'data authResults:' + data.authResults);
    });
    hilog.info(domain, TAG, 'RequestPermission end');
  }

  build() {
    //...
  }
}

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

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

import deviceManager from '@ohos.distributedDeviceManager';
import promptAction from '@ohos.promptAction';
import hilog from '@ohos.hilog';

const TAG: string = 'PagePageAbilitySecond'
const domain: number = 0xFF00;

@Entry
@Component
struct 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) {
          hilog.info(domain, TAG, 'EntryAbility onButtonClick getRemoteDeviceId err: list is null');
          return;
        }
        hilog.info(domain, 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 {
        hilog.info(domain, TAG, 'EntryAbility onButtonClick getRemoteDeviceId err: dmClass is null');
      }
    } catch (error) {
      hilog.info(domain, TAG, `getRemoteDeviceId error, error=${error}, message=${error.message}`);
    }
  }

  build() {
    //...
  }
}

`HarmonyOSOpenHarmony鸿蒙文档籽料:mau123789是v直接拿`

新文档.png

设备选择完成后,通过调用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 hilog from '@ohos.hilog';

const TAG: string = 'PagePageAbilitySecond'
const domain: number = 0xFF00;

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

审核编辑 黄宇

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 接口
    +关注

    关注

    33

    文章

    8605

    浏览量

    151194
  • 鸿蒙
    +关注

    关注

    57

    文章

    2352

    浏览量

    42863
收藏 人收藏

    评论

    相关推荐

    学习鸿蒙背后的价值?星河版开放如何学习?

    现在是2024年,华为在1月18开展了鸿蒙千帆起仪式发布会。宣布了鸿蒙星河版,并对开发开放申请,此次发布会主要是说明了,鸿蒙已经是全栈自研
    发表于 02-22 20:55

    HarmonyOS/OpenHarmony应用开发-PageAbility开发体验

    功能简介PageAbility是具备ArkUI实现的Ability,是开发者具体可见并可以交互的Ability实例。开发者通过IDE创建Ability时,IDE会自动创建相关模板代码
    发表于 12-08 11:03

    华为升级鸿蒙系统开放的机型名单

    华为升级鸿蒙系统开放的机型名单一览。6 月 2 日,华为举办鸿蒙操作系统及华为全场景新品发布会,在会上华为正式推出了Harmony OS 2
    的头像 发表于 06-21 10:54 5.7w次阅读

    多家头部企业宣布「启动鸿蒙原生应用开发」,你看好鸿蒙系统走向「独立」吗?

    鸿蒙生态迎「关键一战」,多家头部企业宣布「启动鸿蒙原生应用开发」,你看好鸿蒙系统走向「独立」吗?
    的头像 发表于 01-24 11:47 571次阅读
    多家头部企业宣布「<b class='flag-5'>启动</b><b class='flag-5'>鸿蒙</b>原生应用<b class='flag-5'>开发</b>」,你看好<b class='flag-5'>鸿蒙</b><b class='flag-5'>系统</b>走向「独立」吗?

    哪吒汽车APP启动鸿蒙原生应用开发

    哪吒汽车正式签约,启动鸿蒙原生应用开发;在5月17日,在上海市经济和信息化委员会指导的“千帆竞发启航 共筑鸿蒙生态——HDD上海站·鸿蒙原生
    的头像 发表于 05-18 09:48 1170次阅读

    鸿蒙开发:【PageAbility组件概述+配置】

    PageAbility是包含UI、提供展示UI能力的应用组件,主要用于与用户交互。
    的头像 发表于 06-17 18:05 491次阅读

    鸿蒙开发:【PageAbility的生命周期】

    PageAbility生命周期是PageAbility被调度到INACTIVE、ACTIVE、BACKGROUND等各个状态的统称。PageAbility生命周期流转及状态说明见如下图1、表1所示。
    的头像 发表于 06-17 10:05 706次阅读
    <b class='flag-5'>鸿蒙</b><b class='flag-5'>开发</b>:【<b class='flag-5'>PageAbility</b>的生命周期】

    鸿蒙开发PageAbility启动模式

    启动模式对应PageAbility启动时的行为,支持单实例模式、多实例模式两种启动模式。
    的头像 发表于 06-17 14:35 360次阅读
    <b class='flag-5'>鸿蒙</b><b class='flag-5'>开发</b>:<b class='flag-5'>PageAbility</b>的<b class='flag-5'>启动</b>模式

    鸿蒙开发:创建PageAbility

    通过DevEco Studio开发平台创建PageAbility时,DevEco Studio会在app.js/app.ets中默认生成onCreate()和onDestroy()方法,其他方法需要开发者自行实现。
    的头像 发表于 06-18 09:36 257次阅读
    <b class='flag-5'>鸿蒙</b><b class='flag-5'>开发</b>:创建<b class='flag-5'>PageAbility</b>

    鸿蒙开发启动本地PageAbility

    PageAbility相关的能力通过featureAbility提供,启动本地Ability通过featureAbility中的startAbility接口实现。
    的头像 发表于 06-18 09:29 296次阅读
    <b class='flag-5'>鸿蒙</b><b class='flag-5'>开发</b>:<b class='flag-5'>启动</b>本地<b class='flag-5'>PageAbility</b>

    鸿蒙开发:停止PageAbility

    停止PageAbility通过featureAbility中的terminateSelf接口实现。
    的头像 发表于 06-18 14:16 316次阅读
    <b class='flag-5'>鸿蒙</b><b class='flag-5'>开发</b>:停止<b class='flag-5'>PageAbility</b>

    鸿蒙开发启动指定页面

    PageAbility启动模式设置为单例时(具体设置方法和典型场景示例见[PageAbility启动模式],缺省情况下是单实例模式),若Pag
    的头像 发表于 06-19 09:29 414次阅读
    <b class='flag-5'>鸿蒙</b><b class='flag-5'>开发</b>:<b class='flag-5'>启动</b>指定页面

    鸿蒙开发:【组件启动规则(FA模型)】

    启动PageAbility、ServiceAbility,如使用startAbility()等相关接口。
    的头像 发表于 06-22 10:01 457次阅读
    <b class='flag-5'>鸿蒙</b><b class='flag-5'>开发</b>:【组件<b class='flag-5'>启动</b>规则(FA模型)】

    鸿蒙开发Ability Kit程序框架服务:Stage模型启动FA模型PageAbility

    本小节介绍Stage模型的两种应用组件如何启动FA模型的PageAbility组件。
    的头像 发表于 06-26 09:50 372次阅读
    <b class='flag-5'>鸿蒙</b><b class='flag-5'>开发</b>Ability Kit程序框架服务:Stage模型<b class='flag-5'>启动</b>FA模型<b class='flag-5'>PageAbility</b>

    鸿蒙开发Ability Kit程序框架服务:PageAbility切换 组件切换

    FA模型中PageAbility对应Stage模型中的UIAbility,PageAbility切换为UIAbility的方法如下。
    的头像 发表于 06-28 11:38 356次阅读
    <b class='flag-5'>鸿蒙</b><b class='flag-5'>开发</b>Ability Kit程序框架服务:<b class='flag-5'>PageAbility</b>切换 组件切换