Bluetooth

Android cung cấp Bluetooth đầy đủ với khả năng hỗ trợ nhiều cấu hình Bluetooth phổ biến trong ô tô. Ngoài ra còn có nhiều tính năng nâng cao giúp cải thiện hiệu suất và trải nghiệm với các thiết bị khác cũng như luôn miễn phí.

Quản lý kết nối Bluetooth

Trong Android, CarBluetoothService duy trì mức độ ưu tiên cũng như các thiết bị Bluetooth của người dùng hiện tại cho mỗi kết nối hồ sơ với IVI. Thiết bị được kết nối với hồ sơ trong một thứ tự ưu tiên đã xác định. Thời điểm bật, tắt và kết nối thiết bị với hồ sơ do chính sách kết nối mặc định, chính sách này có thể ghi đè bằng cách sử dụng lớp phủ tài nguyên, nếu mong muốn.

Định cấu hình tính năng quản lý kết nối ô tô

Tắt chính sách điện thoại mặc định

Ngăn xếp Bluetooth trên Android duy trì chính sách kết nối cho điện thoại được bật bằng mặc định. Bạn phải tắt chính sách này trên thiết bị của mình để không xung đột với chính sách ô tô dự kiến trong CarBluetoothService. Mặc dù lớp phủ sản phẩm Ô tô sẽ giải quyết vấn đề này cho bạn, bạn có thể tắt chính sách điện thoại trong lớp phủ tài nguyên bằng cách đặt enable_phone_policy thành false trong MAXIMUM_CONNECTED_DEVICES trong /packages/apps/Bluetooth/res/values/config.xml.

Sử dụng chính sách mặc định cho ô tô

CarBluetoothService duy trì các quyền đối với hồ sơ mặc định. Danh sách các sự kiện đã biết thiết bị và mức độ ưu tiên kết nối lại hồ sơ của những thiết bị đó service/src/com/android/car/BluetoothProfileDeviceManager.java.

Ngoài ra, bạn có thể xem chính sách quản lý kết nối Bluetooth trong service/src/com/android/car/BluetoothDeviceConnectionPolicy.java. Theo mặc định, chính sách này xác định các trường hợp Bluetooth cần kết nối và ngắt kết nối khỏi liên kết thiết bị. Tính năng này cũng quản lý các trường hợp riêng của ô tô về thời điểm cần bật bộ chuyển đổi và tắt.

Tạo chính sách quản lý việc kết nối ô tô tuỳ chỉnh của riêng bạn

Nếu chính sách mặc định cho ô tô không đáp ứng được nhu cầu của bạn, thì chính sách này cũng có thể bị tắt ủng hộ chính sách tuỳ chỉnh của riêng bạn. Chính sách tuỳ chỉnh của bạn (tối thiểu) chịu trách nhiệm để xác định thời điểm bật và tắt bộ điều hợp Bluetooth, cũng như thời điểm kết nối nhiều thiết bị. Bạn có thể sử dụng nhiều sự kiện để bật/tắt Bluetooth bộ chuyển đổi và để bắt đầu kết nối thiết bị, bao gồm cả các sự kiện do những thay đổi về thuộc tính ô tô.

Tắt chính sách mặc định cho ô tô

Trước tiên, để sử dụng chính sách tuỳ chỉnh, bạn phải tắt chính sách mặc định cho ô tô bằng đặt useDefaultBluetoothConnectionPolicy thành false trong một lớp phủ tài nguyên. Tài nguyên này ban đầu được xác định là một phần của MAXIMUM_CONNECTED_DEVICES trong packages/services/Car/service/res/values/config.xml.

Bật và tắt bộ điều hợp Bluetooth

Một trong những chức năng cốt lõi trong chính sách của bạn là bật và tắt bộ điều hợp Bluetooth tại vào những thời điểm thích hợp. Bạn có thể sử dụng BluetoothAdapter.enable()BluetoothAdapter.disable() API khung để bật và tắt bộ chuyển đổi. Các lệnh gọi này phải tuân theo trạng thái duy trì mà người dùng đã chọn thông qua phần Cài đặt hoặc bất kỳ cách nào khác. Có một cách để thực hiện việc này như sau:

