音量ボタンを引き継ぐだけでなく、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);
ただし、注意点が1つあります。ボタンをすばやく押す回数が多いと、通知が遅れるように見えることがあります。
さて、今のところ、私がしていることは、onKeyDownを使用して音量ボタンを聞くことです(そしてKEYCODE_VOLUME_DOWN、KEYCODE_VOLUME_MUTE、KEYCODE_VOLUME_UPをチェックします)、そしてハンドラーを使用して、音量レベルをチェックする新しいランナブルを投稿しました。
また、一部のデバイスには音量ダイアログがあるため、 このリンク によると、リスナーが消えるときにリスナーを追加しました。
ブロードキャストレシーバー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を使用します。