2013-06-19 5 views
3

J'ai rencontré un problème lorsque je voulais implémenter la détection de changement de volume. Comme la détection de changement doit être détectée en arrière-plan via Service, je ne peux pas intercepter les touches de volume.Comment enregistrer ContentObserver pour un changement de volume de support?

J'ai essayé ContentObserver d'écouter les changements de paramètres de volume, mais cela n'a pas fonctionné. Mais j'ai creuser un peu plus, et a constaté que mon ContentObserver détecte le changement de volume quand je l'enregistrer comme ceci:

this.getApplicationContext().getContentResolver().registerContentObserver( 
    android.provider.Settings.System.CONTENT_URI, true, 
    mSettingsContentObserver); 

J'ai essayé de changer le premier paramètre - l'URI de mettre à l'écoute, si Je comprends bien. Mais je n'ai rien accompli. Alors, comment cela peut-il être fait? Je ne veux pas mettre à jour mon interface utilisateur (je mets Seekbar à certains positin) à chaque changement de paramètres. Alors, comment enregistrer l'observateur de contenu pour écouter le changement de volume de support?

Voici le code de ContentObserver:

public class SettingsContentObserver extends ContentObserver { 

public SettingsContentObserver(Handler handler) { 
    super(handler); 
} 

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

@Override 
public void onChange(boolean selfChange) { 
    super.onChange(selfChange); 
    myMethod(); 
} 
} 

Répondre

3

Changer votre onChange meathod au

suivant
@Override 
public void onChange(boolean selfChange) { 
    super.onChange(selfChange); 

    AudioManager audio = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE); 
    int currentVolume = audio.getStreamVolume(AudioManager.STREAM_MUSIC); 

    int delta=previousVolume-currentVolume; 

    if(delta>0) 
    { 
     Logger.d("Decreased"); 
     previousVolume=currentVolume; 
    } 
    else if(delta<0) 
    { 
     Logger.d("Increased"); 
     previousVolume=currentVolume; 
    } 
} 
+0

Merci. mais ce n'est pas exactement ce que je veux. Bien sûr, cela empêchera la mise à jour de mon interface utilisateur, mais elle est quand même appelée quand n'importe quel paramètre a changé. La question est de savoir comment enregistrer ContentObserver pour certains paramètres spécifiques. –

+1

Cela ne peut pas être fait car il n'y a pas obserevr disponible pour cela. Ce que vous faites actuellement est, en observant tous les descendants dans la hiérarchie du Système. Paramètres. Lire http://developer.android.com/reference/android/content/ContentResolver.html#registerContentObserver(android.net.Uri, booléen, android.database.ContentObserver) – anon

+0

Comment puis-je utiliser le contenu observateur pour détecter en maintenant le bouton de volume ? –

0

Vous pouvez surveiller les modifications apportées à un flux spécifique en utilisant une URI plus spécifique que Settings.System .CONTENT_URI. La méthode Settings.System.getUriFor() renvoie l'URI pour un flux spécifique.

Par exemple:

Uri uri = Settings.System.getUriFor(Settings.System.VOLUME_SETTINGS[AudioManager.STREAM_RING]); 
appContext.getContentResolver().registerContentObserver(uri, true, myObserver); 
+0

Comment puis-je utiliser l'observateur de contenu pour détecter le maintien du bouton de volume? –

+0

J'ai aussi une question avec l'observateur de contenu: http://stackoverflow.com/questions/35256364/volume-always-the-same –

0

Andy Dennie:

Je viens approche éprouvée suggérée par vous:

Uri uri = Settings.System .getUriFor(Settings.System.VOLUME_SETTINGS[AudioManager.STREAM_MUSIC]); appContext.getContentResolver().registerContentObserver(uri, true, myObserver);

et si je vous inscrire à cet URI, le volume change sur STREAM_MUSIC ne sont pas détectés. Mais si j'utilise

android.provider.Settings.System.CONTENT_URI

cela fonctionne parfaitement.

Questions connexes