البلوتوث

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

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

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

ضبط إدارة ربط السيارات

إيقاف سياسة الهاتف التلقائية

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

استخدام السياسة التلقائية للسيارات

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

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

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

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

إيقاف السياسة التلقائية للسيارات

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

تفعيل وإيقاف محوّل البلوتوث

تتمثل إحدى الوظائف الأساسية لسياستك في تشغيل محوّل البلوتوث وإيقافه في في الأوقات المناسبة. يمكنك استخدام 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);
}

تحديد وقت تشغيل محوّل البلوتوث وإيقافه

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

وأحد الأمثلة على الحالات التي قد تريد فيها إجراء ذلك هو تشغيل محول البلوتوث:

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

التحقّق من إدارة ربط السيارة

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

بالإضافة إلى ذلك، يمكن استخدام ناتج الأمر التالي للاطّلاع على معلومات تصحيح الأخطاء. في ما يتعلق باتصالات البلوتوث:

adb shell dumpsys car_service

وأخيرًا، في حال وضع سياسة خاصة بالسيارات، يُرجى التحقّق من أي ربط مخصّص. التحكم في الأحداث التي اخترتها لتشغيل الجهاز الاتصالات.

الملفات الشخصية لميزة بلوتوث في السيارات

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

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

ملف تعريف بدون لمس الجهاز

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

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

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

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

إثبات ملكية HFP لأجهزة متعددة

للتأكّد من أنّ إمكانية الاتصال من خلال أجهزة متعدّدة تعمل بشكل صحيح عبر البلوتوث، اتّبِع الخطوات التالية:

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

مكالمات الطوارئ

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

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

إجراء مكالمة طوارئ

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

في ما يلي مثال على كيفية إنشاء حالة طوارئ 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);
    }
}

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

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

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

الملف الشخصي للوصول إلى دليل الهاتف

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

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

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

الملف الشخصي للوصول إلى الرسائل

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

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

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

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

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

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

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

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