Bluetooth

Android proporciona un puerto Bluetooth completo con compatibilidad para muchos perfiles comunes de Bluetooth integrados en el automóvil. También hay muchas mejoras que optimizan el rendimiento y la experiencia con otros dispositivos y de Google Cloud.

Administración de conexiones Bluetooth

En Android, CarBluetoothService mantiene los dispositivos Bluetooth y la prioridad del usuario actual. listas para cada conexión de perfil a la IVI. Los dispositivos se conectan a los perfiles de una orden de prioridad definido. Cuándo habilitar, inhabilitar y conectar dispositivos a un perfil es impulsada por una política de conexión predeterminada que se puede anular con el uso superposición de recursos, si deseado.

Configura la administración de conexiones de Automotive

Cómo inhabilitar la política de teléfono predeterminada

La pila Bluetooth de Android mantiene una política de conexión para teléfonos que se habilita mediante de forma predeterminada. Esta política debe estar inhabilitada en tu dispositivo para que no entre en conflicto con la política automotriz prevista en CarBluetoothService Si bien la superposición de productos Car debería encargarse de esto, puedes inhabilitar la política de telefonía en un superposición de recursos configurando enable_phone_policy como false MAXIMUM_CONNECTED_DEVICES en /packages/apps/Bluetooth/res/values/config.xml

Usa la política automotriz predeterminada

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

Además, la política de administración de conexiones Bluetooth se encuentra en service/src/com/android/car/BluetoothDeviceConnectionPolicy.java. De forma predeterminada, esta política define las instancias en las que se debe conectar y desconectar el Bluetooth del enlace dispositivos. Además, administra casos específicos de vehículos en los que el adaptador debe estar encendido y desactivado.

Crea tu propia política personalizada de administración de conexiones de Automotive

Si la política automotriz predeterminada no es suficiente para tus necesidades, también se puede inhabilitar a favor de tu propia política personalizada. Tu política personalizada, como mínimo, es responsable para determinar cuándo habilitar o inhabilitar el adaptador Bluetooth, conectar dispositivos. Es posible usar una variedad de eventos para habilitar/inhabilitar el Bluetooth e iniciar las conexiones del dispositivo, incluidos los eventos debido a cambios en propiedades de automóviles.

Inhabilitar la política automotriz predeterminada

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

Cómo habilitar o inhabilitar el adaptador Bluetooth

Una de las funciones principales de la política es activar y desactivar el adaptador Bluetooth en los momentos adecuados. Puedes usar BluetoothAdapter.enable() y APIs del framework de BluetoothAdapter.disable() para habilitar e inhabilitar el adaptador. Estas llamadas deben respetar el estado persistente que el usuario seleccionó a través de Configuración o ningún 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 does nothing if the adapter
    // is already off, keeping the existing saved desired state for next reboot.
    bluetoothAdapter.disable(false);
}

Determina cuándo encender y apagar el adaptador Bluetooth

Con tu política personalizada, tienes la libertad de determinar qué eventos indican los mejores momentos para habilitar e inhabilitar el adaptador. Una de las formas de hacerlo es usar los estados de energía MAXIMUM_CONNECTED_DEVICES in 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 perceives 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;
        }
    }
};

Determina cuándo conectar dispositivos

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

Por ejemplo, cuando se enciende el adaptador Bluetooth, se puede hacer lo siguiente:

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 app's context
                Car car = Car.createCar(mContext);
                CarBluetoothManager carBluetoothManager =
                        (CarBluetoothManager) car.getCarManager(Car.BLUETOOTH_SERVICE);
                carBluetoothManager.connectDevices();
            }
        }
    }
}

Verifica la administración de conexiones de Automotive

La forma más sencilla de verificar el comportamiento de tu política de conexión es habilitar el Bluetooth en tu IVI y validar que se conecte automáticamente a los dispositivos correctos en la en el orden adecuado. Puedes activar o desactivar el adaptador Bluetooth desde la IU 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, puedes usar el resultado del siguiente comando para ver información de depuración. relacionadas con las conexiones Bluetooth:

adb shell dumpsys car_service

Por último, si creaste tu propia política automotriz, verifica las conexiones personalizadas el comportamiento de los usuarios requiere controlar los eventos que elegiste para que activen conexiones de red.

Perfiles Bluetooth de Automotive

En Android, la IVI puede admitir múltiples dispositivos conectados simultáneamente por Bluetooth. Los servicios telefónicos Bluetooth para varios dispositivos permiten que los usuarios se conecten separar dispositivos simultáneamente, como un teléfono personal y uno de trabajo, y hacer llamadas con manos libres desde ambos dispositivos.

Cada perfil de Bluetooth aplica los límites de conexión, generalmente dentro del del servicio de perfil en sí. De forma predeterminada, CarBluetoothService no emite más juicios sobre la cantidad máxima de conexiones se permiten los dispositivos.

Perfil de manos libres

El perfil de manos libres (HFP) de Bluetooth permite que el vehículo cree y reciba un teléfono llamadas a través de un dispositivo remoto conectado. Cada conexión de dispositivo registra un teléfono independiente cuenta con TelecomManager, que anuncia todas las cuentas telefónicas disponibles para las apps de IVI

El IVI se puede conectar a varios dispositivos a través de HFP. MAX_STATE_MACHINES_POSSIBLE MAXIMUM_CONNECTED_DEVICES en HeadsetClientService define la cantidad máxima de HFP simultánea. conexiones de red.

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

