Android Auto için mesajlaşma uygulamaları geliştirme

İletişim kategorisi yakında kullanıma sunulacak
Mesajlaşma kategorisi, mesaj geçmişi ve arama deneyimleri gibi yeni özellikleri destekleyecek şekilde genişletiliyor.

Mesajlar üzerinden iletişim kurmak birçok sürücü için önemlidir. Chat uygulamaları, kullanıcıların adlı çocuğun alınması gerekip gerekmediğini veya yemek mekanının değişip değişmediğini öğrenebilir. Android çerçevesi, mesajlaşma uygulamalarının hizmetlerini sürüş deneyimine entegre etmeye yönelik standart bir kullanıcı arayüzü kullanarak yardımcı oluyor.

Mesajlaşmayı destekleyen uygulamalar, mesajlaşma bildirimlerini genişleterek Android Auto'nun otomatik çalışır. Bu bildirimler Otomatik modda gösterilir ve kullanıcıların Burada, mesajları tutarlı, dikkat dağıtıcı bir arayüzde okuyup yanıtlayabilirsiniz. ve MessagingStyle API sayesinde tüm Android cihazlar için optimize edilmiş mesaj bildirimleri alırsınız. Android Auto da dahil olmak üzere cihazlar. Optimizasyonlar şunun için özel bir kullanıcı arayüzü içerir: ileti bildirimleri, iyileştirilmiş animasyonlar ve satır içi resim desteği.

Bu kılavuzda, kullanıcılara mesaj gösteren bir uygulamanın nasıl genişletileceğini ve Kullanıcının yanıtlarını (ör. bir sohbet uygulaması) alarak el mesajı görüntüleme ve yanıt makbuzunu otomatik cihaza gönderebilir. İlgili tasarım rehberliği için Mesajlaşma uygulamalar sitesini ziyaret edin.

Başlayın

Auto cihazlarına mesajlaşma hizmeti sağlamak için uygulamanızın şunu beyan etmesi gerekir: manifest'te Android Auto için destek sunabilir ve aşağıdakileri yapabilirler:

  • Derleme ve gönderme NotificationCompat.MessagingStyle yanıt ve okundu olarak işaretle Action nesneleri içeren nesneler.
  • Service kullanarak yanıtlama ve okundu olarak işaretleme işlemlerini yapma.

Kavramlar ve nesneler

Uygulamanızı tasarlamaya başlamadan önce Android Auto'nun nasıl çalıştığını anlamanız yararlı olacaktır ve mesajları yönetir.

Bağımsız bir iletişim parçası mesaj olarak adlandırılır ve MessagingStyle.Message sınıfı. Bir iletide gönderen, ileti içeriği ve mesajın gönderildiği zamanı gösterir.

Kullanıcılar arasındaki iletişim görüşme olarak adlandırılır ve MessagingStyle nesne. Bir görüşmenin veya MessagingStyle, başlık, ve görüşmenin bir kullanıcı grubu arasında olup olmadığı gibi bilgileri içerebilir.

Uygulamalar, bir görüşmede yapılan güncellemeleri (ör. yeni bir mesaj) kullanıcılara bildirmek için Android sistemine Notification. Bu Notification, mesajlaşmaya özgü bilgileri görüntülemek için MessagingStyle nesnesini kullanır Bildirim gölgesindeki kullanıcı arayüzü. Android platformu da bu Notification boyunca geçer Android Auto'ya aktarılır, MessagingStyle ayıklanır ve bir arabanın ekranından bildirim gönderebilirsiniz.

Android Auto, uygulamaların şunu da yapmak için Notification öğesine Action nesne eklemesini de gerektirir: kullanıcının bir iletiyi hızla yanıtlamasını veya doğrudan şuradan okundu olarak işaretlemesini sağlar: bildirim gölgesi.

