يوفر Android تنفيذًا كاملاً للبلوتوث مع دعم العديد من ملفات البلوتوث الشخصية الشائعة داخل السيارة. هناك أيضًا العديد من التحسينات التي تعمل على تحسين الأداء والتجربة مع الأجهزة والخدمات الأخرى.
إدارة اتصال البلوتوث
ضمن Android، تحتفظ خدمة CarBluetoothService بأجهزة البلوتوث الحالية للمستخدم وقوائم الأولوية لكل اتصال ملف شخصي بنظام المعلومات والترفيه داخل السيارة (IVI). يتم توصيل الأجهزة بالملفات الشخصية بترتيب أولوية محدّد. يتم تحديد وقت تفعيل الأجهزة وإيقافها وتوصيلها بملف شخصي من خلال سياسة اتصال تلقائية يمكن إلغاؤها باستخدام تراكب موارد، إذا أردت ذلك.
ضبط إدارة اتصال السيارات
إيقاف سياسة الهاتف التلقائية
تحتفظ حزمة بروتوكول البلوتوث في Android بسياسة اتصال للهواتف يتم تفعيلها تلقائيًا
افتراضيًا. يجب إيقاف هذه السياسة على جهازك حتى لا تتعارض مع
سياسة السيارات المقصودة في
CarBluetoothService. على الرغم من أنّ تراكب منتج Car يجب أن يتولّى هذه المهمة،
يمكنك إيقاف سياسة الهاتف في
تراكب موارد من خلال ضبط 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. يتفاعل تطبيق "برنامج الاتصال"
مع عنصر HfpClientConnection لإدارة ميزات المكالمات
، مثل قبول مكالمة أو إنهاءها.
يُرجى العِلم أنّ تطبيق "برنامج الاتصال" التلقائي لا يتيح استخدام أجهزة متعددة متصلة في الوقت نفسه من خلال ملف بدون لمس الجهاز (HFP). لتنفيذ ملف بدون لمس الجهاز (HFP) على أجهزة متعددة، يجب إجراء تخصيص
للسماح للمستخدمين باختيار حساب الجهاز الذي سيتم استخدامه عند إجراء مكالمة. بعد ذلك، يستدعي التطبيق
telecomManager.placeCall باستخدام الحساب الصحيح. عليك التأكّد من أنّ وظائف الأجهزة المتعددة الأخرى تعمل على النحو المطلوب أيضًا.
التحقّق من ملف بدون لمس الجهاز (HFP) على أجهزة متعددة
للتأكّد من أنّ الاتصال بأجهزة متعددة يعمل بشكلٍ صحيح عبر البلوتوث:
- باستخدام البلوتوث، وصِّل جهازًا بنظام المعلومات والترفيه داخل السيارة (IVI) وابدأ بث الصوت من الـ جهاز.
- وصِّل هاتفَين بنظام المعلومات والترفيه داخل السيارة (IVI) عبر البلوتوث.
- اختَر هاتفًا واحدًا. أجرِ مكالمة صادرة مباشرةً من الهاتف،
وأجرِ مكالمة صادرة باستخدام نظام المعلومات والترفيه داخل السيارة (IVI).
- في كلتا الحالتَين، تأكَّد من إيقاف الصوت الذي يتم بثه مؤقتًا وتشغيل صوت الهاتف عبر مكبّرات الصوت المتصلة بنظام المعلومات والترفيه داخل السيارة (IVI).
- باستخدام الهاتف نفسه، استلِم مكالمة واردة مباشرةً على الهاتف، و
استلِم مكالمة واردة باستخدام نظام المعلومات والترفيه داخل السيارة (IVI).
- في كلتا الحالتَين، تأكَّد من إيقاف الصوت الذي يتم بثه مؤقتًا وتشغيل صوت الهاتف عبر مكبّرات الصوت المتصلة بنظام المعلومات والترفيه داخل السيارة (IVI).
- كرِّر الخطوتَين 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 والإصدارات الأحدث، يمكن لتطبيق "برنامج الاتصال" في السيارة الاتصال مباشرةً برقم طوارئ، شرط أن يكون 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) للمركبة بإرسال رسائل SMS وتلقّيها من خلال جهاز بعيد متصل. لا يتم حاليًا تخزين الرسائل محليًا على نظام المعلومات والترفيه داخل السيارة (IVI). بدلاً من ذلك، كلما تلقّى الجهاز البعيد المتصل رسالة، يتلقّى نظام المعلومات والترفيه داخل السيارة (IVI) الرسالة ويحلّلها ويبث محتوياتها في عنصر Intent، يمكن للتطبيق بعد ذلك تلقّيه.
للإتصال بجهاز جوّال بغرض إرسال الرسائل وتلقّيها
، يجب أن يبدأ نظام المعلومات والترفيه داخل السيارة (IVI) اتصال ملف الوصول إلى الرسائل (MAP).
MAXIMUM_CONNECTED_DEVICES في
MapClientService يحدّد الحد الأقصى لعدد اتصالات أجهزة ملف الوصول إلى الرسائل (MAP) المتزامنة المسموح بها مع نظام المعلومات والترفيه داخل السيارة (IVI). يجب أن يمنح كل من نظام المعلومات والترفيه داخل السيارة (IVI) والجهاز الجوّال الإذن بكل اتصال قبل أن يتم نقل الرسائل.
ملف توزيع الصوت المتقدِّم
يسمح ملف توزيع الصوت المتقدِّم عبر البلوتوث (A2DP) للمركبة بتلقّي بث الصوت من جهاز بعيد متصل.
على عكس الملفات الشخصية الأخرى، يتم فرض الحد الأقصى لعدد أجهزة ملف توزيع الصوت المتقدِّم (A2DP) المتصلة في الـ
حزمة بروتوكول البلوتوث الأصلية وليس في Java. تمت برمجة القيمة حاليًا على 1 باستخدام
المتغيّر في
packages/modules/Bluetooth/system/btif/src/btif_av.cc.kDefaultMaxConnectedAudioDevices
ملف وحدات التحكم عن بُعد في الصوت/الفيديو
يسمح ملف وحدات التحكم عن بُعد في الصوت/الفيديو عبر البلوتوث (AVRCP) للمركبة بالتحكّم في مشغّلات الوسائط وتصفّحها على جهاز بعيد متصل. بما أنّ نظام المعلومات والترفيه داخل السيارة (IVI) يؤدي دور وحدة تحكّم ملف وحدات التحكم عن بُعد في الصوت/الفيديو (AVRCP)، فإنّ أي عناصر تحكّم يتم تشغيلها وتؤثر في تشغيل الصوت تعتمد على اتصال ملف توزيع الصوت المتقدِّم (A2DP) بالجهاز المستهدَف.
لكي يتمكّن نظام المعلومات والترفيه داخل السيارة (IVI) من تصفّح مشغّل وسائط معيّن على هاتف Android من خلال ملف وحدات التحكم عن بُعد في الصوت/الفيديو (AVRCP)،
يجب أن يوفّر تطبيق الوسائط على الهاتف
MediaBrowserService ويسمح لـ com.android.bluetooth بالوصول إلى
هذه الخدمة.
يوضّح مقال إنشاء خدمة متصفّح وسائط كيفية إجراء ذلك بالتفصيل.