HarmonyOS鸿蒙Next中Notification Kit(用户通知服务)设置消息通知的自定义铃声在模拟器中没有反应

HarmonyOS鸿蒙Next中Notification Kit(用户通知服务)设置消息通知的自定义铃声在模拟器中没有反应 【问题描述】:Notification Kit(用户通知服务)设置消息通知的自定义铃声在模拟器中没有效果,自定义后还是默认的铃声,真机是有效果的,希望能让模拟器也支持;如果模拟器实在不支持的话,在文档上面标注出来也是可以的。

【版本信息】:

cke_24511.png

cke_24067.png

【复现代码】:

import { notificationManager } from '@kit.NotificationKit';
import { BusinessError } from '@kit.BasicServicesKit';
import { common } from '@kit.AbilityKit';
import { PromptAction } from '@kit.ArkUI';

const TAG: string = '[PublishOperation]';
const DOMAIN_NUMBER: number = 0xFF00;

@Entry
@Component
struct NotificationPage {
  uiContext: UIContext = this.getUIContext();
  promptAction: PromptAction = this.uiContext.getPromptAction();

  // 获取用户授权
  requestForNotification() {
    let context = this.getUIContext().getHostContext() as common.UIAbilityContext;
    notificationManager.isNotificationEnabled().then((data: boolean) => {
      console.info(`${DOMAIN_NUMBER}, ${TAG}, isNotificationEnabled success, data: ${data}`);
      if (!data) {
        notificationManager.requestEnableNotification(context).then(() => {
          this.promptAction.openToast({
            message: '请求通知授权成功',
            duration: 2000,
          });
          console.info(`${DOMAIN_NUMBER}, ${TAG}, [ANS] requestEnableNotification success`);
        }).catch((err: BusinessError) => {
          if (1600004 == err.code) {
            this.promptAction.openToast({
              message: '请求通知授权失败',
              duration: 2000,
            });
            console.error(`${DOMAIN_NUMBER}, ${TAG},
              [ANS] requestEnableNotification refused, code is ${err.code}, message is ${err.message}`);
          } else {
            console.error(`${DOMAIN_NUMBER}, ${TAG},
              [ANS] requestEnableNotification failed, code is ${err.code}, message is ${err.message}`);
          }
        });
      }
    }).catch((err: BusinessError) => {
      console.error(`${DOMAIN_NUMBER}, ${TAG}, isNotificationEnabled fail, code is ${err.code}, message is ${err.message}`);
    });
  }

  // 构造NotificationRequest对象,发布通知
  notification(title: string, message: string) {
    let notificationRequest: notificationManager.NotificationRequest = {
      id: 1,
      content: {
        notificationContentType: notificationManager.ContentType.NOTIFICATION_CONTENT_BASIC_TEXT,
        normal: {
          title: "test_title",
          text: "test_text",
          additionalText: "test_additionalText"
        }
      },
      notificationSlotType: notificationManager.SlotType.SOCIAL_COMMUNICATION,
      sound: 'sound.mp3'
    };
    notificationManager.publish(notificationRequest, (err: BusinessError) => {
      if (err) {
        console.error(`${DOMAIN_NUMBER}, ${TAG}, Failed to publish notification. Code is ${err.code}, message is ${err.message}`);
        this.promptAction.openToast({
          message: '请求通知授权成功',
          duration: 2000,
        });
        return;
      } else {
        console.info(`${DOMAIN_NUMBER}, ${TAG}, Succeeded in publishing notification.`);
        this.promptAction.openToast({
          message: '发布通知成功',
          duration: 2000,
        });
      }
    });
  }

  // 获取二次授权
  openNotification(){
    let context = this.getUIContext().getHostContext() as common.UIAbilityContext;
    notificationManager.isNotificationEnabled().then((data: boolean) => {
      console.info(`${DOMAIN_NUMBER}, ${TAG}, "isNotificationEnabled success, data:${data} `);
      if(!data){
        notificationManager.openNotificationSettings(context).then(() => {
          console.info(`${DOMAIN_NUMBER}, ${TAG}, [ANS] openNotificationSettings success`);
        }).catch((err: BusinessError) => {
          console.error(`${DOMAIN_NUMBER}, ${TAG}, [ANS] openNotificationSettings failed, code is ${err.code}, message is ${err.message}`);
        });
      }
    }).catch((err: BusinessError) => {
      console.error(`${DOMAIN_NUMBER}, ${TAG}, isNotificationEnabled fail, code is ${err.code}, message is ${err.message}`);
    });
  }

  aboutToAppear(): void {
    this.requestForNotification();
    this.openNotification();
  }

  build() {
    Column() {
      Button('发布通知').onClick(() => {
        let title = '这是一个标题';
        let message = '这是一条通知';
        this.notification(title, message);
      });
    }
    .width('100%')
    .height('100%')
    .justifyContent(FlexAlign.Center);
  }
}

更多关于HarmonyOS鸿蒙Next中Notification Kit(用户通知服务)设置消息通知的自定义铃声在模拟器中没有反应的实战教程也可以访问 https://www.itying.com/category-93-b0.html

2 回复

在HarmonyOS Next中,模拟器可能不支持自定义铃声播放。请检查以下配置:确保音频文件格式为MP3或WAV,并已放置在项目的resources/rawfile目录下。在NotificationRequest中正确设置sound属性为$rawfile('filename')。模拟器音频驱动可能有限制,建议在真机环境测试。

更多关于HarmonyOS鸿蒙Next中Notification Kit(用户通知服务)设置消息通知的自定义铃声在模拟器中没有反应的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


这是一个已知的模拟器限制。HarmonyOS Next 模拟器目前不支持播放自定义通知铃声,即使正确设置了 sound 字段,系统也只会播放默认提示音。

核心原因:模拟器的音频系统和媒体文件访问路径与真机存在差异。模拟器环境通常不具备完整的系统铃声库或自定义文件访问支持,导致 sound 字段指定的音频文件无法被成功加载和播放。

当前解决方案

  1. 真机调试:对于通知铃声等依赖特定硬件或系统环境的功能,建议直接在 HarmonyOS Next 真机上进行开发和测试。你的代码在真机上有效,说明逻辑是正确的。
  2. 功能降级检查:在模拟器中,你仍可通过监听 publish 方法的回调或检查通知是否成功发布到状态栏,来验证通知的核心流程(如内容、渠道)是否正常。铃声问题可视为模拟器的环境限制。

代码层面无需修改。你使用 notificationRequest.sound = 'sound.mp3'; 的写法符合 API 规范。此问题纯属目标运行环境的支持度差异。

给开发者的建议:在开发涉及自定义资源(如铃声、特定传感器、高级图形)的功能时,应优先安排真机兼容性测试,并将模拟器主要用于验证 UI 交互和基础逻辑。我们已将此限制反馈给文档团队,建议其在 Notification Kit 的相关接口说明中增加模拟器的限制说明。

回到顶部