Özet olarak, tek bir ileti dizisi Notification ile temsil edilir MessagingStyle nesnesiyle stilize edilen nesne. MessagingStyle söz konusu ileti dizisindeki bir veya daha fazla ileti dizisindeki tüm iletileri içerir MessagingStyle.Message nesne. Android Auto ile uyumlu olması için de Notification öğesine yanıt ve okundu olarak işaretle Action nesneleri eklemelidir.

Mesajlaşma akışı

Bu bölümde, uygulamanız ve Android Auto arasındaki tipik bir mesajlaşma akışı açıklanmaktadır.

  1. Uygulamanız bir mesaj alır.
  2. Uygulamanız, yanıtı ve bildirimleri içeren bir MessagingStyle bildirim oluşturur Action nesne okundu olarak işaretle.
  3. Android Auto, Android sisteminden "yeni bildirim" etkinliğini alır MessagingStyle, yanıt Action ve okundu olarak işaretle Action işlemlerini bulur.
  4. Android Auto, arabada bir bildirim oluşturur ve gösterir.
  5. Kullanıcı, araba ekranındaki bildirime dokunursa Android Auto okundu olarak işaretleme Action özelliğini tetikler.
    • Arka planda, uygulamanız bu okundu olarak işaretleme etkinliğini işlemelidir.
  6. Kullanıcı, bildirime ses kullanarak yanıt verirse Android Auto, Kullanıcının yanıtının metni (Action) ve ardından onu tetikler.
    • Uygulamanız, arka planda bu yanıt etkinliğini işlemelidir.

Ön varsayımlar

Bu sayfa, bir mesajlaşma uygulamasının tamamını oluşturma konusunda size yol göstermez. İlgili içeriği oluşturmak için kullanılan Aşağıdaki kod örneği, uygulamanızın ihtiyaç duyduğu özelliklerden bazılarını içerir Android Auto ile mesajlaşmayı desteklemeye başlamadan önce:

data class YourAppConversation(
        val id: Int,
        val title: String,
        val recipients: MutableList<YourAppUser>,
        val icon: Bitmap) {
    companion object {
        /** Fetches [YourAppConversation] by its [id]. */
        fun getById(id: Int): YourAppConversation = // ...
    }

    /** Replies to this conversation with the given [message]. */
    fun reply(message: String) {}

    /** Marks this conversation as read. */
    fun markAsRead() {}

    /** Retrieves all unread messages from this conversation. */
    fun getUnreadMessages(): List<YourAppMessage> { return /* ... */ }
}
data class YourAppUser(val id: Int, val name: String, val icon: Uri)
data class YourAppMessage(
    val id: Int,
    val sender: YourAppUser,
    val body: String,
    val timeReceived: Long)

Android Auto desteğini beyan etme

Android Auto bir mesajlaşma uygulamasından bildirim aldığında, Uygulama Android Auto'yu desteklediğini beyan etmişse. Bu desteği etkinleştirmek için şunları ekleyin: Uygulamanızın manifest dosyasında aşağıdaki girişe yer verin:

<application>
    ...
    <meta-data
        android:name="com.google.android.gms.car.application"
        android:resource="@xml/automotive_app_desc"/>
    ...
</application>

Bu manifest girişi, şu yolu izleyin: YourAppProject/app/src/main/res/xml/automotive_app_desc.xml. automotive_app_desc.xml içinde uygulamanızın Android Auto özelliklerini beyan edin destekler. Örneğin, bildirimlere yönelik destek beyan etmek için takip etmek için:

<automotiveApp>
    <uses name="notification" />
</automotiveApp>

Uygulamanız varsayılan SMS işleyici olarak ayarlanabiliyorsa aşağıdaki <uses> öğesini eklediğinizden emin olun. Aksi takdirde, varsayılan Android Auto'da yerleşik olarak bulunan işleyici, gelen SMS/MMS mesajlarını işlemek için kullanılır uygulamanız varsayılan SMS işleyici olarak ayarlandığında bildirimleri etkinleştirebilirsiniz.

<automotiveApp>
    ...
    <uses name="sms" />
</automotiveApp>

