J'écris une application très simple qui joue un son lorsqu'on appuie sur un bouton. Comme ce bouton n'a pas beaucoup de sens lorsque l'appareil est réglé sur le silence, je veux le désactiver lorsque le volume audio de l'appareil est à zéro. (Et le réactiver ensuite lorsque le volume est remonté).
Je cherche un moyen fonctionnel (et sûr pour l'AppStore) de détecter le réglage actuel du volume et recevoir une notification/un rappel lorsque le niveau de volume change. I ne pas vouloir modifier le volume réglage.
Tout ceci est mis en œuvre dans mon ViewController
où ledit bouton est utilisé. J'ai testé ceci avec un iPhone 4 sous iOS 4.0.1 et 4.0.2 ainsi qu'un iPhone 3G sous 4.0.1. Construit avec iOS SDK 4.0.2 avec llvm 1.5. (L'utilisation de gcc ou llvm-gcc n'améliore rien.) Il n'y a pas de problèmes pendant la mise en œuvre de la compilation, ni d'erreurs ni d'avertissements. L'analyseur statique est également satisfait.
Voici ce que j'ai essayé jusqu'à présent, sans succès.
En suivant la documentation des services audio d'Apple, je devrais enregistrer un AudioSessionAddPropertyListener
para kAudioSessionProperty_CurrentHardwareOutputVolume
qui devrait fonctionner comme suit :
// Registering for Volume Change notifications
AudioSessionInitialize(NULL, NULL, NULL, NULL);
returnvalue = AudioSessionAddPropertyListener (
kAudioSessionProperty_CurrentHardwareOutputVolume ,
audioVolumeChangeListenerCallback,
self
);
returnvalue
est 0
ce qui signifie que l'enregistrement de la fonction de rappel a fonctionné.
Malheureusement, je ne reçois jamais de rappel à ma fonction. audioVolumeChangeListenerCallback
lorsque j'appuie sur les boutons de volume de mon appareil, sur le cliqueur de l'oreillette ou que je bascule l'interrupteur sonnerie-silence.
Lorsque l'on utilise exactement le même code pour s'enregistrer pour kAudioSessionProperty_AudioRouteChange
(qui est utilisé comme un exemple de projet analogue dans les vidéos de la WWDC, dans la documentation destinée aux développeurs et sur de nombreux sites Internet), j'ai en fait faire obtenir un rappel lors du changement de la route audio (en branchant/débranchant un casque ou en connectant l'appareil).
Un utilisateur nommé Doug a ouvert un fil de discussion intitulé Événement de changement de volume de l'iPhone pour un volume déjà maximal où il affirme utiliser cette méthode avec succès (à moins que le volume ne change pas réellement car il est déjà réglé au maximum). Pourtant, cela ne fonctionne pas pour moi.
Un autre moyen que j'ai essayé est de s'inscrire à NSNotificationCenter
comme ça.
// sharedAVSystemController
AudioSessionInitialize(NULL, NULL, NULL, NULL);
NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter];
[notificationCenter addObserver:self
selector:@selector(volumeChanged:)
name:@"AVSystemController_SystemVolumeDidChangeNotification"
object:nil];
Cela devrait notifier ma méthode volumeChanged
de tout SystemVolume
mais il ne le fait pas réellement.
Comme la croyance commune me dit que si l'on travaille trop dur pour réaliser quelque chose avec Cocoa, on fait quelque chose de fondamentalement mauvais, je m'attends à rater quelque chose ici. Il est difficile de croire qu'il y a pas de moyen simple à obtenir le niveau de volume actuel, mais je n'ai pas été en mesure d'en trouver une en utilisant la documentation d'Apple, les exemples de code, Google, les forums de développeurs d'Apple ou en regardant les vidéos de la WWDC 2010.
1 votes
Consultez la réponse de Stuart ci-dessous pour la solution iOS7.