HarmonyOS开发实战:应用权限/通知设置跳转方案

news2024/11/25 16:43:51

场景描述

引导用户跳转到系统设置页进行权限,通知的相关设置,类似android和iOS应用中常见的应用内跳转到设置进行通知开启或权限设置的操作。

应用经常会遇到如下的业务诉求:

场景一:如果应用首次拒绝了消息通知,应用希望能够引导用户拉起设置应用设置允许通知,用来接收应用内的推送消息;并且在设置完后返回页面可以监听到修改后的状态。

场景二:当用户使用一些需要用户授权的api时(如访问获取联系人信息),若用户首次拒绝授权,则需要引导用户到权限设置页面能够主动进行应用权限的修改。

场景三:支持打开/关闭系统功能如Wi-Fi、NFC、移动网络、蓝牙等。

方案描述

场景一:

如果应用首次拒绝了消息通知,应用希望能够引导用户拉起设置应用设置允许通知,用来接收应用内的推送消息;并且在设置完后返回页面可以监听到修改后的状态。

效果图

image.png

image.png

方案

1、通过startability显式拉起设置应用-通知管理界面,配置相应的want信息(不推荐使用隐式拉起的方式)。

2、在进入页面时通过Notification.requestEnableNotification()监听应用请求通知使能

核心代码

为Button绑定拉起事件

