Bluetooth

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

ניהול חיבור בלוטות'

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

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

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

ערימת ה-Bluetooth של אנדרואיד שומרת על מדיניות חיבור לטלפונים המופעלת כברירת מחדל. מדיניות זו חייבת להיות מושבתת במכשיר שלך כדי שלא תתנגש עם מדיניות הרכב המיועדת ב- CarBluetoothService . בעוד ששכבת העל של מוצר המכונית צריכה לטפל בזה עבורך, תוכל להשבית את מדיניות הטלפון בשכבת-על של משאבים על ידי הגדרת enable_phone_policy ל- false ב- MAXIMUM_CONNECTED_DEVICES ב-/ /packages/apps/Bluetooth/res/values/config.xml /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 בזמנים המתאימים. אתה יכול להשתמש בממשקי ה-API 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 מספק את קריאת ה-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 לרכב

באנדרואיד, ה-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 עם הטלפון המחובר השני.

קריאת חירום

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

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

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

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

התקשרות לשעת חירום לפני אנדרואיד 10 כללה חיוג ישיר מטלפון והפעלת ציוד מיוחד אם זמין (לדוגמה, הפעלה אוטומטית לאחר זיהוי סכנה או פעולת משתמש). באנדרואיד 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 Audio/Video (AVRCP) מאפשר לרכב לשלוט ולעיין בנגני מדיה במכשיר מרוחק מחובר. מכיוון שה-IVI ממלא את התפקיד של בקר AVRCP, כל הפקדים המופעלים המשפיעים על השמעת אודיו מסתמכים על חיבור A2DP להתקן היעד.

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