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

启动远程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.鸿蒙南向开发方向

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/790290.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

鸿蒙南向开发实战:【智能窗帘】

样例简介 智能窗帘设备不仅接收数字管家应用下发的指令来控制窗帘开启的时间&#xff0c;而且还可以加入到数字管家的日程管理中。通过日程可以设定窗帘开关的时间段&#xff0c;使其在特定的时间段内&#xff0c;窗帘自动打开或者关闭&#xff1b;通过日程管家还可以实现窗帘…

蓝桥杯备考

目录 P8823 [传智杯 #3 初赛] 期末考试成绩 题目描述 输入格式 输出格式 输入输出样例 说明/提示 代码 P8828 [传智杯 #3 练习赛] 直角三角形 题目描述 输入格式 输出格式 输入输出样例 代码 P8833 [传智杯 #3 决赛] 课程 题目背景 题目描述 输入格式 输出格式…

redis---位图Bitmap和位域 Bitfield

位图是字符串类型的拓展&#xff0c;可以使用一个string类型来模拟一个Bit数组。数组的下标就是偏移量&#xff0c;值只有0和1&#xff0c;也支持一些位运算&#xff0c;比如与或非&#xff0c;异或等等&#xff0c;它们的应用场景非常广泛比如可以用来记录用户的签到情况&…

dict类型如何保存为json数据,给一个python示例代码

dict类型如何保存为json数据&#xff0c;给一个python示例代码 import json# 假设我们有一个字典对象 data_dict {"name": "Alice","age": 30,"city": "Wonderland" }# 将字典转换为JSON格式的字符串 json_string json.d…

代码随想录一刷总结(待更新)

文章目录 代码随想录一刷总结数组篇二分查找双指针用法 链表篇哈希表篇字符串篇栈与队列篇二叉树篇回溯篇贪心篇动态规划篇 代码随想录一刷总结 数组篇 二分查找 最重要的是循环不变量原理 区间定义 left right 时有没有意义&#xff0c;取决于开区间还是闭区间 使用场景…

Qt中继承QCheckBox的类结合QTableWidget实现多选并且每个多选的id都不一样

1.相关描述 继承QCheckBox的类MyCheckBox&#xff0c;利用QTableWidget的setCellWidget方式添加MyCheckBox类的对象 2.相关页面 3.相关代码 mycheckbox.h #ifndef MYCHECKBOX_H #define MYCHECKBOX_H#include <QCheckBox> #include <QObject>class MyCheckBox : pu…

力扣刷题Days31-2.两数相关(js)

1&#xff0c;题目 给你两个 非空 的链表&#xff0c;表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的&#xff0c;并且每个节点只能存储 一位 数字。 请你将两个数相加&#xff0c;并以相同形式返回一个表示和的链表。 你可以假设除了数字 0 之外&#xff0c;…

Vue3:Pinia简介及环境搭建

一、简介 Pinia是Vue3中的状态管理工具&#xff0c;类似与Vue2中的Vuex框架的作用 二、环境搭建 1、安装 npm install pinia2、配置 main.ts import {createApp} from vue import App from ./App.vue // 第一步&#xff1a;引入pinia import {createPinia} from piniacons…

Nginx - directory index of “/usr/share/nginx/html/“ is forbidden

问题描述 安装完 Nginx 之后访问本机 IP&#xff0c;结果直接报错&#xff0c;然后去查看 Nginx 错误日志&#xff0c;看到如下错误信息&#xff0c;意思是 html 下面没有 directory index of "/usr/share/nginx/html/" is forbidden 解决方案 Q1&#xff1a;如果在…

zabbix源码安装

目录 一.安装php和nginx客户端环境 二.修改php配置 三.修改nginx配置文件 四.下载并编译zabbix 五.创建zabbix需要的用户及组 六.安装编译需要的依赖 七.配置zabbix文件 八.数据库配置 九.配置zabbix 十.web界面部署 十一.遇到无法创建配置文件 十二.登录zabbix 前…

C# OAuth单点登录的实现

原理 单点登录&#xff08;Single Sign-On&#xff0c;简称SSO&#xff09;是一种身份验证技术&#xff0c;它允许用户使用一组凭据&#xff08;如用户名和密码&#xff09;登录多个相关但独立的系统&#xff0c;而无需在每个系统中都进行登录操作。下面是一个简单的SSO实现示…

[Python学习篇] Python简介

介绍 Python&#xff08;意为大蟒蛇&#xff09;由荷兰国家数学与计算机科学研究中心的吉多范罗苏姆于1990年代初设计&#xff0c;作为一门叫做ABC语言的替代品。 Python提供了高效的高级数据结构&#xff0c;还能简单有效地面向对象编程。Python语法和动态类型&#xff0c;以及…

2014最新AI学法减分交管12123小程序源码最新玩法

2014最新AI学法减分交管12123小程序源码最新玩法利用ChatGPT实现拍照搜题 利用ChatGPT实现拍照搜题 学法减分这个项目是几年之前的项目&#xff0c;老朋友都知道&#xff0c;以前我用Python实现了向量检索&#xff0c;也就是当时和大家说到的AI题库&#xff0c;那时候国内还没…

鸿蒙实战开发:【实现应用悬浮窗】

如果你要做的是系统级别的悬浮窗&#xff0c;就需要判断是否具备悬浮窗权限。然而这又不是一个标准的动态权限&#xff0c;你需要兼容各种奇葩机型的悬浮窗权限判断。 fun checkPermission(context: Context): Boolean if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M)…

蓝桥杯速成5-AD/DA模数转换

一、原理图 上图可知该芯片使用的是iic时序&#xff0c;而不是51单片机的xpt2046时序&#xff0c;iic我们都很熟悉了吧 并且大赛还提供了我们iic底层驱动代码 左上角有AIN0-4四个转换输入通道&#xff0c;和AOUT一个输出通道&#xff0c;由控制字节选择 地址字节&#xff1a;0x…

自由职业指南大全

现在的自媒体行业风生水起 不知道大家有没有感觉到 无论是网赚圈子还是自媒体圈子&#xff0c;都不要自己去闷头搞&#xff0c;真的没出路 我本人就是最好的例子 前几年都是一个人&#xff0c;盲目乱转&#xff0c;一事无成 现在学会了知识付费&#xff0c;开始慢慢有了成…

C++之STL的algorithm(5)之生成算法(accumulate、fill)整理

C之STL的algorithm&#xff08;5&#xff09;之生成算法&#xff08;accumulate、fill&#xff09;整理 注&#xff1a;整理一些突然学到的C知识&#xff0c;随时mark一下 例如&#xff1a;忘记的关键字用法&#xff0c;新关键字&#xff0c;新数据结构 C 的遍历算法整理 C之ST…

硬件RAID横评(上)

正文共&#xff1a;3857字 50图&#xff0c;预估阅读时间&#xff1a;12 分钟 之前误打误撞测试了软件RAID&#xff08;Windows下软RAID测试&#xff09;&#xff0c;发现性能基本上是线性的&#xff0c;而据说硬件RAID性能比这个高的很。那本文将就硬件RAID展开测试&#xff0…

ArrayList与线性表详解

1.线性表 线性表是n个具有相同特性的数据元素的有限序列。线性表是一种在实际中广泛使用的数据结构&#xff0c;常见的线性表有&#xff1a;顺序表、链表、队列…… 线性表在逻辑上是线性结构&#xff0c;也就是说是连续的一条直线。但是在物理结构上不一定是连续的&#xff…

算法训练营第29天|LeetCode 491.递增子序列 46.全排列 47.全排列Ⅱ

LeetCode 491.递增子序列 题目链接&#xff1a; LeetCode 491.递增子序列 解题思路&#xff1a; 用哈希集合进行去重&#xff0c;同一树层不能取重复元素。 代码&#xff1a; class Solution { public:vector<vector<int>>result;vector<int>path;void…