자동차 메신저

자동차 메신저를 통해 자동차 기기용으로 설계된 메시지 기능을 사용할 수 있습니다. 다른 자동차 앱처럼 사용자는 런처에서 자동차 메신저를 시작합니다.

자동차 메신저의 새로운 기능

새로운 자동차 메신저 앱을 사용하여 운전자는 다음 이점을 누릴 수 있습니다.

  • 전용 메시지 환경을 얻습니다.
  • 런처에서 자동차 메신저를 실행합니다.
  • 운전 전과 운전 중에 수신한 메시지를 탐색합니다.
  • 메시지를 듣고 메시지에 답장합니다.
  • 메시지 알림을 무음으로 설정합니다.
  • 새로운 대화를 시작합니다.

용어

이 페이지에서는 다음 용어가 사용됩니다.

탭하여 읽기(TTR)
탭하여 읽기를 사용하면 사용자가 메시지 알림과 상호작용할 때 음성 어시스턴트가 사용자를 대신하여 문자 메시지를 읽고 답장할 수 있습니다.

바로 답장
탭하여 읽기와 비슷하지만 음성 어시스턴트가 메시지를 읽지 않고 답장을 위한 메시지를 즉시 표시한다는 점이 다릅니다.

바로 전송
음성 어시스턴트와 통합되어 지정된 연락처가 있든 없든 새로운 메시지 흐름을 작성합니다.

번들 해제된 앱의 이점

자동차 메신저와 같은 번들 해제된 앱은 다음과 같은 이점이 있습니다.

  • 공개 메서드만 사용합니다(숨겨진 API의 플랫폼 종속 항목이 없음).
  • Android 플랫폼 외부에서 앱을 개발합니다.
  • 더 빈번한 출시를 사용 설정합니다(새로운 기능과 문제 해결을 위해).
  • Google Play를 통해 앱을 업데이트합니다.

번들 해제된 앱에 관해 자세히 알아보세요.

기술 세부정보

이 섹션에서는 자동차 메신저 아키텍처를 설명합니다. 자세한 내용은 CarVoiceInteractionSession과 통합을 참고하세요.

전화 통신 기반 아키텍처

블루투스를 통해 페어링되면 데이터가 휴대전화의 전화 통신 데이터베이스에서 자동차의 전화 통신 데이터베이스로 동기화됩니다. 블루투스의 연결이 해제되면 동기화된 데이터는 자동차의 전화 통신 데이터베이스에서 삭제됩니다.

이 기능은 Android 12에서 도입되었습니다. 주요 이점은 다음과 같습니다.

  • 데이터베이스에서 대량 사용자 메시지를 가져올 수 있습니다.
  • 이전 운전의 메시지가 지원됩니다.
  • Android 휴대전화에서 SMS 저장 및 검색을 위해 유사한 아키텍처와 API를 사용합니다.
  • Android 플랫폼에서 완전히 번들 해제됩니다.

흐름은 다음과 같습니다.

전화 통신 기반 데이터 흐름 그림 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

자동차 메신저는 CarVoiceInteractionSession API를 사용하여 어시스턴트와 통합됩니다. 이런 요소는 다음 섹션에서 설명합니다.

PendingIntent 모델

이 API는 PendingIntent를 사용하여 해결된 어시스턴트 쿼리를 자동차 메신저로 다시 전달합니다.

이벤트 순서는 다음과 같습니다.

  1. 자동차 메신저가 activity.showAssist(Bundle args)를 호출하여 어시스턴트를 실행합니다. args에는 필요한 경우 대기 중 인텐트를 포함하는 API 작업과 필수 매개변수가 포함됩니다.

  2. 어시스턴트는 필요하면 사용자 입력을 가져오고 이를 대기 중 인텐트와 함께 패키징합니다.

  3. 어시스턴트는 인텐트를 다시 자동차 메신저로 보냅니다.

  4. 자동차 메신저는 API 작업을 해결합니다.

읽음으로 표시 API 작업

어시스턴트가 메시지를 읽으면 PendingIntentVOICE_ACTION_READ_NOTIFICATION 또는 VOICE_ACTION_READ_CONVERSATION 작업과 함께 자동차 메신저에 전송되어 메시지를 읽은 것으로 표시합니다.

바로 답장 API 작업

어시스턴트가 메시지에 답장하는 경우 PendingIntentVOICE_ACTION_REPLY_NOTIFICATIONVOICE_ACTION_REPLY_CONVERSATION 작업과 함께 자동차 메신저에 전송되어 대화에 답장합니다.

바로 전송 SMS API 작업

VOICE_ACTION_SEND_SMS 작업이 포함된 번들이 자동차 메신저에서 어시스턴트로 전송됩니다.

샘플 코드

/**
 *   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”;

이 이미지는 받는 사람이 선택된 경우 메시지를 작성하는 방법을 보여줍니다.

다이얼러 앱의 연락처 페이지그림 3. 다이얼러 앱의 연락처 페이지

이 이미지는 받는 사람이 선택되지 않은 경우 새 메시지를 사용하여 메시지를 작성하는 방법을 보여줍니다.

받는 사람이 선택되지 않음그림 4. 메신저 앱의 새 메시지 버튼

바로 전송 SMS 작업 통합

다음은 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 클래스 사용 요구사항을 대체합니다.

자동차 메신저 디버깅

자동차 메신저 디버깅에 관한 자세한 내용은 다음 섹션을 참고하세요.

블루투스 연결 디버깅

  1. dumpsys 명령어를 실행합니다.

    adb shell dumpsys bluetooth_manager
    
    • dumsys 명령어 결과에서 MapClientService를 검색합니다.
     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
SMS 메시지만 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
SMS 전송 메시지만 adb shell content query--uri content://sms/sent
SMS 받은편지함만 adb shell content query--uri content://sms/conversations/inbox
MMS 메시지 부분 1
(1을 MMS ID로 대체)
adb shell content query--uri content://mms/part/1

자동차 메신저 및 음성 어시스턴트 쿼리 디버깅

빌드 이미지가 enguserdebug면 기본적으로 출력을 기록합니다. eng나 userdebug가 아닌 경우 자동차 메신저의 로깅을 사용 설정하려면 다음을 실행하세요.

  1. 관련 태그 adb shell setprop log.tag.<TAG> DEBUG를 실행합니다.

  2. 미리 로드된 어시스턴트 로깅을 사용 설정합니다.

  3. 재현 가능성이 높은 버그의 경우 Android 스튜디오에서 중단점을 사용하는 것이 좋습니다.