小米设备Push Notification无声 如何获取通知声音设置状态
小米OS通知「允许声音」开关状态获取方案
小米MIUI/澎湃OS的通知声音拦截逻辑是系统层私有实现,没有公开API暴露对应状态,可通过读取系统Secure设置表的私有字段实现状态判断,全版本兼容方案如下:
1. 前置校验
首先判断当前运行设备是否为小米定制ROM,避免在其他品牌设备上执行私有逻辑导致异常。通过反射读取系统属性即可判断,无需特殊权限:
// 反射读取系统属性工具类 object SysProp { fun get(key: String, default: String = ""): String { return try { val clz = Class.forName("android.os.SystemProperties") val getMethod = clz.getMethod("get", String::class.java, String::class.java) getMethod.invoke(null, key, default) as String } catch (e: Exception) { default } } } // 判断是否为小米ROM val isXiaomiROM = SysProp.get("ro.miui.ui.version.name").isNotEmpty()
非小米ROM直接走原生通知逻辑即可,不需要执行后续判断。
2. 读取开关状态
小米将通知声音全局开关的状态存在Settings.Secure表中,不同系统版本对应字段名不同,做兼容读取即可:
- MIUI 13、澎湃OS 1.0及以上版本字段:
mi_notification_sound_enable - MIUI 12及更早版本字段:
notification_sound_enabled - 字段值为
1代表开关开启,0代表开关关闭
封装好的判断方法如下:
fun isXiaomiNotificationSoundOn(context: Context): Boolean { if (!isXiaomiROM) return true val resolver = context.contentResolver // 优先读新版字段,不存在则fallback到旧版字段,都读不到默认认为是开启状态 val state = Settings.Secure.getInt( resolver, "mi_notification_sound_enable", Settings.Secure.getInt(resolver, "notification_sound_enabled", 1) ) return state == 1 }
读取该字段不需要申请任何特殊权限,普通三方应用可直接访问。
3. 用户引导实现
检测到开关为关闭状态时,不要硬编码跳转小米设置的私有页面,直接调用Android原生通知设置Intent即可,系统会自动定位到当前应用的通知管理页,小米ROM会自动在该页面展示「允许声音」开关选项,兼容性最高:
fun jumpToAppNotificationSetting(context: Context) { val intent = Intent(Settings.ACTION_APP_NOTIFICATION_SETTINGS) intent.putExtra(Settings.EXTRA_APP_PACKAGE, context.packageName) intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) context.startActivity(intent) }
弹窗提示建议明确告知用户影响:当前系统已关闭应用通知声音权限,无法收到消息提示音,是否前往设置开启?
注意事项
- 部分开发版/内测版MIUI可能存在字段名调整,如果读取失败默认返回开启状态,不要误触发弹窗干扰用户。
- 安卓13及以上版本需要先确认已获得
POST_NOTIFICATIONS运行时权限,否则通知本身无法弹出,和声音开关逻辑无关。 - 不要尝试反射调用小米系统服务类获取状态,不同版本混淆规则不同,极易出现崩溃。
内容的提问来源于stack exchange,提问作者Virendra
相关产品推荐
相关产品推荐

