Come rilevare a livello di codice l'auricolare nell'iPhone?
-
11-09-2019 - |
Domanda
Attualmente sto lavorando a un progetto che prevede la riproduzione di musica dalla libreria musicale dell'iPhone all'interno dell'app interna.Utilizzo MPMediaPickerController per consentire all'utente di selezionare la propria musica e riprodurla utilizzando il lettore musicale iPod all'interno dell'iPhone.
Tuttavia, ho riscontrato problemi quando l'utente inserisce l'auricolare e lo rimuove.La musica smetterà improvvisamente di essere riprodotta senza motivo.Dopo alcuni test, ho scoperto che il lettore iPod mette in pausa la riproduzione quando l'utente scollega l'auricolare dal dispositivo.Quindi esiste un modo per rilevare in modo programmatico se l'auricolare è stato scollegato in modo da poter riprendere a riprodurre la musica?Oppure esiste un modo per impedire che il lettore iPod venga messo in pausa quando l'utente scollega l'auricolare?
Soluzione
È necessario registrarsi per la notifica di modifica di AudioRoute e implementare il modo in cui si desidera gestire le modifiche al percorso
// Registers the audio route change listener callback function
AudioSessionAddPropertyListener (kAudioSessionProperty_AudioRouteChange,
audioRouteChangeListenerCallback,
self);
e all'interno della richiamata è possibile ottenere il motivo del cambio di percorso
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..
}
Altri suggerimenti
Se si desidera solo per controllare se le cuffie sono inserite in un dato momento, senza ascoltare cambiamenti di rotta, si può semplicemente effettuare le seguenti operazioni:
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);
}
Saluti, Raffaello Colasante
Vedo che si sta utilizzando il quadro MPMediaPlayer tuttavia la gestione del microfono viene fatto usando il framework AVAudioPlayer, che è necessario aggiungere al progetto.
sito web di Apple ha il codice dal quadro AVAudioPlayer che io uso per gestire le interruzioni da un utente di inserire o rimuovere le cuffie del microfono di Apple.
Scopri di Apple iPhone Dev Center Audio Session guida di programmazione .
- (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];
}
}
Il mio codice è un po 'diverso e un po' di questo può aiutare:
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];
}
}
Ciao ragazzi basta controllare AddMusic campione app. Risolverà tutti i vostri problemi legati iPod
Per prima registrarsi lettore iPod per la notifica con il seguente codice
NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter];
[notificationCenter
addObserver: self
selector: @selector (handle_PlaybackStateChanged:)
name: MPMusicPlayerControllerPlaybackStateDidChangeNotification
object: musicPlayer];
[musicPlayer beginGeneratingPlaybackNotifications];
E implementare il seguente codice nella notifica
- (void) handle_PlaybackStateChanged: (id) notification
{
MPMusicPlaybackState playbackState = [musicPlayer playbackState];
if (playbackState == MPMusicPlaybackStatePaused)
{
[self playiPodMusic];
}
else if (playbackState == MPMusicPlaybackStatePlaying)
{
}
else if (playbackState == MPMusicPlaybackStateStopped)
{
[musicPlayer stop];
}
}