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

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

چه چیزهایی در پیام‌رسان خودرو جدید است؟

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

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

اصطلاحات

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

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

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

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

مزایای برنامه‌های غیرمتمرکز

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

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

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

جزئیات فنی

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

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

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

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

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

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

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

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

 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.

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

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

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

 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 از تلفن به خودرو منتقل می‌شوند.
  • با قطع اتصال، داده‌های آن تلفن از پایگاه داده خودرو حذف می‌شود.

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

آخرین کامیت پیام‌رسان خودرو را از گوگل گیت دریافت کنید.

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

پیام‌رسان خودرو از رابط‌های برنامه‌نویسی کاربردی (API) CarVoiceInteractionSession برای ادغام با دستیار استفاده می‌کند. این عناصر در بخش‌های بعدی توضیح داده شده‌اند.

مدل PendingIntent

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

این توالی وقایع است:

  1. پیام‌رسان خودرو با فراخوانی activity.showAssist(Bundle args) دستیار را راه‌اندازی می‌کند . args شامل اکشن API و پارامترهای مورد نیاز آن است که در صورت نیاز شامل یک intent در حال انتظار نیز می‌شود.

  2. دستیار در صورت لزوم ورودی کاربر را بازیابی می‌کند و آن را با هدف در حال بررسی بسته‌بندی می‌کند.

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

  4. پیام‌رسان خودرو مشکل API را حل می‌کند .

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

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

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

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

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

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

کد نمونه:

/**
 *   KEY_PHONE_NUMBER - Recipients 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 - Recipients 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 - Recipients 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;

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

صفحه مخاطبین برنامه شماره‌گیر شکل ۳. صفحه مخاطبین در برنامه شماره‌گیر.

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

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

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

در اینجا مثالی از شماره‌گیر که 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
    • در خروجی دستور dumpsys MapClientService را جستجو کنید.
     Profile: MapClientService
          mCurrentDevice: 99:99 (Pixel XL) name=Mce state=Connected
    
  2. تأیید کنید که دستگاه صحیح فهرست شده است. برای مثال:

    فهرست دستگاه‌ها شکل ۵. فهرست دستگاه‌ها.

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

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

    یا

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

    یا

    • از طریق تلفن، تأیید کنید که دسترسی به پیام (Message Access) اعطا شده است.

اشکال‌زدایی پایگاه‌های داده بلوتوث

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

وظیفه فرماندهی
مکالمه 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 ، شناسه MMS را وارد کنید)
adb shell content query --uri content://mms/part/1

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

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

  1. برای تگ‌های مربوطه، adb shell setprop log.tag.<TAG> DEBUG اجرا کنید.

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

  3. برای باگ‌های با قابلیت تکرارپذیری بالا، استفاده از نقاط توقف (breakpoints) در اندروید استودیو را در نظر بگیرید.