البلوتوث

يوفر Android تطبيقًا كاملاً للبلوتوث مع دعم العديد من ملفات تعريف البلوتوث الشائعة داخل السيارة. هناك أيضًا العديد من التحسينات التي تعمل على تحسين الأداء والتجربة مع الأجهزة والخدمات الأخرى.

إدارة اتصال البلوتوث

ضمن Android، تحتفظ CarBluetoothService بأجهزة Bluetooth الخاصة بالمستخدم الحالي وقوائم الأولويات لكل اتصال ملف تعريف بـ IVI. ترتبط الأجهزة بملفات التعريف بترتيب أولوية محدد. يتم تحديد متى يتم تمكين الأجهزة وتعطيلها وتوصيلها بملف تعريف من خلال سياسة الاتصال الافتراضية التي يمكن تجاوزها باستخدام تراكب الموارد ، إذا رغبت في ذلك.

تكوين إدارة اتصال السيارات

تعطيل سياسة الهاتف الافتراضية

تحتفظ حزمة Android Bluetooth بسياسة اتصال للهواتف التي يتم تمكينها افتراضيًا. يجب تعطيل هذه السياسة على جهازك حتى لا تتعارض مع سياسة السيارات المقصودة في CarBluetoothService . على الرغم من أن تراكب منتج السيارة يجب أن يعتني بهذا الأمر نيابةً عنك، يمكنك تعطيل سياسة الهاتف في تراكب الموارد عن طريق تعيين enable_phone_policy على false في MAXIMUM_CONNECTED_DEVICES في /packages/apps/Bluetooth/res/values/config.xml .

استخدم سياسة السيارات الافتراضية

تحتفظ CarBluetoothService بأذونات الملف الشخصي الافتراضية. قائمة الأجهزة المعروفة وأولويات إعادة اتصال ملف التعريف الخاص بها موجودة في service/src/com/android/car/BluetoothProfileDeviceManager.java .

كذلك، يمكن العثور على سياسة إدارة اتصال Bluetooth في service/src/com/android/car/BluetoothDeviceConnectionPolicy.java . افتراضيًا، تحدد هذه السياسة الحالات التي يجب أن يتصل فيها Bluetooth بالأجهزة المرتبطة ويفصلها عنها. كما أنه يدير الحالات الخاصة بالسيارة لمعرفة متى يجب تشغيل المحول وإيقاف تشغيله.

قم بإنشاء سياسة إدارة اتصال السيارات المخصصة الخاصة بك

إذا لم تكن سياسة السيارات الافتراضية كافية لاحتياجاتك، فمن الممكن أيضًا تعطيلها لصالح سياستك المخصصة. تكون سياستك المخصصة، على الأقل، مسؤولة عن تحديد وقت تمكين محول Bluetooth وتعطيله، وكذلك وقت توصيل الأجهزة. من الممكن استخدام مجموعة متنوعة من الأحداث لتمكين/تعطيل محول Bluetooth وبدء اتصالات الجهاز، بما في ذلك الأحداث الناجمة عن التغييرات في خصائص سيارة معينة.

تعطيل سياسة السيارات الافتراضية

أولاً، لاستخدام سياسة مخصصة، يجب تعطيل سياسة السيارات الافتراضية عن طريق تعيين useDefaultBluetoothConnectionPolicy على false في تراكب الموارد . تم تعريف هذا المورد في الأصل كجزء من MAXIMUM_CONNECTED_DEVICES في packages/services/Car/service/res/values/config.xml .

تمكين وتعطيل محول بلوتوث

تتمثل إحدى الوظائف الأساسية لسياستك في تشغيل محول Bluetooth وإيقاف تشغيله في الأوقات المناسبة. يمكنك استخدام واجهات برمجة تطبيقات إطار عمل BluetoothAdapter.enable() و BluetoothAdapter.disable() لتمكين المحول وتعطيله. يجب أن تحترم هذه الاستدعاءات الحالة المستمرة التي حددها المستخدم من خلال الإعدادات أو أي وسيلة أخرى. إحدى الطرق للقيام بذلك هي كما يلي:

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

