Android: 使用硬件键控制 STREAM_ALARM 音量

Android: Control STREAM_ALARM volume with hardware keys

我正在尝试播放媒体类型为 STREAM_ALARM 的广播流,并使用硬件按钮更改其音量。

它需要是 STREAM_ALARM 因为它实际上是一个闹钟:它应该通过扬声器播放,即使头 phone 已插入 and/or phone 已设置沉默。

我正在寻找一个始终有效的实现,无论 activity 用户在什么位置(因此它也应该在例如主屏幕中工作)。我知道我可以覆盖 onKeyUp/Down 但这只适用于我的 activity)

这是我现在做的(简化代码)

audioMgr.requestAudioFocus(
    afChangeListener, 
    AudioManager.STREAM_ALARM, 
    AudioManager.AUDIOFOCUS_GAIN
);

if (mp!=null) { mp.release(); mp = null;}
mp = new MediaPlayer();
mp.setDataSource(streamUrl);
mp.setAudioStreamType(AudioManager.STREAM_ALARM);
mp.setOnPreparedListener(onPreparedListener);
mp.prepareAsync();

然后当 onPreparedListener 触发时:

mp.start();

但是当我按下 phone 上的音量按钮时,它改变了媒体音量而不是警报(使用 Android 4.4 和 5.0 测试)

Android 文档说明如下:

"By default, pressing the volume controls modify the volume of the active audio stream."

来源:http://developer.android.com/training/managing-audio/volume-playback.html#HardwareVolumeKeys

所以我想问题是:如何(正确地)将 STREAM_ALARM 设置为活动音频流?

还是我做错了什么?

提前致谢!

更新:我已经在 AOSP Bug Tracker 上将其报告为一个错误并且它被接受了..所以我想这实际上应该像我上面描述的那样工作但它没有 :S

Link: https://code.google.com/p/android/issues/detail?id=183843

覆盖 activity 的 onKeyDown()。查看按下的音量按钮。当它发生时,通过 setStreamVolume 设置一个新音量。

如果用户在您的 Activity 中并使用硬件键添加:

    setVolumeControlStream(AudioManager.STREAM_ALARM);

并且报警流将被控制。

回答我自己的问题:事实证明 Google 认为硬件音量按钮始终控制 "what you hear" 是完全合理的,除非是闹钟。然后你必须进入应用程序并使用音量按钮:

Volume keys never control alarm stream volume by default. They do in clock app or when the alarm volume slider is active in the volume panel.

An application must call Activity.setVolumeControlStream() with ALARM stream to have the volume keys control the ALARM stream volume

状态:按预期工作

https://code.google.com/p/android/issues/detail?id=183843

所以我没有做错任何事,Android 在使用音量按钮控制声音时表现不一致是设计使然。经过。设计。 :(