AndroidX temel kitaplığını içe aktarma

Auto cihazlarla kullanılacak bildirimler oluşturmak için şu gereklidir: AndroidX temel kitaplığı. Kitaplığı şu şekilde çalışır:

  1. Üst düzey build.gradle dosyasına Google'ın Maven dosyasına bir bağımlılık ekleyin depoyu temsil eder:

Eski

allprojects {
    repositories {
        google()
    }
}

Kotlin

allprojects {
    repositories {
        google()
    }
}
  1. Uygulama modülünüzün build.gradle dosyasına AndroidX Core'u ekleyin. kitaplık bağımlılığı vardır:

Eski

dependencies {
    // If your app is written in Java
    implementation 'androidx.core:core:1.13.1'

    // If your app is written in Kotlin
    implementation 'androidx.core:core-ktx:1.13.1'
}

Kotlin

dependencies {
    // If your app is written in Java
    implementation("androidx.core:core:1.13.1")

    // If your app is written in Kotlin
    implementation("androidx.core:core-ktx:1.13.1")
}

Kullanıcı işlemlerini işleme

Mesajlaşma uygulamanızda bir görüşmeyi güncellemek için Action Android Auto için uygulamanızda iki tür Action nesnesi var yanıtlaması gereken işlemler: yanıtlama ve okundu olarak işaretleme. Bunları kullanırken IntentService, potansiyel olarak pahalı olanları yönetme esnekliği çağrılarının arka planda olmasını sağlayarak uygulamanızın ana iş parçacığını serbest bırakır.

Amaç işlemlerini tanımlayın

Intent işlemleri, Intent işlevinin neyle ilgili olduğunu tanımlayan basit dizelerdir. Tek bir hizmet birden fazla amaç türünü işleyebildiğinden birden çok işlem dizesi tanımlamak yerine birden çok işlem dizesi tanımlamak IntentService bileşen

Bu kılavuzun örnek mesajlaşma uygulamasında zorunlu iki işlem türü vardır: yanıt ve okundu olarak işaretle, aşağıdaki kod örneğinde gösterildiği gibi.

private const val ACTION_REPLY = "com.example.REPLY"
private const val ACTION_MARK_AS_READ = "com.example.MARK_AS_READ"

Hizmeti oluşturma

Bu Action nesneleri işleyen bir hizmet oluşturmak için görüşme kimliğine ihtiyacınız vardır. Bu, uygulamanızın tanımladığı rastgele bir veri yapısıdır. tercih edebilirsiniz. Ayrıca, daha ayrıntılı değineceğiz. Aşağıdaki kod örneği bir hizmet oluşturur şu adımları izleyin:

private const val EXTRA_CONVERSATION_ID_KEY = "conversation_id"
private const val REMOTE_INPUT_RESULT_KEY = "reply_input"

/**
 * An [IntentService] that handles reply and mark-as-read actions for
 * [YourAppConversation]s.
 */
class MessagingService : IntentService("MessagingService") {
    override fun onHandleIntent(intent: Intent?) {
        // Fetches internal data.
        val conversationId = intent!!.getIntExtra(EXTRA_CONVERSATION_ID_KEY, -1)

        // Searches the database for that conversation.
        val conversation = YourAppConversation.getById(conversationId)

        // Handles the action that was requested in the intent. The TODOs
        // are addressed in a later section.
        when (intent.action) {
            ACTION_REPLY -> TODO()
            ACTION_MARK_AS_READ -> TODO()
        }
    }
}

Bu hizmeti uygulamanızla ilişkilendirmek için ayrıca hizmeti kaydetmeniz gerekir uygulamanızın manifest dosyasına eklemeniz gerekir:

<application>
    <service android:name="com.example.MessagingService" />
    ...
</application>

Amaçları oluşturma ve işleme

