Mon iOS6 et le code de travail pour définir Bluetooth comme une sortie:
// create and set up the audio session AVAudioSession* audioSession = [AVAudioSession sharedInstance]; [audioSession setCategory: AVAudioSessionCategoryPlayAndRecord error: nil]; [audioSession setActive: YES error: nil]; // set up for bluetooth microphone input UInt32 allowBluetoothInput = 1; OSStatus stat = 0; stat = AudioSessionSetProperty ( kAudioSessionProperty_OverrideCategoryEnableBluetoothInput, sizeof (allowBluetoothInput), &allowBluetoothInput );
La méthode AudioSessionSetProperty est obsolète depuis iOS7. Suite à ce sujet Comment puis-je router l'audio vers un haut-parleur sans utiliser AudioSessionSetProperty? vous pouvez changer la sortie en AVAudioSessionPortOverrideSpeaker OU AVAudioSessionPortOverrideNone mais pas d'options Bluetooth ici.
Mon objective réel est de prendre en charge les appareils Bluetooth qui n'utilisent pas A2DP mais HFP.
Alors, comment puis-je y parvenir sans utiliser de methods obsolètes?
Pour développer ma réponse précédente et commenter :
Vous utiliseriez la méthode AVAudioSession
- (BOOL)setCategory:(NSSsortingng *)category withOptions:(AVAudioSessionCategoryOptions)options error:(NSError **)outError
avec category
comme
AVAudioSessionCategoryPlayAndRecord
ou AVAudioSessionCategoryRecord
et les options
AVAudioSessionCategoryOptionAllowBluetooth
Dans votre réponse, vous dites
ce n'est pas la même parce que cela permettrait A2DP bluetooth seulement
Mais selon les docs d'Apple
AVAudioSessionCategoryOptionAllowBluetooth
Permet aux périphériques mains libres Bluetooth d'apparaître en tant que routes d'input disponibles.
Je comprends que pour signifier bluetooth HFP, ce que je présume est ce que vous cherchez. En ce qui concerne le «forcing», Apple ne tient pas trop aux applications qui forcent / supplantent le contrôle du operating system de l'expérience du comportement d'un user.
Il se peut que cela ne marche pas dans la pratique – je n'ai pas pu le tester. Vraisemblablement vous avez, et il échoue (vous n'indiquez pas dans votre question). Mais vous atteignez les limites de la documentation d'Apple sur ce problème. Si vous ne pouvez vraiment pas le faire fonctionner, je serais enclin à aller avec l'interface C obsolète, et être prêt à faire des changements pour iOS8.
En me référant à cette réponse , j'ai trouvé ce qui suit:
[audioSession setCategory:AVAudioSessionCategoryPlayAndRecord withOptions:AVAudioSessionCategoryOptionAllowBluetooth error:&error]; NSArray* routes = [audioSession availableInputs]; for (AVAudioSessionPortDescription* route in routes) { if (route.portType == AVAudioSessionPortBluetoothHFP) { [audioSession setPreferredInput:route error:nil]; } }
Il semble fonctionner de la même manière que l'ancienne propriété override et redirige à la fois l'input et la sortie du périphérique mains libres.