2013-04-23 3 views
1

dans mon application J'ai un VerticalSeekBar (une mise en œuvre personnalisée de SeekBar) dont la progression devrait changer lorsque l'utilisateur change le volume de médias en utilisant les boutons matériels. Voici une solution demi-travail en utilisant un ContentObserver:Android - détecter le changement de volume de flux

 public class SettingsContentObserver extends ContentObserver { 

    private VerticalSeekBar sb; 
    private AudioManager am; 

public SettingsContentObserver(Handler handler, VerticalSeekBar sb, AudioManager am) { 
    super(handler); 
    this.sb = sb; 
    this.am = am; 

} 

@Override 
public boolean deliverSelfNotifications() { 
    return super.deliverSelfNotifications(); 
} 

@Override 
public void onChange(boolean selfChange) { 
    super.onChange(selfChange); 
    sb.setProgress(am.getStreamVolume(AudioManager.STREAM_MUSIC)); 

} 
    } 

Activité:

 @Override 
protected void onResume() { 
    super.onResume(); 
    mSettingsContentObserver = new SettingsContentObserver(new Handler(), vBar, audioMan); 
    this.getApplicationContext().getContentResolver().registerContentObserver( 
     android.provider.Settings.System.CONTENT_URI, true, 
     mSettingsContentObserver); 

} 

La question: les changements de volume sont détectés mais il y a un délai de quelques secondes jusqu'à ce qu'ils soient détectés et les changements de progrès de SeekBar .

La question: existe-t-il un moyen plus fiable d'écouter les changements de volume sur un flux de volume particulier? S'il vous plaît partager votre solution au cas où vous en avez

Répondre

3

J'ai déjà fait une solution qui surveille le niveau du volume pendant un appel téléphonique, donc cela devrait être similaire.

Vous pouvez écouter les touches enfoncées dans votre activité (onKey) et vérifier le code clé correspondant (VOLUME_UP ou VOLUME_DOWN).

Ou, si vous ne pouvez pas écouter les événements clés pour une raison quelconque (une vue à distance), juste interroger le niveau de volume à une fréquence assez rapide:

  1. Utilisez am.getStreamVolume(AudioManager.STREAM_MUSIC) pour interroger le niveau de volume .

  2. Exécutez ceci à la fréquence désirée. Par exemple:

    private Runnable mVolumeUpdateRunnable = new Runnable() { 
        public void run() { 
         if (shouldUpdate) 
         { 
           updateCurrentVolume(); 
           new Handler().postDelayed(mVolumeUpdateRunnable, VOLUME_SAMPLING_DELAY); 
         } 
        } 
    }; 
    

Les appels ne sont pas chers, donc il ne devrait pas être un gros problème de mise à jour à une fréquence élevée.

0

flux de vote vol à une fréquence élevée augmenter l'utilisation du processeur, dans mon cas, il était de 14%

Questions connexes