2012-07-03 2 views
8

Есть ли способ прослушать событие смены громкости на Android, не просто используя кнопки регулировки громкости?Слушайте изменения громкости на Android

Единственное, что я обнаружил, что работает here, но работает только после исчезновения регулятора громкости.

Не все устройства имеют кнопки регулировки громкости, и мне нужно зафиксировать изменения громкости, как только они появятся, а не после исчезновения диалога громкости.

+0

Используйте ContentObserver и получите тома от аудиомастера. Я недавно использовал его, и он отлично работает. [Проверить это решение в stackoverflow] (http://stackoverflow.com/questions/6896746/android-is-there-a-broadcast-action-for-volume-changes) – user2503849

+0

it' s более старая почта, но ничтожно, что в настоящее время в Android не реализована широкоформатная передача ... 5 лет спустя, до сих пор нет трансляции ... – Opiatefuchs

+1

@Opiatefuchs Возможно, создайте запрос для этого, здесь: https://issuetracker.google.com/issues. Я буду звать это :) –

ответ

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); 

, что мы делаем здесь является определение BroadcastReceiver, которая занимается ACTION_MEDIA_BUTTON. и используйте EXTRA_KEY_EVENT, который содержит ключевое событие, которое заставило трансляцию получить то, что было нажато, и действовать по этому поводу.

+2

, но разве это не просто захват кнопок регулировки громкости? что произойдет для устройств, которые их не имеют? также, что относительно устройств, которые имеют их, но пользователь коснулся панели поиска тома после того, как она была показана? в таких случаях я не смогу захватить события ... –

+1

registerMediaButtonEventReceiver работает для кнопок гарнитуры, но не для аппаратных кнопок телефона. Я просто попробовал. – uTubeFan

3

нормально, потому что теперь, что я делаю это слушать кнопки регулировки громкости с помощью OnKeyDown (и проверьте KEYCODE_VOLUME_DOWN, KEYCODE_VOLUME_MUTE, KEYCODE_VOLUME_UP), и с помощью обработчика я отправил новый Runnable, который проверяет уровень громкости.

также, поскольку на некоторых устройствах есть диалог тома, я добавил слушателя, когда он исчез, в соответствии с this link.

+1

Поскольку [android.media.VOLUME_CHANGED_ACTION] (http://stackoverflow.com/a/8974510/725417) не является жизнеспособным вариантом, и поскольку registerMediaButtonEventReceiver даже не работает, ваш подход кажется единственным способом (до сих пор). Спасибо +1. – uTubeFan

1

Используйте широковещательный приемник VOLUME_CHANGED_ACTION, затем используйте AudioManager для получения текущего тома.

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

Вы уверены, что это работает? вы прочитали это: http://stackoverflow.com/a/8974510/878126? –

+0

@androiddeveloper работает во многих случаях, нет гарантии, поскольку он системно-частный и поэтому может быть изменен/удален без уведомления. – CCJ

+0

Не работает на Android O точно –

15

Более того, вы можете зарегистрировать 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); 

Один предостережение , тыс. h - иногда уведомления, кажется, задерживаются, если есть много нажатий на кнопки быстро.

+0

Как я могу долго нажать кнопку регулировки громкости? –

+0

Спасибо за свою работу за меня. –

+0

должен быть отмечен как принятый ответ .. – Opiatefuchs

Смежные вопросы