有没有办法在不占用音量按钮的情况下在Android上收听音量变化事件?
我发现唯一可行的是here,但只有在音量控制消失后才能正常工作。
并非所有设备都有音量按钮,我需要在音量发生变化时立即捕捉音量变化,而不是在音量对话框消失后。
答案 0 :(得分:20)
更好的是,您可以按如下方式注册ContentObserver
:
getApplicationContext().getContentResolver().registerContentObserver(android.provider.Settings.System.CONTENT_URI, true, new ContentObserver(){...} );
您的ContentObserver可能如下所示:
public class SettingsContentObserver extends ContentObserver {
private AudioManager audioManager;
public SettingsContentObserver(Context context, Handler handler) {
super(handler);
audioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
}
@Override
public boolean deliverSelfNotifications() {
return false;
}
@Override
public void onChange(boolean selfChange) {
int currentVolume = audioManager.getStreamVolume(AudioManager.STREAM_MUSIC);
Log.d(TAG, "Volume now " + currentVolume);
}
}
完成后:
getApplicationContext().getContentResolver().unregisterContentObserver(mContentObserver);
但是,有一点需要注意 - 如果快速按下很多按钮,有时通知似乎会延迟。
答案 1 :(得分:3)
好的,现在,我所做的是使用onKeyDown监听音量按钮(并检查KEYCODE_VOLUME_DOWN,KEYCODE_VOLUME_MUTE,KEYCODE_VOLUME_UP),并使用处理程序我发布了一个新的runnable来检查音量级别。
另外,由于某些设备有一个音量对话框,我根据this link添加了一个监听器,当它消失时。
答案 2 :(得分:1)
使用广播接收器VOLUME_CHANGED_ACTION,然后使用AudioManager获取当前音量。
<receiver android:name="VolumeChangeReceiver" >
<intent-filter>
<action android:name="android.media.VOLUME_CHANGED_ACTION" />
</intent-filter>
</receiver>
答案 3 :(得分:0)
您可以使用: registerMediaButtonEventReceiver(ComponentName eventReceiver) 它将组件注册为MEDIA_BUTTON意图的唯一接收者。
// in your activity.
MediaButtonReceiver receiver = new MediaButtonReceiver();
// in onCreate put
registerMediaButtonEventReceiver(receiver);
class MediaButtonReceiver implements BroadcastReceiver {
void onReceive(Intent intent) {
KeyEvent ke = (KeyEvent)intent.getExtra(Intent.EXTRA_KEY_EVENT);
if (ke .getKeyCode() == KeyEvent.KEYCODE_VOLUME_DOWN) {
//action when volume goes down
}
if (ke .getKeyCode() == KeyEvent.KEYCODE_VOLUME_UP) {
//action when volume goes up
}
}
}
//In both onStop and onPause put :
unregisterMediaButtonEventReceiver(receiver);
我们在这里做的是定义一个处理ACTION_MEDIA_BUTTON的BroadcastReceiver。并使用EXTRA_KEY_EVENT,其中包含导致广播获取被按下并对其进行操作的键事件。