حدد متى يتم تشغيل محول Bluetooth وإيقاف تشغيله

باستخدام سياستك المخصصة، لديك الحرية في تحديد الأحداث التي تشير إلى أفضل الأوقات لتمكين المحول وتعطيله. إحدى الطرق للقيام بذلك هي استخدام حالات الطاقة MAXIMUM_CONNECTED_DEVICES في 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;
        }
    }
};

تحديد متى يتم توصيل الأجهزة

وبالمثل، عندما تحدد الأحداث التي يجب أن تؤدي إلى بدء اتصالات الجهاز، يوفر CarBluetoothManager استدعاء واجهة برمجة التطبيقات connectDevices() الذي يستمر لتوصيل الأجهزة بناءً على قوائم الأولويات المحددة لكل ملف تعريف Bluetooth.

أحد الأمثلة على الأوقات التي قد ترغب فيها في القيام بذلك هو عندما يتم تشغيل محول 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 app's context
                Car car = Car.createCar(mContext);
                CarBluetoothManager carBluetoothManager =
                        (CarBluetoothManager) car.getCarManager(Car.BLUETOOTH_SERVICE);
                carBluetoothManager.connectDevices();
            }
        }
    }
}

التحقق من إدارة اتصال السيارات

أسهل طريقة للتحقق من سلوك سياسة الاتصال الخاصة بك هي تمكين Bluetooth على جهاز IVI الخاص بك والتحقق من اتصاله تلقائيًا بالأجهزة الصحيحة بالترتيب المناسب. يمكنك تبديل محول Bluetooth من خلال واجهة مستخدم الإعدادات، أو باستخدام أوامر 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

بالإضافة إلى ذلك، يمكن استخدام مخرجات الأمر التالي لرؤية معلومات التصحيح المتعلقة باتصالات Bluetooth:

adb shell dumpsys car_service

أخيرًا، إذا قمت بإنشاء سياسة السيارات الخاصة بك، فإن التحقق من أي سلوك اتصال مخصص يتطلب التحكم في الأحداث التي اخترتها لتشغيل اتصالات الجهاز.

ملفات تعريف بلوتوث للسيارات

في Android، يمكن لـ IVI دعم أجهزة متعددة متصلة في وقت واحد عبر البلوتوث. تتيح خدمات هاتف Bluetooth متعددة الأجهزة للمستخدمين توصيل أجهزة منفصلة بشكل متزامن، مثل الهاتف الشخصي وهاتف العمل، وإجراء مكالمات بدون استخدام اليدين من أي جهاز.

يتم فرض حدود الاتصال بواسطة كل ملف تعريف Bluetooth فردي، وعادةً ما يكون ذلك ضمن تنفيذ خدمة الملف الشخصي نفسها. افتراضيًا، لا تصدر CarBluetoothService أي حكم آخر على الحد الأقصى لعدد الأجهزة المتصلة المسموح بها.

ملف تعريف حر اليدين

يتيح ملف تعريف Bluetooth بدون استخدام اليدين (HFP) للمركبة إجراء واستقبال المكالمات الهاتفية عبر جهاز بعيد متصل. يقوم كل اتصال جهاز بتسجيل حساب هاتف منفصل مع TelecomManager ، الذي يعلن عن أي حسابات هاتف متاحة لتطبيقات IVI.

يمكن لـ IVI الاتصال بأجهزة متعددة عبر HFP. يحدد MAX_STATE_MACHINES_POSSIBLE MAXIMUM_CONNECTED_DEVICES في HeadsetClientService الحد الأقصى لعدد اتصالات HFP المتزامنة.

عندما يقوم مستخدم بإجراء أو تلقي مكالمة هاتفية من جهاز، يقوم حساب الهاتف المقابل بإنشاء كائن HfpClientConnection . يتفاعل تطبيق Dialer مع كائن HfpClientConnection لإدارة ميزات الاتصال، مثل قبول مكالمة أو إنهاء المكالمة.

