马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
1.标题形貌:
获取应用是否开启了答应关照权限后,怎样引导跳转开启权限关照的设置页面?
办理方案:
- 通过isNotificationEnabled方法查询关照是否授权,参考isNotificationEnabled用法。
2.若申请关照权限被拒绝后,后续调用requestEnableNotification()方法不再弹窗,同时会返回错误,错误码是1600004。详细参考哀求关照授权。
3.如果想二次授权,可以调用openNotificationSettings申请授权,拉起关照管理弹窗大概引导用户跳转应用设置页面开启权限。
完备代码示比方下:- import { notificationManager } from '@kit.NotificationKit';
- import { BusinessError } from '@kit.BasicServicesKit';
- import { common } from '@kit.AbilityKit';
- import { Want } from '@kit.AbilityKit';
- @Entry
- @Component
- struct NotificationPage {
- aboutToAppear(): void {
- let context = this.getUIContext().getHostContext() as common.UIAbilityContext;
- notificationManager.isNotificationEnabled().then((data: boolean) => {
- console.info("isNotificationEnabled success, data: " + data);
- if (!data) {
- let requestEnableNotificationCallback = (err: BusinessError): void => {
- if (err) {
- console.error(`requestEnableNotification failed, code is ${err.code}, message is ${err.message}`);
- } else {
- console.info(`requestEnableNotification success`);
- }
- };
- notificationManager.requestEnableNotification(context, requestEnableNotificationCallback);
- }
- }).catch((err: BusinessError) => {
- console.error(`isNotificationEnabled fail, code is ${err.code}, message is ${err.message}`);
- });
- }
- // 发布基本类型通知
- publishBasicNotification() {
- let notificationRequest: notificationManager.NotificationRequest = {
- id: 1,
- notificationSlotType: notificationManager.SlotType.SOCIAL_COMMUNICATION,
- content: {
- notificationContentType: notificationManager.ContentType.NOTIFICATION_CONTENT_BASIC_TEXT, // 普通文本类型通知
- normal: {
- title: '基本型消息通知',
- text: '通知内容XXXXXXX',
- additionalText: 'TextXXXXXXX',
- }
- }
- };
- notificationManager.publish(notificationRequest, (err: BusinessError) => {
- if (err) {
- console.error(`Failed to publish notification. Code is ${err.code}, message is ${err.message}`);
- return;
- }
- console.info('Succeeded in publishing notification.');
- });
- notificationManager.setBadgeNumber(1)
- }
- build() {
- Column() {
- Button('基本通知')
- .onClick(() => {
- this.publishBasicNotification()
- })
- Button('二次授权')
- .margin({ top: 20 })
- .onClick(() => {
- let context = this.getUIContext().getHostContext() as common.UIAbilityContext;
- notificationManager.openNotificationSettings(context).then(() => {
- console.info(`openNotificationSettings success`);
- }).catch((err: BusinessError) => {
- console.error(`openNotificationSettings failed, code is ${err.code}, message is ${err.message}`);
- });
- })
- Button('点击进入应用设置页面')
- .margin({ top: 20 })
- .onClick(() => {
- let context = this.getUIContext().getHostContext() as common.UIAbilityContext;
- let want: Want = {
- bundleName: 'com.huawei.hmos.settings',
- abilityName: 'com.huawei.hmos.settings.MainAbility',
- uri: 'application_info_entry',
- parameters: {
- pushParams: "com.example.myapplication" // 配置应用包名
- }
- };
- context.startAbility(want).then(() => {
- }).catch((err: BusinessError) => {
- console.error(`Code is ${err.code}, message is ${err.message}`)
- });
- })
- }
- .alignItems(HorizontalAlign.Center)
- .width('100%')
- .height('100%')
- }
- }
复制代码 2.标题形貌:
使用notificationManager.openNotificationSettings接口打开的弹窗,怎样监听弹窗关闭变乱?
办理方案:
在页面打开应用关照设置页。
openNotificationSettings接口拉起的设置页面,页面关闭的时间没有回调方法可以直接使用,但是该接口拉起的页面关闭的时间,会触发其他页面聚焦的回调,在这个页面的根组件上注册的onfocus变乱,在该回调内自界说一些利用,比如调用isNotificationEnabledSync()来查询应用关照的开启状态。详细实当代码如下:- import { notificationManager } from '@kit.NotificationKit';
- import { BusinessError } from '@kit.BasicServicesKit';
- import { common } from '@kit.AbilityKit';
- @Entry
- @Component
- struct NotificationManagerDemo {
- // 组件聚焦状态
- @State focusState: boolean = true
- build() {
- Column() {
- Button('打开弹窗')
- .onClick(() => {
- let context = this.getUIContext().getHostContext() as common.UIAbilityContext;
- // 拉起应用通知设置页面
- notificationManager.openNotificationSettings(context).then(() => {
- console.info('页面拉起成功')
- // 拉起成功,改变页面聚焦状态
- this.focusState = false
- }).catch((err: BusinessError) => {
- console.info('页面拉起失败')
- });
- })
- }
- .onFocus(() => {
- // 组件聚焦的回调
- if (!this.focusState) {
- // 做一些自己的操作
- console.info('应用通知页面关闭')
- // 查询通知开关是否开启
- let res = notificationManager.isNotificationEnabledSync()
- console.info(`是否开启应用通知:${res}`)
- this.getUIContext().getPromptAction().showToast({ message: `是否开启应用通知:${res}` })
- // 重置组件聚焦状态
- this.focusState = !this.focusState
- }
- })
- }
- }
复制代码 3.标题形貌:
notificationManager.openNotificationSettings唤起半模态框,怎样监听消散并读取最新关照开启状态?
办理方案:
封装关照管理工具类,全局使用。
- onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {
- try {
- this.context.getApplicationContext().setColorMode(ConfigurationConstant.ColorMode.COLOR_MODE_NOT_SET);
-
- // 初始化通知工具类
- NotificationUtil.initialize(this.context);
-
- } catch (err) {
- hilog.error(DOMAIN, 'testTag', 'Failed to set colorMode. Cause: %{public}s', JSON.stringify(err));
- }
- hilog.info(DOMAIN, 'testTag', '%{public}s', 'Ability onCreate');
- }
复制代码- import NotificationUtil from './NotificationUtil';
-
- @Entry
- @Component
- struct NotificationManagerDemo {
- @State focusState: boolean = true
-
- build() {
- Column() {
-
- Button('打开应用通知设置页')
- .onClick(async () => {
- await NotificationUtil.openSettingsAndListenReturn((isEnabled: boolean) => {
- console.info('从设置页面返回,通知状态:', isEnabled);
- this.getUIContext().getPromptAction().showToast({
- message: `通知状态: ${isEnabled ? '已开启' : '已关闭'}`
- });
- });
- })
-
- }
- .width('100%')
- .height('100%')
- .justifyContent(FlexAlign.Center)
- .alignItems(HorizontalAlign.Center)
- .onFocus(() => {
- // 将焦点变化传递给工具类
- NotificationUtil.handleFocusChange(true);
- })
- .onBlur(() => {
- NotificationUtil.handleFocusChange(false);
- })
- }
- }
复制代码 4.标题形貌:
怎样直接以弹窗方式打开关照管理页面?
办理方案:
如果想二次授权,可以调用openNotificationSettings申请授权,拉起关照管理弹窗。大概引导用户跳转应用设置页面开启权限,跳转设置页面方法如下:- let context = getContext(this) as common.UIAbilityContext;
- let want: Want = {
- bundleName: 'com.huawei.hmos.settings',
- abilityName: 'com.huawei.hmos.settings.MainAbility',
- uri: 'application_info_entry',
- parameters: {
- pushParams: "bundleName" // 配置应用包名
- }
- };
- context.startAbility(want).then(() => {
- }).catch((err: BusinessError) => {
- console.error(`Code is ${err.code}, message is ${err.message}`)
- });
复制代码 5.标题形貌:
notificationManager.requestEnableNotification err.code:1600013,缘故因由是什么?
办理方案:
【配景知识】
应用必要获取用户授权才华发送关照。在关照发布前调用requestEnableNotification()方法,弹窗让用户选择是否答应发送关照,后续再次调用requestEnableNotification()方法时,则不再弹窗。可参考文档哀求关照权限。
【标题定位】
- 权限哀求机遇标题,必要在UI加载后再申请。
- 是否绑定UiAbilityContext,context是否正常初始化。
- 从前有非常弹出的场景,产生了脏数据。
- 查抄相干参数HashMap使用是否准确。
【分析结论】
- 1600013,若窗口未加载完结果哀求了关照,导致渲染非常,再次哀求就会报这个错,只管在窗口创建并渲染后再调用。
- 发起在entryAbility中调用,或是在对应的页面中调用,不发起在授权时切换页面。
【修改发起】
针对报错code:1600013,可以接纳以下两种方案:
- 实行重启手机、删除应用的利用,整理脏数据后再次安装应用实验。申请关照权限代码改为在ui加载后再申请。代码示例:
- windowStage.loadContent('pages/Index', (err) => {
- if (err.code) {
- hilog.error(0x0000, 'testTag', 'Failed to load the content. Cause: %{public}s', JSON.stringify(err) ?? '');
- return;
- }
-
- notificationManager.requestEnableNotification().then(() => {
- hilog.info(0x0000, '’testTag', 'requestEnableNotification success');
- })
- .catch((error: BusinessError) => {
- hilog.error(0x0000, 'testTag', 'requestEnableNotification error : %{public}s', JSON.stringify(error))
- })
- hilog.info(0x0000, 'testTag', 'Succeeded in loading the content.');
- });
复制代码
- 绑定UiAbilityContext使用模态弹窗方式,初始化context。代码示例:
- let context = getContext(this) as common.UIAbilityContext;
- notificationManager.isNotificationEnabled().then((data: boolean) => {
- hilog.info(DOMAIN_NUMBER, TAG, "isNotificationEnabled success, data: " + JSON.stringify(data));
- if(!data){
- notificationManager.requestEnableNotification(context).then(() => {
- hilog.info(DOMAIN_NUMBER, TAG, `[ANS] requestEnableNotification success`);
- }).catch((err : BusinessError) => {
- if(1600004 == err.code){
- hilog.error(DOMAIN_NUMBER, TAG, `[ANS] requestEnableNotification refused, code is ${err.code}, message is ${err.message}`);
- } else {
- hilog.error(DOMAIN_NUMBER, TAG, `[ANS] requestEnableNotification failed, code is ${err.code}, message is ${err.message}`);
- }
- });
- }
- }).catch((err : BusinessError) => {
- hilog.error(DOMAIN_NUMBER, TAG, `isNotificationEnabled fail: ${JSON.stringify(err)}`);
- });
复制代码
- 不在授权时切换页面,发起在window.loadContent回调中哀求权限。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |