在Android上收听音量变化事件

and*_*per 10 android volume event-handling

有没有办法在Android上收听音量变化事件,而不仅仅是接管音量按钮?

我发现唯一有效的方法就在这里,但只有在音量控制消失后才有效.

并非所有设备都有音量按钮,我需要在音量发生变化时立即捕捉它们,而不是在音量对话框消失后.

Tad*_*Tad 22

更好,你可以注册ContentObserver如下:

  getApplicationContext().getContentResolver().registerContentObserver(android.provider.Settings.System.CONTENT_URI, true, new ContentObserver(){...} );
Run Code Online (Sandbox Code Playgroud)

您的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);
    }
}
Run Code Online (Sandbox Code Playgroud)

完成后:

getApplicationContext().getContentResolver().unregisterContentObserver(mContentObserver);
Run Code Online (Sandbox Code Playgroud)

但有一点需要注意 - 如果快速按下大量按钮,有时通知似乎会延迟.


Mou*_*hna 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);
Run Code Online (Sandbox Code Playgroud)

我们在这里所做的是定义一个处理 ACTION_MEDIA_BUTTON 的 BroadcastReceiver。并使用 EXTRA_KEY_EVENT ,它包含导致广播获取按下的内容并对其采取行动的按键事件。

  • 但它不只是捕获音量按钮吗?没有它们的设备会发生什么?另外,如果设备拥有它们,但用户在显示音量搜索栏后触摸了音量搜索栏,该怎么办?在这种情况下,我将无法捕捉事件...... (5认同)