在Android上收听音量变化事件

时间:2012-07-03 20:47:18

标签: android event-handling volume

有没有办法在不占用音量按钮的情况下在Android上收听音量变化事件?

我发现唯一可行的是here,但只有在音量控制消失后才能正常工作。

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

4 个答案:

答案 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,其中包含导致广播获取被按下并对其进行操作的键事件。