Google se compromete a impulsar la igualdad racial para las comunidades afrodescendientes. Obtén información al respecto.
Se usó la API de Cloud Translation para traducir esta página.
Switch to English

Bluetooth

Android proporciona una implementación de Bluetooth completa con soporte para muchos perfiles de Bluetooth comunes en el automóvil. También hay muchas mejoras que mejoran el rendimiento y la experiencia con otros dispositivos y servicios.

Gestión de la conexión Bluetooth

Dentro de Android, CarBluetoothService mantiene los dispositivos Bluetooth del usuario actual y las listas de prioridades para cada conexión de perfil al IVI. Los dispositivos están conectados a perfiles en un orden de prioridad definido. El momento de habilitar, deshabilitar y conectar dispositivos a un perfil depende de una política de conexión predeterminada que puede anularse con el uso de una superposición de recursos , si se desea.

Configurar la gestión de conexiones automotrices

Deshabilitar la política telefónica predeterminada

La pila Bluetooth de Android mantiene una política de conexión para teléfonos que está habilitada de forma predeterminada. Esta política debe estar desactivada en su dispositivo para que no entre en conflicto con la política automotriz prevista en CarBluetoothService . Si bien la superposición del producto Car debe encargarse de esto por usted, puede deshabilitar la política del teléfono en una superposición de recursos configurando enable_phone_policy en false en /packages/apps/Bluetooth/res/values/config.xml .

Utilice la política automotriz predeterminada

CarBluetoothService mantiene los permisos de perfil predeterminados. La lista de dispositivos conocidos y sus prioridades de reconexión de perfil se encuentra en service/src/com/android/car/BluetoothProfileDeviceManager.java .

Además, la política de administración de la conexión Bluetooth se puede encontrar en service/src/com/android/car/BluetoothDeviceConnectionPolicy.java . De forma predeterminada, esta política define instancias en las que Bluetooth debe conectarse y desconectarse de los dispositivos vinculados. También administra casos específicos de automóviles para cuando el adaptador debe encenderse y apagarse.

Creación de su propia política de gestión de conexiones automotrices personalizada

Si la política automotriz predeterminada no es suficiente para sus necesidades, también puede deshabilitarse en favor de su propia política personalizada. Su política personalizada será, como mínimo, responsable de determinar cuándo habilitar y deshabilitar el adaptador Bluetooth, así como cuándo conectar dispositivos. Es posible utilizar una variedad de eventos para habilitar / deshabilitar el adaptador Bluetooth e iniciar las conexiones del dispositivo, incluidos los eventos debidos a cambios en las propiedades específicas del automóvil.

Deshabilitar la política automotriz predeterminada

Primero, para usar una política personalizada, la política automotriz predeterminada debe deshabilitarse estableciendo useDefaultBluetoothConnectionPolicy en false en una superposición de recursos . Este recurso se define originalmente como parte de packages/services/Car/service/res/values/config.xml .

Habilitar y deshabilitar el adaptador Bluetooth

Una de las funciones principales de su póliza es encender y apagar el adaptador Bluetooth en los momentos apropiados. Puede utilizar las API de marco BluetoothAdapter.enable() y BluetoothAdapter.disable() para habilitar y deshabilitar el adaptador. Estas llamadas deben respetar el estado persistente que el usuario ha seleccionado a través de Configuración o cualquier otro medio. Una forma de hacerlo es la siguiente:

/**
 * Turn on the Bluetooth Adapter.
 */
private void enableBluetooth() {
    BluetoothAdapter bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
    if (bluetoothAdapter == null) {
        return;
    }
    bluetoothAdapter.enable();
}

/**
 * Turn off the Bluetooth Adapter
 */
private void disableBluetooth() {
    BluetoothAdapter bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
    if (bluetoothAdapter == null) {
        return;
    }
    // Will shut down _without_ persisting the off state as the desired state
    // of the Bluetooth adapter for next start up. This will do nothing if the adapter
    // is already off, keeping the existing saved desired state for next reboot.
    bluetoothAdapter.disable(false);
}