/**
 * 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);
}

Xác định thời điểm bật và tắt bộ điều hợp Bluetooth

Với chính sách tùy chỉnh của mình, bạn có thể thoải mái xác định những sự kiện cho biết thời gian tốt nhất để bật và tắt bộ điều hợp. Một cách để thực hiện việc này là sử dụng trạng thái nguồn MAXIMUM_CONNECTED_DEVICES inch 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;
        }
    }
};

Xác định thời điểm kết nối thiết bị

Tương tự, khi bạn xác định những sự kiện sẽ kích hoạt kết nối thiết bị bắt đầu, CarBluetoothManager cung cấp lệnh gọi API connectDevices() sẽ tiếp tục kết nối thiết bị dựa trên danh sách ưu tiên được xác định cho từng cấu hình Bluetooth.

Một ví dụ về trường hợp bạn nên làm việc này là bất cứ khi nào bộ điều hợp Bluetooth bật:

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();
            }
        }
    }
}

Xác minh tính năng quản lý kết nối ô tô

Cách dễ nhất để xác minh hoạt động của chính sách kết nối là bật Bluetooth IVI của bạn và xác thực rằng nó tự động kết nối với đúng thiết bị trong thứ tự phù hợp. Bạn có thể bật/tắt bộ chuyển đổi Bluetooth thông qua giao diện người dùng cài đặt hoặc bằng các lệnh adb sau:

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

Ngoài ra, bạn có thể dùng kết quả của lệnh sau để xem thông tin gỡ lỗi liên quan đến kết nối Bluetooth:

adb shell dumpsys car_service

Cuối cùng, nếu bạn đã tạo chính sách cho ô tô của riêng mình, hãy xác minh mọi kết nối tuỳ chỉnh yêu cầu kiểm soát các sự kiện mà bạn đã chọn để kích hoạt thiết bị kết nối.

Cấu hình Bluetooth trên ô tô

Trong Android, IVI có thể hỗ trợ nhiều thiết bị kết nối đồng thời qua Bluetooth. Dịch vụ điện thoại Bluetooth nhiều thiết bị cho phép người dùng kết nối tách biệt các thiết bị đồng thời, chẳng hạn như điện thoại cá nhân và điện thoại công việc, đồng thời thực hiện cuộc gọi rảnh tay từ một trong hai thiết bị.

Giới hạn kết nối được thực thi theo từng cấu hình Bluetooth, thường là trong việc triển khai chính dịch vụ hồ sơ. Theo mặc định, CarBluetoothService không đánh giá thêm về số lượng kết nối tối đa thiết bị được phép.

Cấu hình rảnh tay

Cấu hình rảnh tay Bluetooth (HFP) cho phép xe tạo và nhận điện thoại qua một thiết bị từ xa được kết nối. Mỗi kết nối thiết bị sẽ đăng ký một điện thoại riêng tài khoản với TelecomManager, công ty này quảng cáo mọi tài khoản điện thoại có sẵn cho ứng dụng IVI.

IVI có thể kết nối với nhiều thiết bị qua HFP. MAX_STATE_MACHINES_POSSIBLE MAXIMUM_CONNECTED_DEVICES trong HeadsetClientService xác định số lượng HFP tối đa đồng thời kết nối.

Khi người dùng thực hiện hoặc nhận cuộc gọi điện thoại từ thiết bị, tài khoản điện thoại sẽ tạo một đối tượng HfpClientConnection. Ứng dụng Trình quay số tương tác với đối tượng HfpClientConnection để quản lý cuộc gọi chẳng hạn như nhận cuộc gọi hoặc kết thúc cuộc gọi.

Cần lưu ý rằng ứng dụng Trình quay số mặc định không hỗ trợ đồng thời nhiều dịch vụ thiết bị HFP được kết nối. Để triển khai HFP đa thiết bị, bạn phải tuỳ chỉnh để người dùng chọn tài khoản thiết bị sẽ sử dụng khi gọi điện. Sau đó, ứng dụng gọi telecomManager.placeCall bằng đúng tài khoản. Bạn cần xác minh rằng chức năng đa thiết bị khác cũng hoạt động như dự kiến.

Xác minh HFP đa thiết bị

Cách kiểm tra xem khả năng kết nối nhiều thiết bị có hoạt động đúng cách qua Bluetooth hay không:

  1. Sử dụng Bluetooth, kết nối một thiết bị với IVI và phát trực tuyến âm thanh từ thiết bị.
  2. Kết nối 2 điện thoại với IVI qua Bluetooth.
  3. Chọn một điện thoại. Gọi đi ngay từ điện thoại, và thực hiện cuộc gọi đi bằng IVI.
    1. Cả hai lần, hãy xác minh các lần tạm dừng âm thanh được phát trực tuyến và âm thanh điện thoại phát trên các loa được kết nối IVI.
  4. Sử dụng cùng một điện thoại, nhận cuộc gọi đến ngay trên điện thoại đó và nhận cuộc gọi đến bằng IVI.
    1. Cả hai lần, hãy xác minh các điểm tạm dừng âm thanh phát trực tuyến và âm thanh điện thoại phát qua loa kết nối IVI.
  5. Lặp lại bước 3 và 4 với điện thoại đã kết nối khác.

Gọi khẩn cấp

Khả năng thực hiện cuộc gọi khẩn cấp là một khía cạnh quan trọng của hệ thống điện thoại và Chức năng Bluetooth trong ô tô. Có một số cách để thực hiện cuộc gọi khẩn cấp bắt đầu từ IVI, bao gồm:

  • Giải pháp eCall độc lập
  • Giải pháp eCall được tích hợp vào IVI
  • Sử dụng điện thoại Bluetooth được kết nối khi không có hệ thống tích hợp

Kết nối cuộc gọi khẩn cấp

Mặc dù thiết bị cuộc gọi điện tử là thiết bị rất quan trọng về độ an toàn, nhưng hiện tại, thiết bị này chưa được tích hợp vào Android. Có thể sử dụng ConnectionService hiển thị các tính năng gọi khẩn cấp thông qua Android, dịch vụ này cũng lợi ích của việc giới thiệu các chế độ hỗ trợ tiếp cận cho các cuộc gọi khẩn cấp. Để tìm hiểu thêm, hãy xem Tạo ứng dụng gọi điện.

Dưới đây là ví dụ về cách thiết lập trường hợp khẩn cấp Dịch vụ kết nối:

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);
    }
}

Bật Bluetooth cho cuộc gọi khẩn cấp

Gọi khẩn cấp trước Android 10 liên quan đến việc gọi trực tiếp từ điện thoại và gọi thiết bị đặc biệt nếu có (ví dụ: tự động kích hoạt khi phát hiện mối nguy hiểm hoặc hành động của người dùng). Trên Android 10 trở lên, Trình quay số trên ô tô có thể gọi trực tiếp đến số khẩn cấp, miễn là MAXIMUM_CONNECTED_DEVICES này ở 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>

Bằng cách triển khai cuộc gọi khẩn cấp theo cách này, các ứng dụng khác, chẳng hạn như nhận dạng giọng nói, có thể cũng có thể gọi cho một số khẩn cấp.

Hồ sơ truy cập danh bạ điện thoại

Cấu hình truy cập danh bạ điện thoại qua Bluetooth (PBAP) tải danh bạ và nhật ký cuộc gọi xuống trên một thiết bị từ xa được kết nối. PBAP duy trì một danh sách tổng hợp, có thể tìm kiếm được về các địa chỉ liên hệ được máy trạng thái ứng dụng PBAP cập nhật. Từng thiết bị được kết nối tương tác với một máy trạng thái ứng dụng PBAP riêng biệt, khiến các địa chỉ liên hệ bị được liên kết với thiết bị phù hợp khi gọi điện.

PBAP mang tính một chiều và do đó yêu cầu IVI tạo thực thể kết nối cho bất kỳ MAXIMUM_CONNECTED_DEVICES inch PbapClientService xác định số lượng tối đa thiết bị PBAP đồng thời được phép kết nối với IVI. Ứng dụng PBAP lưu trữ danh bạ cho mỗi thiết bị thông minh trong Trình cung cấp danh bạ mà sau đó ứng dụng có thể truy cập để lấy số điện thoại cho từng thiết bị.

Ngoài ra, việc kết nối hồ sơ phải được cả IVI và thiết bị di động để thực hiện kết nối. Khi một ứng dụng PBAP ngắt kết nối, cơ sở dữ liệu nội bộ sẽ xoá tất cả người liên hệ và nhật ký cuộc gọi liên kết với thiết bị đã kết nối trước đó.

Cấu hình truy cập tin nhắn

Cấu hình truy cập tin nhắn qua Bluetooth (MAP) cho phép xe gửi và nhận tin nhắn SMS tin nhắn qua một thiết bị từ xa được kết nối. Hiện tại, tin nhắn không được lưu trữ cục bộ trên IVI. Thay vào đó, bất cứ khi nào thiết bị từ xa đã kết nối nhận được một thông báo, IVI nhận và phân tích cú pháp tin nhắn, đồng thời truyền nội dung của tin nhắn trong một Ví dụ về Ý định (Intent), mà sau đó ứng dụng có thể nhận được.

Để kết nối với một thiết bị di động nhằm mục đích gửi và nhận thì IVI phải khởi tạo kết nối MAP. MAXIMUM_CONNECTED_DEVICES trong MapClientService xác định số lượng tối đa thiết bị MAP đồng thời được phép kết nối với IVI. Mỗi kết nối phải được IVI và thiết bị di động trước khi có thể chuyển tin nhắn.

Cấu hình phân phối âm thanh nâng cao

Cấu hình phân phối âm thanh nâng cao qua Bluetooth (A2DP) cho phép xe nhận luồng âm thanh từ một thiết bị từ xa đã kết nối.

Không giống như các hồ sơ khác, số lượng thiết bị A2DP tối đa đã kết nối được thực thi trong ngăn xếp gốc chứ không phải trong Java. Giá trị hiện được cố định giá trị trong mã thành 1 bằng cách sử dụng biến kDefaultMaxConnectedAudioDevices trong packages/modules/Bluetooth/system/btif/src/btif_av.cc.

Cấu hình điều khiển từ xa âm thanh/video

Cấu hình điều khiển từ xa âm thanh/video qua Bluetooth (AVRCP) cho phép xe điều khiển và duyệt qua các trình phát nội dung đa phương tiện trên một thiết bị từ xa được kết nối. Vì IVI đóng vai trò bộ điều khiển AVRCP, bất kỳ chức năng điều khiển nào được kích hoạt có ảnh hưởng đến việc phát âm thanh đều sẽ dựa vào A2DP đến thiết bị mục tiêu.

Để IVI có thể xem một trình phát nội dung đa phương tiện cụ thể trên điện thoại Android qua AVRCP, ứng dụng đa phương tiện trên điện thoại phải cung cấp MediaBrowserService và cho phép com.android.bluetooth truy cập vào dịch vụ đó. Việc tạo dịch vụ trình duyệt nội dung đa phương tiện sẽ giải thích cách thực hiện việc này chi tiết.