Android Auto da dahil olmak üzere diğer uygulamalar Intent iznini alamaz Intent diğer uygulamalara iletildiğinden MessagingService işlemini tetikler. PendingIntent üzerinden. Bunun nedeni: bir RemoteInput oluşturmanız gerekir. diğer uygulamaların, gösterildiği gibi yanıt metnini uygulamanıza geri göndermesine izin veren nesne aşağıdaki örnekte:

/**
 * Creates a [RemoteInput] that lets remote apps provide a response string
 * to the underlying [Intent] within a [PendingIntent].
 */
fun createReplyRemoteInput(context: Context): RemoteInput {
    // RemoteInput.Builder accepts a single parameter: the key to use to store
    // the response in.
    return RemoteInput.Builder(REMOTE_INPUT_RESULT_KEY).build()
    // Note that the RemoteInput has no knowledge of the conversation. This is
    // because the data for the RemoteInput is bound to the reply Intent using
    // static methods in the RemoteInput class.
}

/** Creates an [Intent] that handles replying to the given [appConversation]. */
fun createReplyIntent(
        context: Context, appConversation: YourAppConversation): Intent {
    // Creates the intent backed by the MessagingService.
    val intent = Intent(context, MessagingService::class.java)

    // Lets the MessagingService know this is a reply request.
    intent.action = ACTION_REPLY

    // Provides the ID of the conversation that the reply applies to.
    intent.putExtra(EXTRA_CONVERSATION_ID_KEY, appConversation.id)

    return intent
}

MessagingService içindeki ACTION_REPLY Switch ifadesinde, şu şekilde gösterildiği gibi Intent yanıtına giden bilgileri ayıklayın: şu örneği inceleyin:

ACTION_REPLY -> {
    // Extracts reply response from the intent using the same key that the
    // RemoteInput uses.
    val results: Bundle = RemoteInput.getResultsFromIntent(intent)
    val message = results.getString(REMOTE_INPUT_RESULT_KEY)

    // This conversation object comes from the MessagingService.
    conversation.reply(message)
}

Okundu olarak işaretleme Intent özelliğini benzer şekilde ele alırsınız. Ancak şunu yapmaz: bir RemoteInput gerektirir:

/** Creates an [Intent] that handles marking the [appConversation] as read. */
fun createMarkAsReadIntent(
        context: Context, appConversation: YourAppConversation): Intent {
    val intent = Intent(context, MessagingService::class.java)
    intent.action = ACTION_MARK_AS_READ
    intent.putExtra(EXTRA_CONVERSATION_ID_KEY, appConversation.id)
    return intent
}

MessagingService içindeki ACTION_MARK_AS_READ değiştirme ifadesi aşağıdaki örnekte gösterildiği gibi başka bir mantık gerektirmez:

// Marking as read has no other logic.
ACTION_MARK_AS_READ -> conversation.markAsRead()

Kullanıcılara mesajları bildirme

Konuşmadaki işlemlerin ele alınması tamamlandıktan sonra, sıradaki adım Android Auto ile uyumlu bildirimler oluşturabilirsiniz.

İşlem oluştur

Aşağıdaki işlemler için Notification kullanılarak Action nesne diğer uygulamalara geçirilebilir: yöntemleri orijinal uygulamada işlemesini sağlar. Android Auto, bir öğeyi okunduğu veya yanıtlandığı anlamına gelir.

Action oluşturmak için Intent ile başlayın. Aşağıdaki örnekte şunlar gösterilmektedir: "yanıt" nasıl oluşturulur Intent:

