objective-c - por - mis audifonos bluetooth no se conectan con mi celular
iOS cómo descubrir los auriculares bluetooth y sus eventos (2)
Estoy tratando de descubrir "Auriculares Bluetooth" y obtener sus eventos. Leí la documentación "CoreBluetooth" e implementé el código de muestra de la siguiente manera. No didDiscoverPeripheral
método de delegado '' didDiscoverPeripheral
''.
¿Hay alguna solución para esto?
Código:
CBCentralManager *myCentralManager;
[myCentralManager scanForPeripheralsWithServices:nil options:nil];
-(void)centralManagerDidUpdateState:(CBCentralManager *)central{
//following line prints CBCentralManagerStatePoweredOn
NSLog(@"state:%@", [self getCentralManagerState:central.state]);
}
//following method does not fire
-(void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI
{
}
CoreBluetooth.framework es para Bluetooth Low-Energy.
Bluetooth Low-Energy no está diseñado para pasar el sonido (auriculares de salida, parlantes, etc.)
Entonces mi pregunta es: ¿está seguro de que su auricular usa Bluetooth de baja energía?
No lo creo.
Por lo tanto, es por eso que el método de delegado centralManager:didDiscoverPeripheral:
no se desencadena.
Si desea obtener algunos eventos de los auriculares, como "usuario presiona la siguiente canción", puede usar los eventos de control remoto . Como sospecho que es posible que desee escuchar "otros eventos", supongo que su auricular está bajo MFI. Entonces puede tener su propio protocolo. Por ejemplo, trabajé en la aplicación iOS para un HeadSet Bluetooth que tenía otras funcionalidades, como llamar a un número favorito, etc. Pero, entonces, necesitarás usar ExternalAccessory.framework , y quizás tengas que aplicar ingeniería inversa al protocolo.
Como se menciona, CoreBluetooth es solo para dispositivos LE,
así que esto es lo que hice para obtener los eventos para dispositivos BluetoothHFP :
1. necesitas abrir AVAudioSeesion:
enlace AVFoundation.framework
a su proyecto
2. para las entradas disponibles actuales:
NSArray *availInputs = [[AVAudioSession sharedInstance] availableInputs];
3. para notificación sobre cambio de ruta:
a. configurar nueva AVAudioSession
segundo. registrar observador en AVAudioSessionRouteChangeNotification
- (BOOL)prepareAudioSession {
// deactivate session
BOOL success = [[AVAudioSession sharedInstance] setActive:NO error: nil];
if (!success) {
NSLog(@"deactivationError");
}
// set audio session category AVAudioSessionCategoryPlayAndRecord options AVAudioSessionCategoryOptionAllowBluetooth
success = [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayAndRecord withOptions:AVAudioSessionCategoryOptionAllowBluetooth error:nil];
if (!success) {
NSLog(@"setCategoryError");
}
// activate audio session
success = [[AVAudioSession sharedInstance] setActive:YES error: nil];
if (!success) {
NSLog(@"activationError");
}
return success;
}
y llámalo cuando quieras comenzar a escuchar cambios:
[self prepareAudioSession];
NSNotificationCenter *defaultCenter = [NSNotificationCenter defaultCenter];
[defaultCenter addObserver:self
selector:@selector(bluetoothAvailabilityDidChange:)
name:@"BluetoothConnectabilityChangedNotification"
object:nil];
- si desea obtener las devoluciones de llamada mientras está en segundo plano, debe agregar Audio y AirPlay en las capacidades del objetivo:
!! Esta respuesta fue útil para mí cuando obtuve la solución