Android 第一次开机后来通知无提示音

Posted 虫师魁拔

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android 第一次开机后来通知无提示音相关的知识,希望对你有一定的参考价值。

这个问题是由于原生系统设计上存在缺陷。在 NotificationManagerService.java 中,处理通知发布时,有个函数

int buzzBeepBlinkLocked(NotificationRecord record)

此函数会检测通知是否能发出提示音或振动。

if (hasAudibleAlert && !shouldMuteNotificationLocked(record)) 
    if (!sentAccessibilityEvent) 
        sendAccessibilityEvent(notification, record.getSbn().getPackageName());
        sentAccessibilityEvent = true;
    
    if (DBG) Slog.v(TAG, "Interrupting!");
    if (hasValidSound) 
        if (isInCall()) 
            playInCallNotification();
            beep = true;
         else 
            // 播放通知音
            beep = playSound(record, soundUri);
        
        if(beep) 
            mSoundNotificationKey = key;
        
    

出现问题时,shouldMuteNotificationLocked 判断异常,无法进入播放提示音。

    boolean shouldMuteNotificationLocked(final NotificationRecord record) 

... ...

        // muted by listener
        final String disableEffects = disableNotificationEffects(record);
        if (disableEffects != null) 
            ZenLog.traceDisableEffects(record, disableEffects);
            return true;
        

跟踪代码,disableNotificationEffects 返回不为空,这个函数中设置了几种情况,每种不同的禁止提示音的,对应返回不同的字符串。

private String disableNotificationEffects(NotificationRecord record) 
    if (mDisableNotificationEffects) 
        return "booleanState";
    
    if ((mListenerHints & HINT_HOST_DISABLE_EFFECTS) != 0) 
        return "listenerHints";
    
    if (record != null && record.getAudioAttributes() != null) 
        if ((mListenerHints & HINT_HOST_DISABLE_NOTIFICATION_EFFECTS) != 0) 
            if (record.getAudioAttributes().getUsage()
                    != AudioAttributes.USAGE_NOTIFICATION_RINGTONE) 
                return "listenerNoti";
            
        
        if ((mListenerHints & HINT_HOST_DISABLE_CALL_EFFECTS) != 0) 
            if (record.getAudioAttributes().getUsage()
                    == AudioAttributes.USAGE_NOTIFICATION_RINGTONE) 
                return "listenerCall";
            
        
    
    if (mCallState != TelephonyManager.CALL_STATE_IDLE && !mZenModeHelper.isCall(record)) 
        return "callState";
    
    return null;
;

第一次开机无声,就是由于这里的 mDisableNotificationEffects 值不对,被禁止。这个值在NMS服务初始化时有个判断如下。

if (0 == Settings.Global.getInt(getContext().getContentResolver(),
            Settings.Global.DEVICE_PROVISIONED, 0)) 
    mDisableNotificationEffects = true;

DEVICE_PROVISIONED 这个属性值是开机向导里面会去设置的,但是我们这个NMS系统服务会先于开机向导启动,所以 mDisableNotificationEffects 默认就被置为true了,导致第一次开机无声。

以上是关于Android 第一次开机后来通知无提示音的主要内容,如果未能解决你的问题,请参考以下文章

Android 通知及通知提示音

Android 通知及通知提示音

Android 通知及通知提示音

Android 通知及通知提示音

android 设置整个app的通知栏Notification 的声音和震动用啥方法

模拟器上没有提示音