web-dev-qa-db-ja.com

Androidで音量変更イベントを聞く

音量ボタンを引き継ぐだけでなく、Androidで音量変更のイベントを聞く方法はありますか?

私が見つけた唯一の機能は ここ ですが、ボリュームコントロールが消えた後にのみ機能します。

すべてのデバイスに音量ボタンがあるわけではありません。音量ダイアログが消えた後ではなく、音量の変化が発生したらすぐにキャプチャする必要があります。

12

より良いことに、次のように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つあります。ボタンをすばやく押す回数が多いと、通知が遅れるように見えることがあります。

22
Tad

さて、今のところ、私がしていることは、onKeyDownを使用して音量ボタンを聞くことです(そしてKEYCODE_VOLUME_DOWN、KEYCODE_VOLUME_MUTE、KEYCODE_VOLUME_UPをチェックします)、そしてハンドラーを使用して、音量レベルをチェックする新しいランナブルを投稿しました。

また、一部のデバイスには音量ダイアログがあるため、 このリンク によると、リスナーが消えるときにリスナーを追加しました。

3

ブロードキャストレシーバーVOLUME_CHANGED_ACTIONを使用してから、AudioManagerを使用して現在のボリュームを取得します。

<receiver Android:name="VolumeChangeReceiver" >
    <intent-filter>
         <action Android:name="Android.media.VOLUME_CHANGED_ACTION" />
    </intent-filter>
</receiver>
1
Apirak Lunla

次を使用できます: 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を使用します。

0
Mouna Cheikhna