Determine cuándo encender y apagar el adaptador Bluetooth

Con su política personalizada, puede determinar qué eventos indican los mejores momentos para habilitar y deshabilitar el adaptador. Una forma de hacer esto es utilizando los estados de energía mantenidos por CarPowerManager :

private final CarPowerStateListenerWithCompletion mCarPowerStateListener =
        new CarPowerStateListenerWithCompletion() {
    @Override
    public void onStateChanged(int state, CompletableFuture<Void> future) {
        if (state == CarPowerManager.CarPowerStateListener.ON) {
            if (isBluetoothPersistedOn()) {
                enableBluetooth();
            }
            return;
        }

        // "Shutdown Prepare" is when the user will perceive the car as off
        // This is a good time to turn off Bluetooth
        if (state == CarPowerManager.CarPowerStateListener.SHUTDOWN_PREPARE) {
            disableBluetooth();

            // Let CarPowerManagerService know we're ready to shut down
            if (future != null) {
                future.complete(null);
            }
            return;
        }
    }
};

Determinar cuándo conectar dispositivos

De manera similar, una vez que haya determinado los eventos que deben activar las conexiones de dispositivos para comenzar, CarBluetoothManager proporciona la llamada a la API connectDevices() que procederá a conectar los dispositivos según las listas de prioridad definidas para cada perfil de Bluetooth.

Un ejemplo de cuándo podría querer hacer esto es cada vez que se enciende el adaptador Bluetooth:

private class BluetoothBroadcastReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
        if (BluetoothAdapter.ACTION_STATE_CHANGED.equals(action)) {
            int state = intent.getIntExtra(BluetoothAdapter.EXTRA_STATE, -1);
            if (state == BluetoothAdapter.STATE_ON) {
                // mContext should be your application’s context
                Car car = Car.createCar(mContext);
                CarBluetoothManager carBluetoothManager =
                        (CarBluetoothManager) car.getCarManager(Car.BLUETOOTH_SERVICE);
                carBluetoothManager.connectDevices();
            }
        }
    }
}

Verificación de la gestión de conexiones automotrices

La forma más sencilla de verificar el comportamiento de su política de conexión es habilitar Bluetooth en su IVI y validar que se conecte automáticamente a los dispositivos correctos en el orden apropiado. Puede alternar el adaptador Bluetooth a través de la interfaz de usuario de configuración, o con los siguientes comandos adb:

adb shell su u$(adb shell am get-current-user)_system svc bluetooth disable
adb shell su u$(adb shell am get-current-user)_system svc bluetooth enable

Además, la salida del siguiente comando se puede utilizar para ver información de depuración relacionada con las conexiones Bluetooth:

adb shell dumpsys car_service

Por último, si ha creado su propia política automotriz, verificar cualquier comportamiento de conexión personalizado requerirá controlar los eventos que ha elegido para activar las conexiones del dispositivo.

Perfiles de Bluetooth para automóviles

En Android, el IVI puede admitir varios dispositivos conectados simultáneamente a través de Bluetooth. Los servicios telefónicos Bluetooth para múltiples dispositivos permiten a los usuarios conectar dispositivos separados al mismo tiempo, como un teléfono personal y un teléfono del trabajo, y realizar llamadas con manos libres desde cualquier dispositivo.

Los límites de conexión son impuestos por cada perfil de Bluetooth individual, generalmente dentro de la implementación del propio servicio de perfiles. De forma predeterminada, CarBluetoothService no realiza más juicios sobre la cantidad máxima de dispositivos conectados permitidos.

Perfil manos libres

El perfil de manos libres de Bluetooth (HFP) permite que el vehículo realice y reciba llamadas telefónicas a través de un dispositivo remoto conectado. Cada conexión de dispositivo registra una cuenta de teléfono separada con TelecomManager , que anuncia cualquier cuenta de teléfono disponible a las aplicaciones de IVI.