تجدر الإشارة إلى أن تطبيق Dialer الافتراضي لا يدعم أجهزة HFP المتعددة المتصلة في وقت واحد. من أجل تنفيذ HFP متعدد الأجهزة، يلزم التخصيص للسماح للمستخدمين بتحديد حساب الجهاز الذي سيتم استخدامه عند إجراء مكالمة. يقوم التطبيق بعد ذلك باستدعاء telecomManager.placeCall بالحساب الصحيح. تحتاج إلى التحقق من أن وظائف الأجهزة المتعددة الأخرى تعمل على النحو المنشود أيضًا.

التحقق من HFP متعدد الأجهزة

للتحقق من أن الاتصال متعدد الأجهزة يعمل بشكل صحيح عبر البلوتوث:

  1. باستخدام Bluetooth، قم بتوصيل جهاز بـ IVI وقم ببث الصوت من الجهاز.
  2. قم بتوصيل هاتفين بـ IVI عبر البلوتوث.
  3. اختر هاتفًا واحدًا. إجراء مكالمة صادرة مباشرة من الهاتف، وإجراء مكالمة صادرة باستخدام IVI.
    1. في كلتا الحالتين، تحقق من توقف الصوت المتدفق مؤقتًا وتشغيل صوت الهاتف عبر مكبرات الصوت المتصلة بـ IVI.
  4. باستخدام نفس الهاتف، يمكنك استقبال مكالمة واردة مباشرة على الهاتف، واستقبال مكالمة واردة باستخدام IVI.
    1. في كلتا الحالتين، تحقق من توقف تدفق الصوت مؤقتًا وتشغيل صوت الهاتف عبر مكبرات الصوت المتصلة بـ IVI.
  5. كرر الخطوتين 3 و4 مع الهاتف المتصل الآخر.

مكالمة طوارئ

تعد القدرة على إجراء مكالمات الطوارئ جانبًا مهمًا من وظائف الهاتف والبلوتوث في السيارة. هناك عدد من الطرق التي يمكن من خلالها بدء مكالمة طوارئ من IVI، بما في ذلك:

  • حل eCall مستقل
  • حل eCall مدمج في IVI
  • الاعتماد على هاتف Bluetooth متصل في حالة عدم توفر نظام مدمج

توصيل مكالمة طوارئ

على الرغم من أن معدات eCall تعتبر أمرًا بالغ الأهمية للسلامة، إلا أنها غير مدمجة حاليًا في Android. من الممكن استخدام ConnectionService لعرض ميزات مكالمات الطوارئ من خلال Android، والتي تتمتع أيضًا بميزة تقديم خيارات إمكانية الوصول لمكالمات الطوارئ. لمعرفة المزيد، راجع إنشاء تطبيق اتصال .

فيما يلي مثال لكيفية إنشاء خدمة اتصال الطوارئ:

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

تمكين البلوتوث لمكالمات الطوارئ

يتضمن الاتصال بالطوارئ قبل نظام التشغيل Android 10 الاتصال المباشر من الهاتف واستدعاء معدات خاصة إذا كانت متوفرة (على سبيل المثال، التشغيل التلقائي عند اكتشاف الخطر أو إجراء المستخدم). في نظام التشغيل Android 10 والإصدارات الأحدث، يمكن لبرنامج الاتصال الموجود في السيارة الاتصال مباشرة برقم الطوارئ، بشرط وجود MAXIMUM_CONNECTED_DEVICES في 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>

ومن خلال تنفيذ مكالمات الطوارئ بهذه الطريقة، يمكن للتطبيقات الأخرى، مثل التعرف على الصوت، أيضًا الاتصال برقم الطوارئ.

ملف تعريف الوصول إلى دفتر الهاتف

