2012-07-03 12 views
8

¿Hay alguna manera de escuchar el evento de cambio de volumen en Android, sin solo tomar los botones de volumen?Escuche los eventos de cambios de volumen en Android

Lo único que he encontrado que funciona es here, pero funciona solo después de que el control de volumen ha desaparecido.

No todos los dispositivos tienen botones de volumen, y necesito capturar los cambios de volumen tan pronto como ocurran, y no después de que el cuadro de diálogo de volumen haya desaparecido.

+0

Use ContentObserver y obtenga los volúmenes de audiomanager. Recientemente lo utilicé y funciona muy bien. [Verifique esta solución en stackoverflow] (http://stackoverflow.com/questions/6896746/android-is-there-a-broadcast-action-for-volume-changes) – user2503849

+0

it' es una publicación más antigua, pero es insignificante que no haya implementado un broadcat hasta ahora en Android ... 5 años después, todavía no se emitió ... – Opiatefuchs

+1

@Opiatefuchs Quizás cree una solicitud para ello, aquí: https://issuetracker.google.com/issues. Voy a protagonizarlo :) –

Respuesta

0

Se puede utilizar: registerMediaButtonEventReceiver (ComponentName EventReceiver) que registra un componente a ser el único receptor de las intenciones 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); 

lo que estamos haciendo aquí es la definición de un BroadcastReceiver que se ocupa de ACTION_MEDIA_BUTTON. y usa EXTRA_KEY_EVENT que contiene el evento clave que causó que la transmisión obtuviera lo que se presionó y actúe de acuerdo con eso.

+2

pero ¿no es solo capturar los botones de volumen? ¿Qué ocurriría con los dispositivos que no los tienen? Además, ¿qué pasa con los dispositivos que los tienen, pero el usuario ha tocado la barra de búsqueda de volumen después de que se mostró? en tales casos, no podré capturar los eventos ... –

+1

registerMediaButtonEventReceiver funciona para botones de auriculares pero no para los botones de hardware de los teléfonos. Lo intenté. – uTubeFan

3

ok, por ahora, lo que hago es escuchar los botones de volumen usando onKeyDown (y verificar KEYCODE_VOLUME_DOWN, KEYCODE_VOLUME_MUTE, KEYCODE_VOLUME_UP), y usando un controlador he publicado un nuevo archivo ejecutable que verifica el nivel de volumen.

también, dado que algunos dispositivos tienen un cuadro de diálogo de volumen, he agregado un oyente cuando se está desapareciendo, de acuerdo con this link.

+1

Dado que [android.media.VOLUME_CHANGED_ACTION] (http://stackoverflow.com/a/8974510/725417) no es una opción viable y dado que registerMediaButtonEventReceiver ni siquiera funciona, su enfoque parece ser el único (hasta ahora). Gracias +1. – uTubeFan

1

Utilice el receptor de difusión VOLUME_CHANGED_ACTION y luego use AudioManager para obtener el volumen actual.

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

¿estás seguro de que funciona? ¿Has leído esto: http://stackoverflow.com/a/8974510/878126? –

+0

@androiddeveloper funciona en muchos casos, simplemente no hay garantía ya que es un sistema privado y, por lo tanto, está sujeto a cambios/eliminación sin previo aviso. – CCJ

+0

No funciona en Android O con seguridad –

15

Mejor, se puede registrar un ContentObserver de la siguiente manera:

getApplicationContext().getContentResolver().registerContentObserver(android.provider.Settings.System.CONTENT_URI, true, new ContentObserver(){...}); 

Su ContentObserver podría tener este aspecto:

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

Cuando se hace:

getApplicationContext().getContentResolver().unregisterContentObserver(mContentObserver); 

Una precaución , creo h: a veces las notificaciones parecen retrasarse si hay muchas pulsaciones de botones rápidamente.

+0

¿Cómo puedo buscar una pulsación larga para el botón de volumen? –

+0

Gracias es trabajo para mí. –

+0

debe marcarse como respuesta aceptada. – Opiatefuchs

Cuestiones relacionadas