El IVI puede conectarse a varios dispositivos a través de HFP. MAX_STATE_MACHINES_POSSIBLE en HeadsetClientService define el número máximo de conexiones HFP simultáneas.

Cuando un usuario realiza o recibe una llamada telefónica desde un dispositivo, la cuenta de teléfono correspondiente crea un objeto HfpClientConnection . La aplicación Dialer interactúa con el objeto HfpClientConnection para administrar las funciones de la llamada, como aceptar una llamada o colgar.

Cabe señalar que la aplicación Dialer predeterminada no admite varios dispositivos HFP conectados simultáneamente. Para implementar HFP multidispositivo, se requiere personalización para permitir a los usuarios seleccionar qué cuenta de dispositivo usar al realizar una llamada. La aplicación llamará a telecomManager.placeCall con la cuenta correcta. Deberá verificar que otras funciones multidispositivo también funcionen según lo previsto.

Verificar HFP multidispositivo

Para comprobar que la conectividad multidispositivo funciona correctamente a través de Bluetooth:

  1. Usando Bluetooth, conecte un dispositivo al IVI y transmita audio desde el dispositivo.
  2. Conecte dos teléfonos al IVI a través de Bluetooth.
  3. Elija un teléfono. Realice una llamada saliente directamente desde el teléfono y realice una llamada saliente utilizando el IVI.
    1. En ambas ocasiones, verifique que el audio transmitido se pausa y el audio del teléfono se reproduce a través de los altavoces conectados a IVI.
  4. Usando el mismo teléfono, reciba una llamada entrante directamente en el teléfono y reciba una llamada entrante usando el IVI.
    1. En ambas ocasiones, verifique que la transmisión de audio se pausa y el audio del teléfono se reproduce a través de los altavoces conectados a IVI.
  5. Repita los pasos 3 y 4 con el otro teléfono conectado.

Llamadas de emergencia

La capacidad de realizar llamadas de emergencia es un aspecto importante de las funciones de telefonía y Bluetooth del automóvil. Hay varias formas en que se puede iniciar una llamada de emergencia desde el IVI, que incluyen:

  • Solución eCall independiente
  • Solución eCall integrada en IVI
  • Depender de un teléfono Bluetooth conectado cuando no hay ningún sistema integrado disponible

Conectar una llamada de emergencia

Si bien el equipo eCall es crítico para la seguridad, actualmente no está integrado en Android. Es posible utilizar ConnectionService para exponer las funciones de llamadas de emergencia a través de Android, que también tiene la ventaja de introducir opciones de accesibilidad para llamadas de emergencia. Para obtener más información, consulte Creación de una aplicación de llamadas .

A continuación, se muestra un ejemplo de cómo establecer un servicio de conexión de emergencia:

public class YourEmergencyConnectionService extends ConnectionService {

    @Override
    public Connection onCreateOutgoingConnection(
            PhoneAccountHandle connectionManagerAccount,
            ConnectionRequest request) {
        // Your equipment specific procedure to make ecall
        // ...
    }

    private void onYourEcallEquipmentReady() {

        PhoneAccountHandle handle =
            new PhoneAccountHandle(new ComponentName(context, YourEmergencyConnectionService),
                    YourEmergencyConnectionId);
        PhoneAccount account =
            new PhoneAccount.Builder(handle, eCallOnlyAccount)
            .setSupportedUriSchemes(Arrays.asList(PhoneAccount.SCHEME_TEL))
            .setCapabilities(PhoneAccount.CAPABILITY_PLACE_EMERGENCY_CALLS
                    | PhoneAccount.CAPABILITY_MULTI_USER)
            .build():
        mTelecomManager.registerPhoneAcccount(account);
        mTelecomManager.enablePhoneAccount(account.getAccountHandle(), true);
    }
}

Habilitación de Bluetooth para llamadas de emergencia