يقوم ملف تعريف الوصول إلى دفتر هاتف Bluetooth (PBAP) بتنزيل جهات الاتصال وسجلات المكالمات من جهاز بعيد متصل. يحتفظ PBAP بقائمة مجمعة وقابلة للبحث من جهات الاتصال التي يتم تحديثها بواسطة جهاز حالة عميل PBAP. يتفاعل كل جهاز متصل مع جهاز حالة عميل PBAP منفصل، مما يؤدي إلى ربط جهات الاتصال بالجهاز المناسب عند إجراء مكالمة.

PBAP أحادي الاتجاه وبالتالي يتطلب IVI لإنشاء اتصالات بأي MAXIMUM_CONNECTED_DEVICES في PbapClientService يحدد الحد الأقصى لعدد اتصالات جهاز PBAP المتزامنة المسموح بها مع IVI. يقوم عميل PBAP بتخزين جهات الاتصال لكل جهاز متصل في موفر جهات الاتصال والذي يمكن بعد ذلك الوصول إليه بواسطة تطبيق لاشتقاق دفتر الهاتف لكل جهاز.

بالإضافة إلى ذلك، يجب أن يتم اعتماد اتصال ملف التعريف من قبل كل من IVI والجهاز المحمول حتى يتم إجراء الاتصال. عند قطع اتصال عميل PBAP، تقوم قاعدة البيانات الداخلية بإزالة جميع جهات الاتصال وسجل المكالمات المرتبط بالجهاز المتصل مسبقًا.

ملف تعريف الوصول إلى الرسالة

يتيح ملف تعريف الوصول إلى رسائل Bluetooth (MAP) للمركبة إرسال واستقبال رسائل SMS عبر جهاز بعيد متصل. حاليًا، لا يتم تخزين الرسائل محليًا على IVI. بدلاً من ذلك، عندما يتلقى الجهاز البعيد المتصل رسالة، يتلقى IVI الرسالة ويحللها ويبث محتوياتها في مثيل Intent ، والذي يمكن بعد ذلك استلامه بواسطة التطبيق.

من أجل الاتصال بجهاز محمول لغرض إرسال واستقبال الرسائل، يجب على IVI بدء اتصال MAP. يحدد MAXIMUM_CONNECTED_DEVICES في MapClientService الحد الأقصى لعدد اتصالات جهاز MAP المتزامنة المسموح بها مع IVI. يجب أن يتم ترخيص كل اتصال من قبل IVI والجهاز المحمول قبل نقل الرسائل.

ملف تعريف توزيع الصوت المتقدم

يتيح ملف توزيع الصوت المتقدم بتقنية Bluetooth (A2DP) للمركبة استقبال التدفقات الصوتية من جهاز بعيد متصل.

على عكس ملفات التعريف الأخرى، يتم فرض الحد الأقصى لعدد أجهزة A2DP المتصلة في المكدس الأصلي وليس في Java. تم ترميز القيمة حاليًا إلى 1 باستخدام المتغير kDefaultMaxConnectedAudioDevices في packages/modules/Bluetooth/system/btif/src/btif_av.cc .

ملف التحكم عن بعد بالصوت/الفيديو

يتيح ملف التحكم عن بعد في الصوت/الفيديو عبر Bluetooth (AVRCP) للمركبة التحكم في مشغلات الوسائط وتصفحها على جهاز بعيد متصل. نظرًا لأن IVI يلعب دور وحدة التحكم AVRCP، فإن أي عناصر تحكم تم تشغيلها تؤثر على تشغيل الصوت تعتمد على اتصال A2DP بالجهاز المستهدف.

لكي يكون مشغل وسائط معين على هاتف Android قابلاً للتصفح بواسطة IVI عبر AVRCP، يجب أن يوفر تطبيق الوسائط الموجود على الهاتف MediaBrowserService ويسمح لـ com.android.bluetooth بالوصول إلى تلك الخدمة. يشرح إنشاء خدمة متصفح الوسائط كيفية القيام بذلك بالتفصيل.