Penso che si frainteso l'uso di questa proprietà. Speri di abilitare/disabilitare il tuo altoparlante. Questo non è esattamente l'intento di kAudioSessionProperty_OverrideAudioRoute
. Piuttosto, influisce sul suono in uscita instradamento, in modo abbastanza limitato.
Questi sono i vari percorsi possibili uscita avaiable al iPhone
extern const CFStringRef kAudioSessionOutputRoute_LineOut
extern const CFStringRef kAudioSessionOutputRoute_Headphones
extern const CFStringRef kAudioSessionOutputRoute_BluetoothHFP
extern const CFStringRef kAudioSessionOutputRoute_BluetoothA2DP
extern const CFStringRef kAudioSessionOutputRoute_BuiltInReceiver
extern const CFStringRef kAudioSessionOutputRoute_BuiltInSpeaker
extern const CFStringRef kAudioSessionOutputRoute_USBAudio
extern const CFStringRef kAudioSessionOutputRoute_HDMI
extern const CFStringRef kAudioSessionOutputRoute_AirPlay
Questi sono solo possibili rotte - quello realmente disponibile è dipendente dal contesto. Apple limita fortemente la tua capacità di determinare questi percorsi in-app poiché è qualcosa che l'utente deve controllare in modo coerente con il dispositivo. La maggior parte di questi sono determinati implicitamente dall'utente che collega/scollega l'hardware (cuffie, USB, HDMI, uscita di linea), e Apple non vuole che la tua app infastidisca le aspettative degli utenti qui.
L'airplay può essere selezionato utilizzandorouteButton
se il contesto multimediale è corretto (e l'airplay è disponibile). Bluetooth può essere guidato da OverrideCategoryEnableBluetoothInput
(which controls both input and output)
In particolare, si noti che kAudioSessionOutputRoute_BuiltInReceiver
è l'altoparlante di basso livello sull'iPhone che si tiene all'orecchio quando si effettua una chiamata. Questa è la rotta di uscita audio predefinita per l'iPhone se un dispositivo esterno (ad es. Cuffie) non è collegato. kAudioSessionOutputRoute_BuiltInSpeaker
è l'altoparlante "vivavoce" più forte nella parte inferiore del telefono.
è possibile reindirizzare da qualunque sia il predefinito corrente è a questo BuiltInSpeaker
impostando una di queste proprietà di override:
key: kAudioSessionProperty_OverrideAudioRoute
values: kAudioSessionOverrideAudioRoute_Speaker
: kAudioSessionOverrideAudioRoute_None
Specifica se eseguire l'override percorso audio normale della categoria sessione audio.
key: kAudioSessionProperty_OverrideCategoryDefaultToSpeaker
values: TRUE
: FALSE
Specifica se per indirizzare l'audio al diffusore (anziché al ricevitore) quando nessun altro percorso audio, come ad esempio un auricolare, è collegato.
Entrambi sono progettati solo per essere utilizzati con la categoria Audio Session kAudioSessionCategory_PlayAndRecord
.
Si noti che in entrambi i casi non si sta scegliendo tra una rotta di uscita, si sta solo sovrascrivendo il "percorso predefinito" a favore dell'altoparlante incorporato (rumoroso).
L'iPad, privo di telefono, non ha un tipo di altoparlante BuiltInReceiver
. È la route predefinita, in assenza di gadget o airplay collegati, è esattamente la stessa BuiltInSpeaker
. Pertanto, l'override non ha alcun effetto.
Supponendo che si stia veramente provando a disattivare l'audio nell'app, il modo in cui lo si ottiene dipende da molti altri aspetti della progettazione dell'app. Se si desidera disattivare l'audio del dispositivo , Apple preferisce che l'utente lo controlli tramite l'interruttore circolare/silenzioso. Sembra che non lo avrebbero in nessun altro modo:
Ho ricevuto una risposta da Apple su questo. Hanno detto che non hanno e non hanno mai fornito un metodo per rilevare l'interruttore di silenziamento dell'hardware e non hanno intenzione di farlo.https://stackoverflow.com/a/8009073/1375695
"L'impostazione degli altoparlanti è un overide per il dispositivo, non per un determinato suono"
http://lists.apple.com/archives/coreaudio-api/2009/Mar/msg00300.html
'AudioSessionSetProperty' ha un valore di ritorno, hai controllare? – Sulthan
Sì, restituisce 'OSStatus = 0' solo –
Qual è il valore restituito dalla chiamata setCategory? E, se è NO, l'errore relativo – LombaX