پیام رسان خودرو

Car Messenger قابلیت‌های پیام‌رسانی طراحی شده برای دستگاه‌های خودرو را ارائه می‌دهد. مانند سایر برنامه های خودرو، کاربران مسنجر Car را از لانچر شروع می کنند.

در Car Messenger چه خبر؟

با برنامه جدید Car Messenger، رانندگان:

  • یک تجربه پیام رسانی اختصاصی دریافت کنید.
  • مسنجر خودرو را از لانچر راه اندازی کنید.
  • پیام های دریافتی قبل و حین رانندگی را مرور کنید.
  • به پیام ها گوش دهید و به آنها پاسخ دهید.
  • اعلان‌های پیام را بی‌صدا کنید.
  • مکالمات جدید را شروع کنید.

واژه شناسی

این اصطلاحات در این صفحه استفاده می شود:

ضربه زدن برای خواندن (TTR)
Tap-to-Read به دستیاران صوتی امکان می‌دهد پیام‌های متنی را از طرف آن کاربر بخوانند و به آن‌ها پاسخ دهند، زمانی که کاربر با اعلان‌های پیام تعامل دارد.

پاسخ مستقیم
مشابه با Tap-to-Read، با این تفاوت که دستیار صوتی پیام را نمی خواند و بلافاصله یک درخواست برای پاسخ صادر می کند.

ارسال مستقیم
با یک دستیار صوتی یکپارچه می شود تا یک جریان پیام جدید با یا بدون مخاطب مشخص بنویسد.

مزایای برنامه های جداسازی شده

برنامه‌های جدا نشده، مانند Car Messenger، مزایای زیر را ارائه می‌کنند:

  • فقط از روش های عمومی استفاده می کند (بدون وابستگی پلت فرم به API های پنهان)
  • برنامه های خارج از پلتفرم اندروید را توسعه دهید
  • فعال کردن نسخه های مکرر (برای ویژگی های جدید و مشکلات ثابت)
  • برنامه ها را از طریق Google Play به روز کنید

درباره برنامه‌های دسته‌بندی‌شده بیشتر بدانید.

جزییات فنی

این بخش معماری Car Messenger را توضیح می دهد. برای کسب اطلاعات بیشتر، به ادغام با CarVoiceInteractionSession مراجعه کنید.

معماری مبتنی بر تلفن

هنگامی که از طریق بلوتوث جفت می شود، داده ها از پایگاه داده تلفن تلفن با پایگاه داده تلفن خودرو هماهنگ می شوند. با قطع بلوتوث، داده های همگام سازی شده از پایگاه داده تلفن خودرو حذف می شوند.

این قابلیت در اندروید 12 معرفی شد. مزایای اصلی عبارتند از:

  • پیام های کاربر انبوه را می توان از پایگاه داده بازیابی کرد.
  • پیام‌های درایوهای قبلی پشتیبانی می‌شوند.
  • از معماری و API مشابه برای ذخیره و بازیابی پیامک در تلفن های اندرویدی استفاده می کند.
  • به طور کامل از پلتفرم اندروید جدا می شود.

این جریان است:

جریان داده مبتنی بر تلفن شکل 1. جریان داده مبتنی بر تلفن.

جریان نشان داده شده در قالب متن:

 1. Phone connects to car.
    |
    --> 2. SMS data transferred from phone's database to car database.
          |
          --> 3. Car Messenger retrieves data from telephony database to display on UI.
                  |
                  --> 4. User interactions prompt the voice assistant.
                  |
          <-- 5. Car Messenger receives reply action from the voice assistant.
          |
    <-- 6. SMS is marked as read in car database.
    |
 7. Reply transmitted to recipients, phone database updated with reply and read status.

در اینجا کاری است که ما با داده ها انجام می دهیم:

استفاده از داده مسنجر خودرو شکل 2. مدیریت داده های پیام رسان خودرو.

جریان نشان داده شده در قالب متن:

 1. Phone connects to car.
    |
    --> 2. SMS data transferred from phone's database to car database.
          |
          --> 3. Phone disconnects from car.
                  |
                  --> 4. SMS data deleted from car telephony database.
  • در اتصال، داده ها با استفاده از بلوتوث MAP از تلفن به ماشین منتقل می شود.
  • در صورت قطع اتصال، داده های آن تلفن از پایگاه داده خودرو حذف می شود.

پیام رسان خودرو را دریافت کنید

آخرین کامیت مسنجر خودرو را از Google Git دریافت کنید.

APIهای تعامل صوتی

