2010-11-21 15 views
5

Je suis en train de développer une application appareil photo pour prendre des photos lorsque le bouton de volume est pressé.Audio List Property Property Listener désactivé automatiquement dans UIImagePickerController?

J'ai utilisé AudioSessionAddPropertyListener(kAudioSessionProperty_CurrentHardwareOutputVolume, audioVolumeChangeListenerCallback, self); pour être averti de l'activation d'un bouton de volume avant le démarrage de mon appareil photo. Cependant, après avoir démarré la caméra, cet écouteur de propriété ne fonctionne plus. Est-ce qu'il est auto désactivé ou quelque chose?

J'ai essayé d'implémenter un UIImagePickerController personnalisé pour inclure le Listener Property Listener dans le ImagePickerController mais sans espoir. Reconnaissant si quelqu'un peut partager votre point de vue. Merci.

Répondre

3

Je suis désolé de dire que c'est quelque chose qui n'est pas supporté par IOS4. Si vous avez réussi à l'implémenter, l'application sera rejetée par Apple.

Cependant, il a été annoncé lors de la WWDC 2011 que ceci est entièrement pris en charge dans IO5 et sera le comportement par défaut lors de l'utilisation de UIImagePickerController dans n'importe quelle application.

Espérons que cela aide.

+0

Il n'est pris en charge que si vous définissez la variable "showsCameraControl" de uiimagepickercontroller sur YES – Will

1

Même dans l'application de caméra par défaut sur l'iPhone, monter/baisser le volume n'est pas pris en charge. Peut-être qu'ils bloquent l'entrée de ces boutons lorsque l'appareil photo est allumé. Ce qu'ils ne bloquent pas, c'est l'interrupteur silencieux. J'ai ajouté cette notification et mon rappel a été appelé, même avec l'appareil photo sur:

AudioSessionInitialize(nil, nil, nil, nil); 
AudioSessionSetActive(true); 
AudioSessionAddPropertyListener(
           kAudioSessionProperty_AudioRouteChange, 
           applicationAudioRouteDidChange, 
           self); 

Le problème que vous devez résoudre est que la méthode « applicationAudioRouteDidChange » sera également appelé si quelqu'un insère le casque. Vous pouvez vérifier cela comme dit dans le AudioSessionProgrammingGuide:

Lorsque le système invoque un rappel de changement d'itinéraire, il fournit l'information dont vous avez besoin de comprendre les mesures à prendre. Basez votre rappel sur le prototype AudioSessionPropertyListener des services de session audio , comme indiqué ici:

MyPropertyListener (void * inClientData, AudioSessionPropertyID Inid, UInt32 inDataSize, const void * InData);

Pour un événement de changement d'itinéraire, le système envoie le paramètre kAudioSessionProperty_AudioRouteChange dans le paramètre inID .

Le paramètre InData envoyé à votre rappel contient un objet CFDictionaryRef qui décrit:

Pourquoi la route a changé Qu'est-ce que l'itinéraire précédent était

Je l'ai fait et il faut l'image lorsque l'interrupteur silencieux est mmmm commuté:

void applicationAudioRouteDidChange(void *inClientData, 
           AudioSessionPropertyID inID, 
           UInt32 inDataSize, const void *inData) 
{ 


    if ([[(NSDictionary*)inData objectForKey:@"OutputDeviceDidChange_Reason"] intValue] == 5) { 
     [((RootViewController*)inClientData).picker takePicture]; 
    } 

    // Do something like reset the system 
} 

Comme mentionné par Tom, la fonctionnalité que vous essayez de mettre en œuvre serait une partie d'iOS 5.