Llamar a Emergencia antes de Android 10 implicaba marcar directamente desde un teléfono e invocar un equipo especial si estaba disponible (por ejemplo, activación automática al detectar un peligro o una acción del usuario). Desde Android 10, el marcador en el automóvil puede llamar directamente a un número de emergencia, siempre que este código esté contenido en apps/Bluetooth/res/values/config.xml :

<!-- For supporting emergency call through the hfp client connection service --> <bool name=”hfp_client_connection_service_support_emergency_call”>true</bool>

Al implementar las llamadas de emergencia de esta manera, otras aplicaciones, como el reconocimiento de voz, también pueden llamar a un número de emergencia.

Perfil de acceso a la agenda telefónica

El perfil de acceso a la agenda telefónica de Bluetooth (PBAP) descarga contactos e historiales de llamadas desde un dispositivo remoto conectado. PBAP mantiene una lista de contactos agregada y de búsqueda que es actualizada por la máquina de estado del cliente PBAP. Cada dispositivo conectado interactúa con una máquina de estado del cliente PBAP separada, lo que da como resultado que los contactos se asocien con el dispositivo adecuado al realizar una llamada.

PBAP es unidireccional y, por lo tanto, requiere que IVI cree una instancia de las conexiones a cualquier dispositivo móvil deseado. MAXIMUM_DEVICES en PbapClientService define el número máximo de conexiones simultáneas de dispositivos PBAP permitidas con el IVI. El cliente PBAP almacena los contactos de cada dispositivo conectado en el proveedor de contactos, al que puede acceder una aplicación para obtener la guía telefónica de cada dispositivo.

Además, la conexión del perfil debe estar autorizada tanto por el IVI como por el dispositivo móvil para que se realice una conexión. Cuando un cliente PBAP se desconecta, la base de datos interna elimina todos los contactos y el historial de llamadas asociado con el dispositivo previamente conectado.

Perfil de acceso a mensajes

El perfil de acceso a mensajes de Bluetooth (MAP) permite que el vehículo envíe y reciba mensajes SMS a través de un dispositivo remoto conectado. Actualmente, los mensajes no se almacenan localmente en el IVI. En cambio, cada vez que el dispositivo remoto conectado recibe un mensaje, el IVI recibe y analiza el mensaje y transmite su contenido en un Intent , que luego puede ser recibido por una aplicación.

Para conectarse a un dispositivo móvil con el fin de enviar y recibir mensajes, el IVI debe iniciar la conexión MAP. MAXIMUM_CONNECTED_DEVICES en MapClientService define el número máximo de conexiones simultáneas de dispositivos MAP permitidas con el IVI. Cada conexión debe ser autorizada por el IVI y el dispositivo móvil antes de que se puedan transferir los mensajes.

Perfil de distribución de audio avanzado

El perfil de distribución de audio avanzado de Bluetooth (A2DP) permite que el vehículo reciba transmisiones de audio desde un dispositivo remoto conectado.

A diferencia de otros perfiles, el número máximo de dispositivos A2DP conectados se aplica en la pila nativa y no en Java. El valor está actualmente codificado a 1 usando el kDefaultMaxConnectedAudioDevices variable en /system/bt/vtif/src/btif_av.cc .

Perfil de control remoto de audio / video

El perfil de control remoto de audio / video de Bluetooth (AVRCP) permite que el vehículo controle y explore los reproductores multimedia en un dispositivo remoto conectado. Dado que el IVI desempeña el papel de un controlador AVRCP, los controles activados que afectan la reproducción de audio dependen de una conexión A2DP al dispositivo de destino.

Para que un reproductor multimedia específico en un teléfono Android pueda ser navegado por IVI a través de AVRCP, la aplicación multimedia en el teléfono debe proporcionar un MediaBrowserService y permitir el acceso com.android.bluetooth a ese servicio. La creación de un servicio de navegador de medios explica cómo hacer esto en detalle.