Car Messenger از API های CarVoiceInteractionSession برای ادغام با دستیار استفاده می کند. این عناصر در بخش های بعدی توضیح داده شده اند.

مدل PendingIntent

این APIها از PendingIntent برای ارسال درخواست‌های دستیار حل‌شده به پیام‌رسان خودرو استفاده می‌کنند.

این ترتیب وقایع است:

  1. Car Messenger با فراخوانی activity.showAssist(Bundle args) دستیار را راه اندازی می کند . آرگ ها حاوی کنش API و پارامترهای مورد نیاز آن هستند که در صورت نیاز حاوی یک هدف معلق هستند.

  2. Assistant ورودی های کاربر را در صورت لزوم بازیابی می کند و آن را با هدف معلق بسته بندی می کند.

  3. Assistant هدف را به Car Messenger ارسال می کند.

  4. Car Messenger عمل API را حل می کند .

علامت گذاری به عنوان خوانده شده عملکرد API

وقتی دستیار در حال خواندن یک پیام است، PendingIntent با عملکرد VOICE_ACTION_READ_NOTIFICATION یا VOICE_ACTION_READ_CONVERSATION به پیام‌رسان خودرو ارسال می‌شود تا پیام را به‌عنوان خوانده‌شده علامت‌گذاری کند.

عملکرد API پاسخ مستقیم

وقتی دستیار در حال پاسخ دادن به یک پیام است، PendingIntent با عملکرد VOICE_ACTION_REPLY_NOTIFICATION و VOICE_ACTION_REPLY_CONVERSATION برای پاسخ به مکالمه به پیام‌رسان خودرو ارسال می‌شود.

اقدام مستقیم ارسال SMS API

بسته‌ای با عملکرد VOICE_ACTION_SEND_SMS از Car Messenger به دستیار ارسال می‌شود.

کد نمونه:

/**
 *   KEY_PHONE_NUMBER - Recipient’s phone number. If this and the recipients name are not
 *   provided by the application, assistant must do contact disambiguation but is not required
 *   to add the name to the PendingIntent.
 *
 *   KEY_RECIPIENT_NAME - Recipient’s name. If this and the recipient phone number are not
 *   provided by the application, assistant must do contact disambiguation but is not required
 *   to add the name to the PendingIntent.
 *
 *   KEY_RECIPIENT_UID - Recipient’s UID in the ContactProvider database. Optionally provided
 *   by the application. Not required to be sent back by the assistant.
 *
 *   KEY_DEVICE_NAME - Friendly name of the device in which to send the message from. If not
 *   provided by the application, assistant must do device disambiguation but is not required
 *   to add it to PendingIntent. In V1 this is required to be sent by the application.
 *
 *   KEY_DEVICE_ADDRESS - Bluetooth device address of the device in which to send the message
 *   from. If not provided by the application, assistant must do device disambiguation and add
 *   this to the PendingIntent. In V1 this is required to be sent by the application.
 *
 *   KEY_SEND_PENDING_INTENT - @NotNull Will always be provided by the application. The
 *   application must preload the pending intent with any KEYs it provides the assistant that
 *   is also needed to send the message. (I.e if the application passes in the
 *   KEY_PHONE_NUMBER in the Bundle, the assistant can assume the application has already put
 *   this in the PendingIntent and may not re-add it to the PendingIntent).
 *
 */
public static final String KEY_PHONE_NUMBER = “KEY_PHONE_NUMBER”;
public static final String KEY_RECIPIENT_NAME = “KEY_RECIPIENT_NAME”;
public static final String KEY_RECIPIENT_UID = “KEY_RECIPIENT_UID”;
public static final String KEY_DEVICE_NAME = “KEY_DEVICE_NAME”;
public static final String KEY_DEVICE_ADDRESS = “KEY_DEVICE_NAME”;
public static final String KEY_SEND_PENDING_INTENT =”KEY_SEND_PENDING_INTENT”;

این تصویر هنگام انتخاب گیرنده، نوشتن پیام را نشان می دهد:

صفحه مخاطبین برنامه Dialer شکل 3. صفحه مخاطبین در برنامه Dialer.

این تصویر نوشتن یک پیام را در زمانی که هیچ گیرنده ای با استفاده از پیام جدید انتخاب نشده است نشان می دهد:

گیرنده انتخابی وجود ندارد شکل 4. دکمه پیام جدید در برنامه مسنجر.

ادغام عمل ارسال پیامک مستقیم

