Android声音焦点----从音乐回到Luncher调节音量显示的是Music的音量

来源:互联网 发布:华海大厦3楼桑拿js 编辑:程序博客网 时间:2024/04/29 19:21

声音的类型有:定义在AudioSystem.java文件中

/* The default audio stream */public static final int STREAM_DEFAULT = -1;/* The audio stream for phone calls */public static final int STREAM_VOICE_CALL = 0;/* The audio stream for system sounds */public static final int STREAM_SYSTEM = 1;/* The audio stream for the phone ring and message alerts */public static final int STREAM_RING = 2;/* The audio stream for music playback */public static final int STREAM_MUSIC = 3;/* The audio stream for alarms */public static final int STREAM_ALARM = 4;/* The audio stream for notifications */public static final int STREAM_NOTIFICATION = 5;/* @hide The audio stream for phone calls when connected on bluetooth */public static final int STREAM_BLUETOOTH_SCO = 6;/* @hide The audio stream for enforced system sounds in certain countries (e.g camera in Japan) */public static final int STREAM_SYSTEM_ENFORCED = 7;/* @hide The audio stream for DTMF tones */public static final int STREAM_DTMF = 8;/* @hide The audio stream for text to speech (TTS) */public static final int STREAM_TTS = 9;
正常情况下在音、视频界面调节音量调节的Stream是STREAM_MUSIC,回到Luncher调节的是STREAM_VOICE_CALL,但这个切换有点延迟StreamOverride.sDelayMs,导致退出音、视频界面后马上调节,改变的还是STREAM_MUSIC的大小,如图所示:

可以修改/frameworks/base/media/java/android/media/AudioService.java文件

 /**     * For code clarity for getActiveStreamType(int)     * @param delay_ms max time since last STREAM_MUSIC activity to consider     * @return true if STREAM_MUSIC is active in streams handled by AudioFlinger now or     *     in the last "delay_ms" ms.     */    private boolean isAfMusicActiveRecently(int delay_ms) {        return AudioSystem.isStreamActive(AudioSystem.STREAM_MUSIC, delay_ms)                || AudioSystem.isStreamActiveRemotely(AudioSystem.STREAM_MUSIC, delay_ms);    }    private int getActiveStreamType(int suggestedStreamType) {        switch (mPlatformType) {        case PLATFORM_VOICE:            if (isInCommunication()) {                if (AudioSystem.getForceUse(AudioSystem.FOR_COMMUNICATION)                        == AudioSystem.FORCE_BT_SCO) {                    // Log.v(TAG, "getActiveStreamType: Forcing STREAM_BLUETOOTH_SCO...");                    return AudioSystem.STREAM_BLUETOOTH_SCO;                } else {                    // Log.v(TAG, "getActiveStreamType: Forcing STREAM_VOICE_CALL...");                    return AudioSystem.STREAM_VOICE_CALL;                }            } else if (suggestedStreamType == AudioManager.USE_DEFAULT_STREAM_TYPE) {                if (isAfMusicActiveRecently(StreamOverride.sDelayMs)) {                    if (DEBUG_VOL)                        Log.v(TAG, "getActiveStreamType: Forcing STREAM_MUSIC stream active");                    return AudioSystem.STREAM_MUSIC;                    } else {                        if (DEBUG_VOL)                            Log.v(TAG, "getActiveStreamType: Forcing STREAM_RING b/c default");                        return AudioSystem.STREAM_RING;                }            } else if (isAfMusicActiveRecently(0)) {                if (DEBUG_VOL)                    Log.v(TAG, "getActiveStreamType: Forcing STREAM_MUSIC stream active");                return AudioSystem.STREAM_MUSIC;            }            break;        case PLATFORM_TELEVISION:            if (suggestedStreamType == AudioManager.USE_DEFAULT_STREAM_TYPE) {                    // TV always defaults to STREAM_MUSIC                    return AudioSystem.STREAM_MUSIC;            }            break;        default:            if (isInCommunication()) {                if (AudioSystem.getForceUse(AudioSystem.FOR_COMMUNICATION)                        == AudioSystem.FORCE_BT_SCO) {                    if (DEBUG_VOL) Log.v(TAG, "getActiveStreamType: Forcing STREAM_BLUETOOTH_SCO");                    return AudioSystem.STREAM_BLUETOOTH_SCO;                } else {                    if (DEBUG_VOL)  Log.v(TAG, "getActiveStreamType: Forcing STREAM_VOICE_CALL");                    return AudioSystem.STREAM_VOICE_CALL;                }            } else if (AudioSystem.isStreamActive(AudioSystem.STREAM_NOTIFICATION,                    StreamOverride.sDelayMs) ||                    AudioSystem.isStreamActive(AudioSystem.STREAM_RING,                            StreamOverride.sDelayMs)) {                if (DEBUG_VOL) Log.v(TAG, "getActiveStreamType: Forcing STREAM_NOTIFICATION");                return AudioSystem.STREAM_NOTIFICATION;            } else if (suggestedStreamType == AudioManager.USE_DEFAULT_STREAM_TYPE) {                if (isAfMusicActiveRecently(StreamOverride.sDelayMs)) {                    if (DEBUG_VOL) Log.v(TAG, "getActiveStreamType: forcing STREAM_MUSIC");                    return AudioSystem.STREAM_MUSIC;                } else {                    if (DEBUG_VOL) Log.v(TAG,                            "getActiveStreamType: using STREAM_NOTIFICATION as default");                    return AudioSystem.STREAM_NOTIFICATION;                }            }            break;        }        if (DEBUG_VOL) Log.v(TAG, "getActiveStreamType: Returning suggested type "                + suggestedStreamType);        return suggestedStreamType;    }
把isAfMusicActiveRecently(StreamOverride.sDelayMs) 改为: isAfMusicActiveRecently(0) 或一个小的值。


0 0