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

标签 android android-mediaplayer

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

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

我正在寻找一种始终有效的实现方式,无论用户处于何种 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();

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

Android 文档说明如下:

“默认情况下,按下音量控件会修改 Activity 音频流的音量。”

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

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

还是我做错了什么?

提前致谢!

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

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

最佳答案

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

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 在使用音量按钮控制声音时表现不一致是设计使然。经过。设计。 :(

关于Android:使用硬件键控制 STREAM_ALARM 音量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28925023/

相关文章:

android - 如何在 Android 的内部缓存目录中创建图像文件

android - 在 Samsung Galaxy S5 Android 5.0 上使用 MediaPlayer 加载音频流需要超过 10 秒

android - 将 android-support-v7-appcompat 添加到 Eclipse 上的项目时,项目选择 Pane 为空白

java - 将 AsyncTask 转换为 RxJava (Android)

android - 为什么 MyLocationOverlay 不起作用?

android - GPS 让我只有一个位置,而且永远不会改变 Android

AndroidId MediaPlayer 报错(1,-4) prepareAsync 方法

Android MediaPlayer getCurrentPosition 返回 0

java - 一个公共(public)媒体播放器类可用于所有 Activity

java - 如何使用 Picasso 从 .mp3 文件中检索专辑封面