در اینجا نمونه ای از Dialer است که VOICE_ACTION_SEND_SMS را یکپارچه می کند و پارامترهای اختیاری را ارائه می دهد:

    /**
     * Build the {@link Bundle} to pass to assistant to send a sms.
     */
    public Bundle buildDirectSendBundle(String number, String name, String uid,
                                        BluetoothDevice device) {
        Bundle bundle = new Bundle();
        bundle.putString(CarVoiceInteractionSession.KEY_ACTION, VOICE_ACTION_SEND_SMS);
        // start optional parameters
        bundle.putString(CarVoiceInteractionSession.KEY_PHONE_NUMBER, number);
        bundle.putString(CarVoiceInteractionSession.KEY_RECIPIENT_NAME, name);
        bundle.putString(CarVoiceInteractionSession.KEY_RECIPIENT_UID, uid);
        // end optional parameters
        bundle.putString(CarVoiceInteractionSession.KEY_DEVICE_ADDRESS, device.getAddress());
        bundle.putString(CarVoiceInteractionSession.KEY_DEVICE_NAME,
                DialerUtils.getDeviceName(mContext, device));
        Intent intent = new Intent(mContext, MessagingService.class)
                .setAction(ACTION_DIRECT_SEND)
                .setClass(mContext, MessagingService.class);

        int requestCode = ACTION_DIRECT_SEND.hashCode();
        PendingIntent pendingIntent = PendingIntent.getForegroundService(
                mContext, requestCode, intent,
                PendingIntent.FLAG_ONE_SHOT | PendingIntent.FLAG_IMMUTABLE);

        bundle.putParcelable(KEY_SEND_PENDING_INTENT, pendingIntent);
        return bundle;
    }

بهبود TTR و پاسخ مستقیم

API به روز شده اکنون از یک کلاس Conversation همه کاره استفاده می کند که امکان انجام عملیات فراتر از حوزه اعلان و گسترش قابلیت ها را در زمینه برنامه فراهم می کند. این جایگزین نیاز قبلی استفاده از کلاس StatusBarNotification است.

اشکال زدایی پیام رسان خودرو

برای اطلاعات بیشتر در مورد اشکال زدایی Car Messenger به بخش های زیر مراجعه کنید.

اشکال زدایی اتصالات بلوتوث

  1. دستور dumpsys را اجرا کنید:

    adb shell dumpsys bluetooth_manager
    
    • MapClientService را در خروجی فرمان dumpsys جستجو کنید.
     Profile: MapClientService
          mCurrentDevice: 99:99 (Pixel XL) name=Mce state=Connected
    
  2. تأیید کنید که دستگاه صحیح در لیست قرار گرفته است. مثلا:

    لیست دستگاه شکل 5. لیست دستگاه.

  3. اگر دستگاهی پیدا نشد، یکی از موارد زیر را انجام دهید:

    • دوباره به بلوتوث وصل شوید.

    یا

    • در تنظیمات بلوتوث، تأیید کنید که پیام متنی روشن است.

    یا

    • در تلفن، تأیید کنید که دسترسی به پیام داده شده است.

دیباگ های بلوتوث را اشکال زدایی کنید

مسنجر خودرو بر روی پایگاه داده تلفن ساخته شده است. برای تعیین اینکه آیا بلوتوث آن پایگاه داده را پر می کند، می توانید از دستورات موجود در جدول استفاده کنید.

وظیفه فرمان
گفتگو adb shell content query--uri content://mms-sms/conversations?simple=true
فقط پیامک adb shell content query--uri content://sms
پیام های MMS/SMS adb shell content query--uri content://mms-sms/conversations
فقط پیام های MMS adb shell content query--uri content://mms
فقط صندوق ورودی MMS adb shell content query--uri content://mms/conversations/inbox
فقط پیامک ارسال می شود adb shell content query--uri content://sms/sent
فقط صندوق پیامک adb shell content query--uri content://sms/conversations/inbox
پیام MMS قسمت 1
( 1 با شناسه MMS جایگزین کنید)
adb shell content query--uri content://mms/part/1

اشکال‌زدایی پیام‌رسان خودرو و پرسش‌های دستیار صوتی

اگر تصویر ساخت eng یا userdebug باشد، گزارش‌ها به‌طور پیش‌فرض چاپ می‌شوند. در غیر این صورت، برای فعال کردن ورود به سیستم Car Messenger:

  1. برای تگ های مربوطه adb shell setprop log.tag.<TAG> DEBUG .

  2. ورود به سیستم را برای دستیار از پیش بارگذاری شده فعال کنید.

  3. برای اشکالات بسیار تکرارپذیر، از نقاط شکست با Android Studio استفاده کنید.