Android通知无声音和振动故障排查,附Notification配置代码
Android通知无提示音和振动的常见原因及解决方案
最核心诱因(90%以上的该问题都是这个原因)
从Android 8.0(API等级26)开始,通知的声音、振动、提示策略等属性完全绑定通知渠道(NotificationChannel),你代码中NotificationCompat.Builder里调用的setSound()、setVibrate()仅对Android 7.1及以下系统生效,Android 8.0及以上系统会直接忽略这两个配置,必须在创建通知渠道时就配置好对应的声音和振动规则。
而且通知渠道一旦被系统注册后,后续修改代码里的属性也不会生效,需要卸载App重装、或者修改渠道ID重新创建新渠道才能更新配置。
其他可能原因
- 未申请必要权限:振动功能需要在
AndroidManifest.xml中声明振动权限<uses-permission android:name="android.permission.VIBRATE" />;Android 13(API等级33)及以上系统需要动态申请POST_NOTIFICATIONS权限,未获得授权的情况下通知不会弹出,自然也不会触发声音和振动。 - 系统设置限制:手机处于静音、勿扰模式,或者系统设置中关闭了当前App的通知权限、对应通知渠道的声音/振动开关,即使代码配置正确也不会生效。
- 音频资源无效:代码中设置的
alarmSound对应的URI不存在、或者App没有访问该音频资源的权限,会导致提示音加载失败。 - 通知优先级过低:通知渠道优先级设置为低等级(低于IMPORTANCE_DEFAULT),或者Builder中设置的priority过低,系统只会将通知折叠进通知栏,不会弹出提示也不会触发声音振动。
修复代码示例
第一步:先创建通知渠道(仅需在应用首次启动时调用一次即可)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { // 配置渠道属性 CharSequence name = "消息通知渠道"; String description = "用于接收消息推送"; int importance = NotificationManager.IMPORTANCE_HIGH; // 高优先级,会弹出横幅+触发声音振动 NotificationChannel channel = new NotificationChannel(CHANNEL_ID, name, importance); channel.setDescription(description); // 渠道里配置声音和振动 channel.setSound(alarmSound, Notification.AUDIO_ATTRIBUTES_DEFAULT); channel.enableVibration(true); channel.setVibrationPattern(new long[] { 1000, 1000, 1000, 1000, 1000 }); // 注册渠道到系统 NotificationManager notificationManager = getSystemService(NotificationManager.class); notificationManager.createNotificationChannel(channel); }
第二步:通知Builder的配置可保留低版本兼容代码
你原有Builder代码不需要修改,保留setSound和setVibrate用于兼容Android 7.1及以下系统即可。
内容的提问来源于stack exchange,提问作者Blas Piris
相关产品推荐
相关产品推荐

