Bluetooth

מערכת Android מספקת Bluetooth מלא עם תמיכה בהרבה פרופילים נפוצים של Bluetooth ברכב. יש גם שיפורים רבים שמשפרים את הביצועים ואת החוויה במכשירים אחרים שירותים שונים.

ניהול חיבור Bluetooth

ב-Android, CarBluetoothService שומר על עדיפות ה-Bluetooth ועל מכשירי ה-Bluetooth של המשתמשים הנוכחיים רשימות עבור כל חיבור של פרופיל ל-IVI. המכשירים מחוברים לפרופילים סדר העדיפויות המוגדר. מתי להפעיל, להשבית ולחבר מכשירים לפרופיל? מופעלת על ידי מדיניות חיבור שמוגדרת כברירת מחדל, שאותה אפשר לשנות באמצעות שכבת-על של משאבים, אם הרצויה.

הגדרה של ניהול החיבורים לכלי רכב

השבתת מדיניות ברירת המחדל לטלפון

מחסנית ה-Bluetooth של Android שומרת מדיניות חיבור לטלפונים שמופעלת על ידי כברירת מחדל. חובה להשבית את המדיניות הזו במכשיר שלך כדי שלא מתנגשת עם המדיניות בנושא כלי רכב מכוונת 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

אחת הפונקציות העיקריות של המדיניות היא להפעיל ולכבות את מתאם ה-Bluetooth בזמנים המתאימים. אפשר להשתמש בBluetoothAdapter.enable() BluetoothAdapter.disable() ממשקי API של framework כדי להפעיל ולהשבית את המתאם. הקריאות האלו צריכות להיות במצב הקבוע שהמשתמש בחר דרך ההגדרות או בכל אמצעי אחר. אחת הדרכים לעשות זאת היא:

/**
 * 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 מספק את הקריאה ל-API 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

לבסוף, אם יש לך מדיניות משלך בנושא כלי רכב, שמאמתת כל חיבור בהתאמה אישית נדרשת שליטה באירועים שבחרת להפעלת המכשיר בחיבורים.

פרופילים של Bluetooth של כלי רכב

ב-Android, ה-IVI יכול לתמוך במכשירים מרובים המחוברים בו-זמנית באמצעות Bluetooth. שירותים לטלפון Bluetooth מרובי מכשירים מאפשרים למשתמשים להתחבר מכשירים נפרדים בו-זמנית, כגון טלפון אישי וטלפון בעבודה, בשיחות קוליות מכל אחד מהמכשירים.

מגבלות החיבור נאכפות על ידי כל פרופיל Bluetooth נפרד, בדרך כלל במסגרת בשירות הפרופיל עצמו. כברירת מחדל, CarBluetoothService לא מייחס חשיבות רבה יותר למספר המקסימלי של חיבורי אינטרנט מכשירים מותרים.

פרופיל דיבורית

פרופיל Bluetooth Hands-Free (HFP) מאפשר לרכב ליצור ולקבל טלפון שיחות דרך מכשיר מרוחק מחובר. עם כל חיבור של המכשיר נרשם טלפון נפרד חשבון עם TelecomManager, שמפרסמת את כל חשבונות הטלפון הזמינים באפליקציות IVI.

ה-IVI יכול להתחבר למכשירים מרובים באמצעות HFP. MAX_STATE_MACHINES_POSSIBLE הפונקציה MAXIMUM_CONNECTED_DEVICES ב- HeadsetClientService מגדירה את המספר המקסימלי של HFP בו-זמנית בחיבורים.

כשמשתמש מתקשר או מקבל שיחת טלפון ממכשיר, חשבון הטלפון יוצר אובייקט HfpClientConnection. אפליקציית החייגן מקיים אינטראקציה עם האובייקט HfpClientConnection כדי לנהל את השיחה כמו קבלת שיחה או ניתוק.

חשוב לציין שאפליקציית החייגן שמוגדרת כברירת מחדל לא תומכת בכמה משחקים בו-זמנית מכשירי HFP מחוברים. כדי להטמיע HFP במספר מכשירים, נדרשת התאמה אישית כדי לאפשר למשתמשים לבחור באיזה חשבון מכשיר להשתמש לביצוע שיחה. לאחר מכן האפליקציה מתקשר אל telecomManager.placeCall עם החשבון הנכון. צריך: לוודא שפונקציות אחרות של מכשירים מרובים פועלות גם הן כמצופה.

אימות HFP של כמה מכשירים

כדי לבדוק שהקישוריות מרובת מכשירים פועלת באופן תקין באמצעות Bluetooth:

  1. באמצעות Bluetooth, חברו מכשיר ל-IVI והאזינו אודיו מ במכשיר.
  2. מחברים שני טלפונים ל-IVI באמצעות Bluetooth.
  3. בוחרים טלפון אחד. ביצוע שיחה יוצאת ישירות מהטלפון, ולבצע שיחה יוצאת באמצעות IVI.
    1. בשני המקרים, מוודאים שהאודיו בסטרימינג מושהה והאודיו של הטלפון מופעלת ברמקולים המחוברים של IVI.
  4. כשמשתמשים באותו טלפון, מקבלים שיחה נכנסת ישירות בטלפון. קבלת שיחה נכנסת באמצעות IVI.
    1. בשני המקרים, מוודאים שהאודיו בסטרימינג מושהה האודיו של הטלפון פועל ברמקולים המחוברים ל-IVI.
  5. חוזרים על שלבים 3 ו-4 עם הטלפון האחר המחובר.

שיחות חירום

היכולת לבצע שיחות חירום היא היבט חשוב במערכת הטלפוניה, פונקציות Bluetooth ברכב. יש כמה דרכים שבהן שיחת חירום של ה-IVI, כולל:

  • פתרון eCall עצמאי
  • פתרון eCall משולב ב-IVI
  • הסתמכות על טלפון Bluetooth מחובר כשאין מערכת מובנית זמינה

חיבור שיחת חירום

ציוד לשיחות אלקטרוניות הוא קריטי לבטיחות, אבל הוא לא משולב כרגע ב-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);
    }
}

הפעלת Bluetooth לשיחות חירום

ביצוע שיחת חירום לפני 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 Phone Book Access Profile (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 הנייד לפני שניתן יהיה להעביר הודעות.

פרופיל מתקדם של הפצת אודיו

פרופיל הפצת האודיו המתקדם (A2DP) של Bluetooth מאפשר לרכב לקלוט שידורי אודיו ממכשיר מרוחק מחובר.

בשונה מפרופילים אחרים, נאכף המספר המקסימלי של מכשירי A2DP מחוברים ולא ב-Java. הערך הזה הוא כרגע בתוך הקוד ל-1 באמצעות המשתנה kDefaultMaxConnectedAudioDevices ב packages/modules/Bluetooth/system/btif/src/btif_av.cc.

פרופיל שלט רחוק לאודיו/וידאו

פרופיל שלט רחוק לאודיו/וידאו (AVRCP) מאפשר לרכב לשלוט ולגלוש בנגני מדיה במכשיר מרוחק מחובר. מאחר שה-IVI למלא את תפקידו בקר AVRCP, כל פקדים שמופעלים ומשפיעים על הפעלת האודיו מסתמכים על A2DP חיבור למכשיר היעד.

בנגן מדיה ספציפי בטלפון Android שאפשר לעיין בו ב-IVI באמצעות AVRCP, אפליקציית המדיה בטלפון צריכה לספק MediaBrowserService ואפשר ל-com.android.bluetooth גישה אל באותו שירות. פיתוח שירות לדפדפן מדיה מסביר איך לעשות את זה בפירוט.