我正在尝试播放媒体类型为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
答案 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);
并且将控制警报流。