¿Cómo detectar programáticamente el auricular en el iphone?
ipod audio-player (4)
Debe registrarse para recibir una notificación de cambio de AudioRoute e implementar cómo desea manejar los cambios de ruta
// Registers the audio route change listener callback function
AudioSessionAddPropertyListener (kAudioSessionProperty_AudioRouteChange,
audioRouteChangeListenerCallback,
self);
y dentro de la devolución de llamada, puede obtener el motivo del cambio de ruta
CFDictionaryRef routeChangeDictionary = inPropertyValue;
CFNumberRef routeChangeReasonRef =
CFDictionaryGetValue (routeChangeDictionary,
CFSTR (kAudioSession_AudioRouteChangeKey_Reason));
SInt32 routeChangeReason;
CFNumberGetValue (routeChangeReasonRef, kCFNumberSInt32Type, &routeChangeReason);
if (routeChangeReason == kAudioSessionRouteChangeReason_OldDeviceUnavailable)
{
// Headset is unplugged..
}
if (routeChangeReason == kAudioSessionRouteChangeReason_NewDeviceAvailable)
{
// Headset is plugged in..
}
Actualmente estoy trabajando en un proyecto que implica reproducir música desde la biblioteca de música del iPhone dentro de la aplicación que está dentro. Estoy usando MPMediaPickerController para permitir que el usuario seleccione su música y la reproduzca con el reproductor de música iPod dentro del iPhone.
Sin embargo, me encontré con un problema cuando el usuario inserta su auricular y se lo quita. La música se detendrá repentinamente sin ningún motivo. Después de algunas pruebas, descubrí que el reproductor iPod pausará la reproducción cuando el usuario desenchufe el auricular del dispositivo. Entonces, ¿hay alguna forma de detectar programáticamente si el auricular ha sido desenchufado para que pueda reanudar la reproducción de la música? ¿O hay alguna forma de evitar que el reproductor iPod se detenga cuando el usuario desenchufa su auricular?
Hola chicos, simplemente comprueban la aplicación de muestra AddMusic. Resolverá todos los problemas relacionados con tu iPod
Primero registre el reproductor iPod para la notificación con el siguiente código
NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter];
[notificationCenter
addObserver: self
selector: @selector (handle_PlaybackStateChanged:)
name: MPMusicPlayerControllerPlaybackStateDidChangeNotification
object: musicPlayer];
[musicPlayer beginGeneratingPlaybackNotifications];
E implementa el siguiente código en la notificación.
- (void) handle_PlaybackStateChanged: (id) notification
{
MPMusicPlaybackState playbackState = [musicPlayer playbackState];
if (playbackState == MPMusicPlaybackStatePaused)
{
[self playiPodMusic];
}
else if (playbackState == MPMusicPlaybackStatePlaying)
{
}
else if (playbackState == MPMusicPlaybackStateStopped)
{
[musicPlayer stop];
}
}
Si solo desea comprobar si los auriculares están conectados en un momento dado, sin escuchar los cambios de ruta, simplemente puede hacer lo siguiente:
OSStatus error = AudioSessionInitialize(NULL, NULL, NULL, NULL);
if (error)
NSLog("Error %d while initializing session", error);
UInt32 routeSize = sizeof (CFStringRef);
CFStringRef route;
error = AudioSessionGetProperty (kAudioSessionProperty_AudioRoute,
&routeSize,
&route);
if (error)
NSLog("Error %d while retrieving audio property", error);
else if (route == NULL) {
NSLog(@"Silent switch is currently on");
} else if([route isEqual:@"Headset"]) {
NSLog(@"Using headphones");
} else {
NSLog(@"Using %@", route);
}
Saludos, Raffaello Colasante
Veo que está utilizando el marco de MPMediaPlayer; sin embargo, el manejo del micrófono se realiza mediante el marco de AVAudioPlayer, que deberá agregar a su proyecto.
El sitio web de Apple tiene un código del marco AVAudioPlayer que utilizo para manejar las interrupciones de un usuario que conecta o quita los auriculares con micrófono de Apple.
Echa un vistazo a la guía de programación de sesiones de audio del Dev Center de iPhone de Apple
- (void) beginInterruption {
if (playing) {
playing = NO;
interruptedWhilePlaying = YES;
[self updateUserInterface];
}
}
NSError *activationError = nil;
- (void) endInterruption {
if (interruptedWhilePlaying) {
[[AVAudioSession sharedInstance] setActive: YES error: &activationError];
[player play];
playing = YES;
interruptedWhilePlaying = NO;
[self updateUserInterface];
}
}
Mi código es un poco diferente y algo de esto puede ayudarte:
void interruptionListenerCallback (
void *inUserData,
UInt32 interruptionState
) {
// This callback, being outside the implementation block, needs a reference
// to the AudioViewController object
RecordingListViewController *controller = (RecordingListViewController *) inUserData;
if (interruptionState == kAudioSessionBeginInterruption) {
//NSLog (@"Interrupted. Stopping playback or recording.");
if (controller.audioRecorder) {
// if currently recording, stop
[controller recordOrStop: (id) controller];
} else if (controller.audioPlayer) {
// if currently playing, pause
[controller pausePlayback];
controller.interruptedOnPlayback = YES;
}
} else if ((interruptionState == kAudioSessionEndInterruption) && controller.interruptedOnPlayback) {
// if the interruption was removed, and the app had been playing, resume playback
[controller resumePlayback];
controller.interruptedOnPlayback = NO;
}
}
void recordingListViewMicrophoneListener (
void *inUserData,
AudioSessionPropertyID inPropertyID,
UInt32 inPropertyValueSize,
const void *isMicConnected
) {
// ensure that this callback was invoked for a change to microphone connection
if (inPropertyID != kAudioSessionProperty_AudioInputAvailable) {
return;
}
RecordingListViewController *controller = (RecordingListViewController *) inUserData;
// kAudioSessionProperty_AudioInputAvailable is a UInt32 (see Apple Audio Session Services Reference documentation)
// to read isMicConnected, convert the const void pointer to a UInt32 pointer
// then dereference the memory address contained in that pointer
UInt32 connected = * (UInt32 *) isMicConnected;
if (connected){
[controller setMicrophoneConnected : YES];
}
else{
[controller setMicrophoneConnected: NO];
}
// check to see if microphone disconnected while recording
// cancel the recording if it was
if(controller.isRecording && !connected){
[controller cancelDueToMicrophoneError];
}
}