Android 应用在显示 android.widget.MediaController 时无法识别音量键按下
Android app not recognising volume key presses when showing android.widget.MediaController
我无法让 Android 应用程序(Android 6.0 上的 运行)在显示 android.widget.MediaController 时响应音量键按下。
当点击片段中的按钮时,媒体控制器由片段显示。
已经加载片段的activity在onCreate中有如下代码:
AudioManager audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
this.setVolumeControlStream(AudioManager.STREAM_MUSIC);
当媒体控制器未显示时,按下音量键会调整音量,并且此音量调整会影响媒体控制器播放声音的音量。
但是,当媒体控制器在应用程序中显示可见时,音量键将被忽略。我已经重写了 activity 的 onKeyDown 方法来检测按键何时被识别,只有当媒体控制器不可见时它们才会被识别。
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
switch (keyCode) {
case KeyEvent.KEYCODE_VOLUME_UP:
Log.i(TAG, "Increased volume");
getAudioManager().adjustStreamVolume(AudioManager.STREAM_MUSIC,
AudioManager.ADJUST_RAISE, AudioManager.FLAG_SHOW_UI);
return true;
case KeyEvent.KEYCODE_VOLUME_DOWN:
Log.i(TAG, "Decreased volume");
getAudioManager().adjustStreamVolume(AudioManager.STREAM_MUSIC,
AudioManager.ADJUST_LOWER, AudioManager.FLAG_SHOW_UI);
return true;
default:
return false;
}
}
当听到声音时,用户往往会想要调节音量,而这恰恰是他们无法调节音量的时候,事情就是这样。如何更改媒体控制器的行为以使其识别音量键按下?
昨天遇到这个问题,偶然发现了你的问题。我知道它很旧,您可能已经找到了解决方法,但我想我应该 post 一个答案,以防其他人在这里找到他们的方法。
你最初的想法很有帮助,但我没有为我的 activity 重写 KeyEvents
的处理程序,而是为 MediaController
.
重写了处理程序
我所做的是覆盖 public boolean dispatchKeyEvent(KeyEvent event)
并像这样初始化我的 MediaController
对象:
mediaControls = new MediaController(this) {
@Override
public boolean dispatchKeyEvent(KeyEvent event) {
int action = event.getAction();
int keyCode = event.getKeyCode();
switch (keyCode) {
case KeyEvent.KEYCODE_VOLUME_UP:
if (action == KeyEvent.ACTION_DOWN) {
audioManager.adjustVolume(AudioManager.ADJUST_RAISE, AudioManager.FLAG_SHOW_UI);
}
break;
case KeyEvent.KEYCODE_VOLUME_DOWN:
if (action == KeyEvent.ACTION_DOWN) {
audioManager.adjustVolume(AudioManager.ADJUST_LOWER, AudioManager.FLAG_SHOW_UI);
}
break;
default:
return super.dispatchKeyEvent(event);
}
return true;
}
};
audioManager
是我的 Activity
中的私有成员,其创建方式与上述问题相同。
希望这会对某人有所帮助。
祝你工作愉快!
我无法让 Android 应用程序(Android 6.0 上的 运行)在显示 android.widget.MediaController 时响应音量键按下。
当点击片段中的按钮时,媒体控制器由片段显示。
已经加载片段的activity在onCreate中有如下代码:
AudioManager audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
this.setVolumeControlStream(AudioManager.STREAM_MUSIC);
当媒体控制器未显示时,按下音量键会调整音量,并且此音量调整会影响媒体控制器播放声音的音量。
但是,当媒体控制器在应用程序中显示可见时,音量键将被忽略。我已经重写了 activity 的 onKeyDown 方法来检测按键何时被识别,只有当媒体控制器不可见时它们才会被识别。
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
switch (keyCode) {
case KeyEvent.KEYCODE_VOLUME_UP:
Log.i(TAG, "Increased volume");
getAudioManager().adjustStreamVolume(AudioManager.STREAM_MUSIC,
AudioManager.ADJUST_RAISE, AudioManager.FLAG_SHOW_UI);
return true;
case KeyEvent.KEYCODE_VOLUME_DOWN:
Log.i(TAG, "Decreased volume");
getAudioManager().adjustStreamVolume(AudioManager.STREAM_MUSIC,
AudioManager.ADJUST_LOWER, AudioManager.FLAG_SHOW_UI);
return true;
default:
return false;
}
}
当听到声音时,用户往往会想要调节音量,而这恰恰是他们无法调节音量的时候,事情就是这样。如何更改媒体控制器的行为以使其识别音量键按下?
昨天遇到这个问题,偶然发现了你的问题。我知道它很旧,您可能已经找到了解决方法,但我想我应该 post 一个答案,以防其他人在这里找到他们的方法。
你最初的想法很有帮助,但我没有为我的 activity 重写 KeyEvents
的处理程序,而是为 MediaController
.
我所做的是覆盖 public boolean dispatchKeyEvent(KeyEvent event)
并像这样初始化我的 MediaController
对象:
mediaControls = new MediaController(this) {
@Override
public boolean dispatchKeyEvent(KeyEvent event) {
int action = event.getAction();
int keyCode = event.getKeyCode();
switch (keyCode) {
case KeyEvent.KEYCODE_VOLUME_UP:
if (action == KeyEvent.ACTION_DOWN) {
audioManager.adjustVolume(AudioManager.ADJUST_RAISE, AudioManager.FLAG_SHOW_UI);
}
break;
case KeyEvent.KEYCODE_VOLUME_DOWN:
if (action == KeyEvent.ACTION_DOWN) {
audioManager.adjustVolume(AudioManager.ADJUST_LOWER, AudioManager.FLAG_SHOW_UI);
}
break;
default:
return super.dispatchKeyEvent(event);
}
return true;
}
};
audioManager
是我的 Activity
中的私有成员,其创建方式与上述问题相同。
希望这会对某人有所帮助。
祝你工作愉快!