Ten en cuenta que la app de Teléfono predeterminada no admite varias apps a la vez dispositivos con HFP conectados. Para implementar la HFP multidispositivo, se requiere personalización. para permitir que los usuarios seleccionen qué cuenta del dispositivo usar cuando realizan una llamada. Luego, la app llama a telecomManager.placeCall con la cuenta correcta. Debes verificar que otras funciones multidispositivo también se ejecuten según lo previsto.

Verifica la HFP multidispositivo

Para comprobar que la conectividad multidispositivo funcione correctamente con Bluetooth, haz lo siguiente:

  1. Mediante Bluetooth, conecta un dispositivo a la IVI y transmite audio desde el dispositivo.
  2. Conecta dos teléfonos al IVI a través de Bluetooth.
  3. Elige un teléfono. Realizar una llamada saliente directamente desde el teléfono y realizar una llamada saliente usando la IVI.
    1. En ambas ocasiones, verifica las pausas de audio que se transmiten y el audio del teléfono se reproduce en las bocinas IVI conectadas.
  4. Usar el mismo teléfono, recibir una llamada entrante directamente en el teléfono recibir una llamada entrante con el IVI.
    1. En ambos casos, verifica las pausas de la transmisión de audio y el El audio del teléfono se reproduce en las bocinas IVI conectadas.
  5. Repite los pasos 3 y 4 con el otro teléfono conectado.

Llamadas de emergencia

La capacidad de hacer llamadas de emergencia es un aspecto importante de la telefonía y Funciones Bluetooth en el vehículo Una llamada de emergencia puede iniciar a partir de la IVI, que incluye:

  • Solución de llamada electrónica independiente
  • Solución eCall integrada en el IVI
  • Uso de un teléfono Bluetooth conectado cuando no hay un sistema integrado disponible

Cómo conectar una llamada de emergencia

Si bien el equipo de eCall es fundamental para la seguridad, actualmente no está integrado en Android. Es posible utilizar ConnectionService para exponer funciones de llamadas de emergencia a través de Android, que también tiene el beneficio de incorporar opciones de accesibilidad para las llamadas de emergencia. Para obtener más información, consulta Cómo compilar una app de llamadas

Este es un ejemplo de cómo establecer una emergencia ConnectionService

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.registerPhoneAccount(account);
        mTelecomManager.enablePhoneAccount(account.getAccountHandle(), true);
    }
}

Habilita Bluetooth para llamadas de emergencia

Las llamadas de emergencia antes de Android 10 implicaban llamar directamente desde un teléfono e invocar equipo especial si está disponible (por ejemplo, se activará automáticamente al detectar un peligro o una acción del usuario). En Android 10 y versiones posteriores, el Teléfono del vehículo puede llamar directamente a un número de emergencia, proporcionó este MAXIMUM_CONNECTED_DEVICES 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 apps, como el reconocimiento de voz, 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 los contactos y los historiales de llamadas. desde un dispositivo remoto conectado. PBAP mantiene una lista agregada de búsqueda de que actualiza la máquina de estado del cliente de PBAP. Cada dispositivo conectado con otra máquina de estado de cliente PBAP, por lo que los contactos asociados con el dispositivo correspondiente cuando se hace una llamada.

PBAP es unidireccional y, por lo tanto, requiere que el IVI cree instancias de conexiones con cualquier MAXIMUM_CONNECTED_DEVICES in PbapClientService define la cantidad máxima de dispositivos PBAP simultáneos. conexiones permitidas con la IVI. El cliente PBAP almacena los contactos para cada dispositivo conectado en la Proveedor de contactos al que una app puede acceder para derivar el teléfono libro para cada dispositivo.

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

Perfil de acceso a mensajes

El perfil de acceso a mensajes Bluetooth (MAP) permite que el vehículo envíe y reciba SMS. a través de un dispositivo remoto conectado. Actualmente, los mensajes no se almacenan localmente en la 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 una Intent de transmisión, que luego puede recibir la app.

Para conectarse a un dispositivo móvil para enviar y recibir mensajes, la IVI debe iniciar la conexión MAP. MAXIMUM_CONNECTED_DEVICES en MapClientService define la cantidad máxima de dispositivos MAP simultáneos. conexiones permitidas con la IVI. Cada conexión debe estar autorizada por la IVI y el dispositivo móvil antes de que los mensajes se puedan transferir.

Perfil de distribución de audio avanzada

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

A diferencia de otros perfiles, la cantidad máxima de dispositivos A2DP conectados se aplica en la en una pila nativa y no en Java. Actualmente, el valor está codificado en 1 con la variable kDefaultMaxConnectedAudioDevices en packages/modules/Bluetooth/system/btif/src/btif_av.cc

Perfil de control remoto de audio/video

El perfil de control remoto de audio/video Bluetooth (AVRCP) permite que el vehículo controle y examinar reproductores multimedia en un dispositivo remoto conectado. Dado que la IVI desempeña el papel de Un controlador AVRCP; cualquier control activado que afecte la reproducción de audio depende de un dispositivo A2DP. con el dispositivo de destino.

Para que el IVI pueda explorar un reproductor multimedia específico en un teléfono Android a través de AVRCP, la app de música del teléfono debe proporcionar una MediaBrowserService y permite el acceso de com.android.bluetooth a ese servicio. La compilación de un servicio de navegador multimedia explica en detalle cómo hacerlo.