fun createReplyAction(
        context: Context, appConversation: YourAppConversation): Action {
    val replyIntent: Intent = createReplyIntent(context, appConversation)
    // ...

Ardından, bu Intent öğesini bir PendingIntent içine sarmalayarak harici kullanıma hazır hale getirin. görebilirsiniz. PendingIntent, sarmalanmış Intent öğesine erişimi şu şekilde kilitler: yalnızca alıcı uygulamanın Intent veya kaynak uygulamanın paket adını alın. Harici uygulama temel Intent öğesine veya içindeki verilere hiçbir zaman erişemez.

    // ...
    val replyPendingIntent = PendingIntent.getService(
        context,
        createReplyId(appConversation), // Method explained later.
        replyIntent,
        PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_MUTABLE)
    // ...

Action yanıtını ayarlamadan önce Android Auto'da üç tane olduğunu unutmayın Action yanıtı için şartlar:

  • Anlamsal işlem Action.SEMANTIC_ACTION_REPLY olarak ayarlanmalıdır.
  • Action, etkinleştiğinde hiçbir kullanıcı arayüzünü göstermeyeceğini belirtmelidir.
  • Action, tek bir RemoteInput içermelidir.

Aşağıdaki kod örneğinde,Action Yukarıda listelenen şartlar:

    // ...
    val replyAction = Action.Builder(R.drawable.reply, "Reply", replyPendingIntent)
        // Provides context to what firing the Action does.
        .setSemanticAction(Action.SEMANTIC_ACTION_REPLY)

        // The action doesn't show any UI, as required by Android Auto.
        .setShowsUserInterface(false)

        // Don't forget the reply RemoteInput. Android Auto will use this to
        // make a system call that will add the response string into
        // the reply intent so it can be extracted by the messaging app.
        .addRemoteInput(createReplyRemoteInput(context))
        .build()

    return replyAction
}

Okundu olarak işaretle işleminin işlenmesi benzerdir ancak RemoteInput yoktur. Dolayısıyla Android Auto'nun okundu olarak işaretleme Action özelliği için iki gereksinimi vardır:

  • Anlamsal işlem Action.SEMANTIC_ACTION_MARK_AS_READ olarak ayarlandı.
  • Bu işlem, etkinleştiğinde herhangi bir kullanıcı arayüzünü göstermeyeceğini belirtir.

Aşağıdaki kod örneği, şunları ele alan bir okundu olarak işaretleme Action oluşturur: koşullar:

fun createMarkAsReadAction(
        context: Context, appConversation: YourAppConversation): Action {
    val markAsReadIntent = createMarkAsReadIntent(context, appConversation)
    val markAsReadPendingIntent = PendingIntent.getService(
            context,
            createMarkAsReadId(appConversation), // Method explained below.
            markAsReadIntent,
            PendingIntent.FLAG_UPDATE_CURRENT  or PendingIntent.FLAG_IMMUTABLE)
    val markAsReadAction = Action.Builder(
            R.drawable.mark_as_read, "Mark as Read", markAsReadPendingIntent)
        .setSemanticAction(Action.SEMANTIC_ACTION_MARK_AS_READ)
        .setShowsUserInterface(false)
        .build()
    return markAsReadAction
}

Beklemedeki amaçlar oluşturulurken iki yöntem kullanılır: createReplyId() ve createMarkAsReadId(). Bu yöntemler Her PendingIntent için Android tarafından kontrol amacıyla kullanılan kodlar mevcut beklemedeki niyetler. create() yöntemleri her ileti dizisi için benzersiz kimlikler döndürür, ancak aynı ileti dizisi, önceden oluşturulmuş benzersiz kimliği döndürmelidir.

A ve B olmak üzere iki ileti dizisi içeren bir örneği ele alalım: A İleti Dizisi'nin yanıt kimliği 100, ve okundu olarak işaretleme kimliği 101'dir. B Görüşmesinin yanıt kimliği: 102 ve okundu olarak işaretleme kimliği 103'tür. A ileti dizisi güncellenirse yanıt ve okundu olarak işaretleme kimlikleri hâlâ 100 ve 101'dir. Daha fazla bilgi için bkz. PendingIntent.FLAG_UPDATE_CURRENT.

MessagingStyle Oluşturma

MessagingStyle, mesajlaşma bilgilerinin operatörüdür ve Android Otomatik modu, bir görüşmedeki her mesajı sesli okumak için kullanır.

Öncelikle, cihazın kullanıcısı aşağıda gösterildiği gibi Person nesnesi şu örneği inceleyin:

