Android:使用硬件密钥控制STREAM_ALARM卷

时间:2015-03-08 09:35:22

标签: android android-mediaplayer

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

它需要是STREAM_ALARM,因为它实际上是一个警报:即使插入耳机和/或手机设置为静音,它也应该通过扬声器播放。

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

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

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();

但是当我按下手机上的音量按钮时,它会更改媒体音量而不是警报(使用Android 4.4和5.0进行测试)

Android文档说明如下:

“默认情况下,按音量控制可修改活动音频流的音量。”

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

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

或者我做错了什么?

提前致谢!

更新:我已将此报告为AOSP Bug Tracker上的一个错误并且已被接受..所以我猜这实际上应该像我上面描述的那样工作,但事实并非如此:S

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

3 个答案:

答案 0 :(得分:1)

回答我自己的问题:事实证明,Google认为硬件音量按钮始终控制着你听到的内容是完全合理的。除非它是一个警报。那么你必须进入应用程序并使用音量按钮:

  

默认情况下,音量键永远不会控制警报流量。它们在时钟应用程序中或在音量面板中激活警报音量滑块时执行。

     

应用程序必须使用ALARM流调用Activity.setVolumeControlStream()以使卷键控制ALARM流量

状态:WorkingAsIntended

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

所以我没有做错任何事,设计上说Android在使用音量按钮控制声音方面表现不一致。通过。设计。 :(

答案 1 :(得分:0)

覆盖活动的onKeyDown()。查找按下的音量按钮。发生这种情况时,请通过setStreamVolume设置新卷。

答案 2 :(得分:0)

如果用户在您的活动中并使用硬件密钥添加:

    setVolumeControlStream(AudioManager.STREAM_ALARM);

并且将控制警报流。