Button(this.buttonText).onClick(()=>{

  let context = getContext(this) as common.UIAbilityContext;

  let want: Want = {

    bundleName: 'com.huawei.hmos.settings',//设置应用bundleName

    abilityName: 'com.huawei.hmos.settings.MainAbility',//设置应用abilityName

    uri: "systemui_notification_settings",//通知管理页面

    parameters: {

      pushParams: {

        bundleName:context.abilityInfo.bundleName//拉起方应用包名

      }

    };

    context.startAbility(want)

  }).margin(10)

  Text(this.message)

在打开页面时获取通知管理中按钮状态,Notification.requestEnableNotification()请求发送通知的许可,第一次调用会弹窗让用户选择。

onPageShow(): void {

  Notification.requestEnableNotification().then(() => {

  //已打开通知

  this.message = "已允许接收消息推送。"

  this.buttonText = "去关闭通知"

  console.info("requestEnableNotification success");

}).catch((err:Error) => {

  //未打开通知

  this.message = "已禁止接收消息推送。"

  this.buttonText = "去开启通知"

  console.info("requestEnableNotification error");

});

}

场景二:

当用户使用一些需要用户授权的api时(如访问获取联系人信息),若用户首次拒绝授权,则需要引导用户到权限设置页面能够主动进行应用权限的修改。

效果图

image.png

image.png

方案

暂无直接跳转权限管理的方式,可通过跳转至应用详情进行用户申请权限的修改

核心代码

为button绑定获取联系人信息事件:

Button("获取联系人").onClick(async () => {

  const permissions: Array<Permissions> = ['ohos.permission.READ_CONTACTS'];

  let context: Context = getContext(this) as common.UIAbilityContext;

  let atManager: abilityAccessCtrl.AtManager = abilityAccessCtrl.createAtManager();

  // requestPermissionsFromUser会判断权限的授权状态来决定是否唤起弹窗

  atManager.requestPermissionsFromUser(context, permissions).then((data: PermissionRequestResult) => {

    //grantStatus:授权状态:0 已授权 1未授权 2未授权 表示请求无效,

    let grantStatus: Array<number> = data.authResults;

    let length: number = grantStatus.length;

    for (let i = 0; i < length; i++) {

      if (grantStatus[i] === 0) {

        // 已经授权,可以继续访问目标操作

        this.getContact(context)

      } else {

        // 用户拒绝授权,提示用户必须授权才能访问当前功能,并引导用户到系统设置中打开相应的权限

        this.contacts = []

        this.dialogControllerConfirm.open()

        return;

      }

    }

  }).catch((err: BusinessError) => {

    console.error(`Failed to request permissions from user. Code is ${err.code}, message is ${err.message}`);

  })

}).margin(10)

调用 contact.queryContacts获取联系人信息

getContact(context:Context){

  contact.queryContacts(context, (err: BusinessError, data) => {

    this.contacts = data

  });

}

拒接授权后的引导弹窗:

dialogControllerConfirm: CustomDialogController = new CustomDialogController({

  builder: AlertDialog({

    content: '已拒绝访问系统通讯录,是否前往开启?',

    primaryButton: {

      value: '取消',

      action: () => {},

    },

    secondaryButton: {

      value: '确认',

      fontColor: $r('sys.color.ohos_id_color_warning'),

      action: () => {

        this.openAppInfo()

      }

    },

  }),

  autoCancel: true,

  customStyle: true,

  alignment: DialogAlignment.Bottom

})

进入设置-应用详情页

openAppInfo(){

  let context = getContext(this) as common.UIAbilityContext;

  context.startAbility({

    bundleName: 'com.huawei.hmos.settings',

    abilityName: 'com.huawei.hmos.settings.MainAbility',

    uri: 'application_info_entry',

    parameters: {

      pushParams: "com.example.startability"

    }

  });

}

场景三:

支持打开/关闭系统功能如Wi-Fi、NFC、移动网络、蓝牙等

效果图

同设置应用内相应界面

方案

通过配置对应的uri进行跳转,蓝牙uri:"bluetooth_entry",NFC uri:"nfc_settings",移动网络uri:"mobile_network_entry"

核心代码

Button("to蓝牙").onClick(()=> {

  let context = getContext(this) as common.UIAbilityContext;

  context.startAbility({

    bundleName: 'com.huawei.hmos.settings',

    abilityName: 'com.huawei.hmos.settings.MainAbility',

    uri:"bluetooth_entry",

  });

}).margin(10)



Button("toNFC").onClick(()=> {

  let context = getContext(this) as common.UIAbilityContext;

  context.startAbility({

    bundleName: 'com.huawei.hmos.settings',

    abilityName: 'com.huawei.hmos.settings.MainAbility',

    uri:"nfc_settings",

  });

}).margin(10)



Button("to移动网络").onClick(()=> {

  let context = getContext(this) as common.UIAbilityContext;

  context.startAbility({

    bundleName: 'com.huawei.hmos.settings',

    abilityName: 'com.huawei.hmos.settings.MainAbility',

    uri:"mobile_network_entry",

  });

}).margin(10)

最后

小编在之前的鸿蒙系统扫盲中,有很多朋友给我留言,不同的角度的问了一些问题,我明显感觉到一点,那就是许多人参与鸿蒙开发,但是又不知道从哪里下手,因为资料太多,太杂,教授的人也多,无从选择。有很多小伙伴不知道学习哪些鸿蒙开发技术?不知道需要重点掌握哪些鸿蒙应用开发知识点?而且学习时频繁踩坑,最终浪费大量时间。所以有一份实用的鸿蒙(HarmonyOS NEXT)资料用来跟着学习是非常有必要的。 

为了确保高效学习,建议规划清晰的学习路线,涵盖以下关键阶段:


 鸿蒙(HarmonyOS NEXT)最新学习路线

该路线图包含基础技能、就业必备技能、多媒体技术、六大电商APP、进阶高级技能、实战就业级设备开发,不仅补充了华为官网未涉及的解决方案

路线图适合人群:

IT开发人员:想要拓展职业边界
零基础小白:鸿蒙爱好者,希望从0到1学习,增加一项技能。
技术提升/进阶跳槽:发展瓶颈期,提升职场竞争力,快速掌握鸿蒙技术

2.视频学习资料+学习PDF文档

HarmonyOS Next 最新全套视频教程

  纯血版鸿蒙全套学习资料(面试、文档、全套视频等)              

​​

总结

参与鸿蒙开发,你要先认清适合你的方向,如果是想从事鸿蒙应用开发方向的话,可以参考本文的学习路径,简单来说就是:为了确保高效学习,建议规划清晰的学习路线

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

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

相关文章

免费高效:2024年四大视频剪辑软件推荐!

不管是不是专业人士&#xff0c;相信大家多多少少都会有视频剪辑的需求&#xff0c;对于很多新手来说&#xff0c;一款好用且免费的视频剪辑工具十分必要&#xff0c;接下来就为大家推荐几个好用的视频剪辑免费软件&#xff01; 福昕视频剪辑 链接&#xff1a;www.pdf365.cn/…

Linux(CentOS7)虚拟机安装教程

创建虚拟机 自定义高级&#xff0c;就下一步 选择Workstation 17.x,完好后就继续下一步,下面就如图所示 虚拟机内存看情况加 磁盘大小也看情况加 完成&#xff01; 开启此虚拟机 鼠标放进去直接回车 可能有点慢&#xff0c;请耐心等待 一.进入日期时间 二.进入软件选择 三.配置…

[创业之路-138] :产品需求、产品研发、产品生产、库存管理、品控、售后全流程 - 时序图

目录 一、产品研发全流程 1. 客户/市场需求 2. 供应链采购 3. 设计研发 4. 库房管理 5. 品控质检 6. 物流运输 7. 客户现场验证 8. 返修售后 二、产品生产全流程 1. 客户/市场需求 2. 供应链采购 3. 生产加工 4. 库房管理 5. 品控质检 6. 物流运输 7. 客户现场…

物理可微分神经算法:深度学习与物理世界的桥梁

物理可微分神经算法&#xff1a;深度学习与物理世界的桥梁 前言物理可微分神经算法的核心PyTorch中的实现讨论与展望结语 前言 在这个信息爆炸的时代&#xff0c;人工智能&#xff08;AI&#xff09;已成为推动技术革新的关键力量。深度学习&#xff0c;作为AI领域的一个重要分…

CAPL如何实现在网络节点中添加路由Entry

其实不只是CANoe的网络节点,所有设备的应用程序如果要通过Socket套接字发送报文,在网络层都需要根据路由表里配置的路由条目选择发送路径。这个路由条目可以是静态配置,也可以是自动添加。 如果CANoe的网络节点添加一个网络接口,配置IP地址和子网掩码: 说明此网络节点在1…

外挂程序:增强点及辅助

1.关于前几篇介绍的外挂程序,SAP中的业务单据还是要区分具体的操作人员。如建立财务凭证,工号A,B,C使用相同的SAP账号,那就没办法知道是谁操作的了啊,所以sap的业务单据需要细分到具体人员的都要增强实现以下: 如生产工单: 具体的增强点: 2.辅助程序:SAP账号自动锁定功…

【Redis】基本全局命令

Redis的基本全局命令 keysexistsdelexpirettltype Redis 有 5 种数据结构&#xff0c;但它们都是键值对种的值&#xff0c;对于键来说有⼀些通⽤的命令。 keys 返回所有满足样式 &#xff08;pattern&#xff09;的key。支持如下统配样式。 h?llo 匹配 hello , hallo 和 hxl…

D-ID 推出人工智能视频翻译工具,拥有语音克隆和口型同步等功能

D-ID公司以其创新的人工智能技术在视频创作领域取得了突破性进展。这家人工智能视频创作平台最近推出了一项新工具&#xff0c;允许用户将视频翻译成多达30种不同的语言&#xff0c;包括阿拉伯语、普通话、日语、印地语、西班牙语和法语等。这项技术不仅能够自动翻译视频内容&a…

面试题 08.06. 汉诺塔问题(整活版)(不讲武德)

题目具体要求看面试题 08.06. 汉诺塔问题(递归法)-CSDN博客 class Solution { public:void hanota(vector<int>& A, vector<int>& B, vector<int>& C) {CA;A.clear();} };

Blender新手入门笔记收容所(二)

材质篇 学习来源&#xff1a;B站 【Kurt】Blender零基础入门教程 | Blender中文区新手必刷教程(已完结) Blender材质基础 PBR(Physically Based Rendering)&#xff1a;基于物理的渲染BSDFBRDF(反射)BTDF(透射) 原理化BSDF详解 中间部分利用率80% 材质篇第一节课笔记 纹…

健身房预约小程序,提高市场竞争力

随着“全民健身”的风靡&#xff0c;各大健身场所受到了较大的关注&#xff0c;健身市场的发展迎来了爆发期&#xff01;健身房预约系统是一个在线预约管理系统&#xff0c;对于健身房来说&#xff0c;一个操作简单、功能齐全的预约系统至关重要&#xff0c;他不仅可以帮助学员…

代码随想录打卡第六十一天

代码随想录–图论部分 day 62 图论第十一天&#xff08;完结&#xff09; 文章目录 代码随想录–图论部分一、卡码网97--小明逛公园二、卡码网126--骑士的攻击总结 一、卡码网97–小明逛公园 代码随想录题目链接&#xff1a;代码随想录 给定一个公园景点图&#xff0c;图中有…

Flink常用转换(transformation)算子使用教程(DataSTream API)

前言 一个 Flink 程序,其实就是对 DataStream 的各种转换。具体来说,代码基本上都由以下几部分构成,如下图所示: 获取执行环境(execution environment)读取数据源(source)定义基于数据的转换操作(transformations)定义计算结果的输出位置(sink)触发程序执行(exec…

Linux入门——06 基础IO

1.什么是当前路径 exe -> /home/lin/Desktop/Linux_learn/fork_learn/test 当前进程执行是磁盘路径下的哪一个程序 cwd -> /home/lin/Desktop/Linux_learn/fork_learn 当前进程的工作目录------》当前进程 1.1当前路径这个地址能改吗&#xff1f; 可以&#xff0c;使…

spring-boot-maven-plugin:repackage分析

springboot项目打包插件为&#xff1a;spring-boot-maven-plugin,使用如下: <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance&…

【python实现通过复数进程互相检测防止关闭和删除】

python实现通过复数进程互相检测防止关闭和删除 要使用 Python 实现通过多个进程互相检测来防止关闭和删除&#xff0c;可以使用 multiprocessing 模块来创建多个进程&#xff0c;并通过进程间通信来实现心跳检测。以下是一个简单的示例代码&#xff0c;展示了如何使用两个进程…

【学术前沿】基于非易失性存储器硬件特性的存算一体神经网络设计方法

【学术前沿】基于非易失性存储器硬件特性的存算一体神经网络设计方法 Lixia HAN, Peng HUANG, Yijiao WANG, Zheng ZHOU, Haozhang YANG, Yiyang CHEN, Xiaoyan LIU & Jinfeng KANG, Mitigating Methodology of Hardware Non-ideal Characteristics for Non-volatile Memo…

经常打喷嚏和浮毛猫毛满天飞有关吗?能去浮毛的空气净化器推荐

近年来&#xff0c;随着生活品质的提升&#xff0c;越来越多的家庭选择养宠物&#xff0c;养宠物的同时也带来了不少的困扰。比如&#xff0c;下班归家&#xff0c;迎接的可能是满室的异味与漂浮的毛发&#xff0c;瞬间让好心情大打折扣。长期置身于这样的环境中还对健康有影响…

笔记本没电造成数据丢失怎么恢复?速览几种有效方法

在日常使用笔记本电脑的过程中&#xff0c;我们时常会遇到电量耗尽而突然关机的情况。这种突如其来的断电不仅可能打断我们的工作流程&#xff0c;更有可能导致未保存的数据丢失&#xff0c;给我们的生活和工作带来不小的困扰。面对这种情况&#xff0c;许多用户可能会感到手足…

Jellyfin10.9.x解决色调映射无法使用的问题

环境 物理机为12100的CPU、精粤 H610I的主板、16G2内存、闪迪1TB M.2固态、希捷酷鹰3.5寸4TB硬盘4。 物理机安装了PVE后在PVE安装了NAS、OP、Windows 10、HA、Ubuntu还利用LXC模板安装了Debian12 里面套娃了Jellyfin。不过我的Jellyfin不是部署在docker中的。 问题 但是当我…