fun createMessagingStyle(
        context: Context, appConversation: YourAppConversation): MessagingStyle {
    // Method defined by the messaging app.
    val appDeviceUser: YourAppUser = getAppDeviceUser()

    val devicePerson = Person.Builder()
        // The display name (also the name that's read aloud in Android auto).
        .setName(appDeviceUser.name)

        // The icon to show in the notification shade in the system UI (outside
        // of Android Auto).
        .setIcon(appDeviceUser.icon)

        // A unique key in case there are multiple people in this conversation with
        // the same name.
        .setKey(appDeviceUser.id)
        .build()
    // ...

Daha sonra, MessagingStyle nesnesini oluşturabilir ve bazı ayrıntılar sağlayabilirsiniz. tercih edebilirsiniz.

    // ...
    val messagingStyle = MessagingStyle(devicePerson)

    // Sets the conversation title. If the app's target version is lower
    // than P, this will automatically mark the conversation as a group (to
    // maintain backward compatibility). Use `setGroupConversation` after
    // setting the conversation title to explicitly override this behavior. See
    // the documentation for more information.
    messagingStyle.setConversationTitle(appConversation.title)

    // Group conversation means there is more than 1 recipient, so set it as such.
    messagingStyle.setGroupConversation(appConversation.recipients.size > 1)
    // ...

Son olarak, okunmamış iletileri ekleyin.

    // ...
    for (appMessage in appConversation.getUnreadMessages()) {
        // The sender is also represented using a Person object.
        val senderPerson = Person.Builder()
            .setName(appMessage.sender.name)
            .setIcon(appMessage.sender.icon)
            .setKey(appMessage.sender.id)
            .build()

        // Adds the message. More complex messages, like images,
        // can be created and added by instantiating the MessagingStyle.Message
        // class directly. See documentation for details.
        messagingStyle.addMessage(
                appMessage.body, appMessage.timeReceived, senderPerson)
    }

    return messagingStyle
}

Bildirimi paketleme ve aktarma

Action ve MessagingStyle nesnelerini oluşturduktan sonra şunları yapabilirsiniz: Notification öğesini oluşturalım.

fun notify(context: Context, appConversation: YourAppConversation) {
    // Creates the actions and MessagingStyle.
    val replyAction = createReplyAction(context, appConversation)
    val markAsReadAction = createMarkAsReadAction(context, appConversation)
    val messagingStyle = createMessagingStyle(context, appConversation)

    // Creates the notification.
    val notification = NotificationCompat.Builder(context, channel)
        // A required field for the Android UI.
        .setSmallIcon(R.drawable.notification_icon)

        // Shows in Android Auto as the conversation image.
        .setLargeIcon(appConversation.icon)

        // Adds MessagingStyle.
        .setStyle(messagingStyle)

        // Adds reply action.
        .addAction(replyAction)

        // Makes the mark-as-read action invisible, so it doesn't appear
        // in the Android UI but the app satisfies Android Auto's
        // mark-as-read Action requirement. Both required actions can be made
        // visible or invisible; it is a stylistic choice.
        .addInvisibleAction(markAsReadAction)

        .build()

    // Posts the notification for the user to see.
    val notificationManagerCompat = NotificationManagerCompat.from(context)
    notificationManagerCompat.notify(appConversation.id, notification)
}

Ek kaynaklar

Android Auto Messaging sorunu bildirme

Android Auto için mesajlaşma uygulamanızı geliştirirken bir sorunla karşılaşırsanız bu durumu Google Sorun Takip Aracı. Sorun şablonuna istenen tüm bilgileri girdiğinizden emin olun.

Yeni sayı oluştur

Yeni bir sorun oluşturmadan önce, bu sorunun sorunlarda zaten bildirilip bildirilmediğini kontrol edin liste'ye dokunun. Şu sayılarda bir sayı için yıldızı tıklayarak abone olabilir ve sayılara oy verebilirsiniz: takip edebilirsiniz. Daha fazla bilgi için bkz. Bir Soruna abone olma