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şaretleAction
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.
- Uygulamanız bir mesaj alır.
- Uygulamanız, yanıtı ve bildirimleri içeren bir
MessagingStyle
bildirim oluştururAction
nesne okundu olarak işaretle. - Android Auto, Android sisteminden "yeni bildirim" etkinliğini alır
MessagingStyle
, yanıtAction
ve okundu olarak işaretleAction
işlemlerini bulur. - Android Auto, arabada bir bildirim oluşturur ve gösterir.
- 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.
- 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:
- Ü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() } }
- 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 birRemoteInput
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 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