在Android上收听音量更改事件

有没有什么办法可以在Android上听音变化的事件,而不是只接pipe音量button?

我发现的唯一的作品就在这里 ,但它只有在音量控制消失后才起作用。

并不是所有的设备都有音量button,我需要在音量变化发生后立即捕捉音量变化,而不是在音量对话框消失之后。

Solutions Collecting From Web of "在Android上收听音量更改事件"

更好的是,你可以注册一个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); 

但请注意,如果快速按下大量button,通知似乎会延迟。

好了,现在我所做的就是使用onKeyDown(并检查KEYCODE_VOLUME_DOWN,KEYCODE_VOLUME_MUTE,KEYCODE_VOLUME_UP)来监听音量button,并使用一个处理程序发布了一个新的可检查音量级别的runnable。

另外,由于一些设备有一个音量对话框,我已经添加了一个监听器,当它正在消失时,根据这个链接 。

使用广播接收机VOLUME_CHANGED_ACTION,然后使用AudioManager获取当前音量。

 <receiver android:name="VolumeChangeReceiver" > <intent-filter> <action android:name="android.media.VOLUME_CHANGED_ACTION" /> </intent-filter> </receiver> 

您可以使用: 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,其中包含导致广播获得按下的按键事件的事件。