Oprócz podstawowej funkcji obsługi wiadomości opartej na powiadomieniach, która umożliwia odczytywanie wiadomości i odpowiadanie na nie, Android Auto obsługuje bardziej zaawansowane funkcje obsługi wiadomości stworzone za pomocą biblioteki aplikacji Android for Cars.
Obsługa funkcji przesyłania wiadomości opartej na powiadomieniach
Wszystkie aplikacje, które obsługują wiadomości oparte na szablonach, muszą też rozszerzać powiadomienia o wiadomościach w Androidzie Auto. Ta integracja umożliwia użytkownikom czytanie wiadomości i odpowiadanie na nie bez konieczności otwierania aplikacji opartej na szablonie.
Tworzenie wiadomości na podstawie szablonu
Aby rozpocząć tworzenie aplikacji z użyciem szablonów, postępuj zgodnie z instrukcjami w artykułach Korzystanie z biblioteki aplikacji Android do samochodu i Dodawanie obsługi Androida Auto do aplikacji z użyciem szablonów. Następnie zapoznaj się ze wskazówkami na tej stronie, aby poznać konkretne wymagania dotyczące aplikacji do przesyłania wiadomości z szablonami.
Konfigurowanie plików manifestu aplikacji
Aby poinformować Androida Auto o możliwościach aplikacji, musi ona wykonać te czynności:
Deklarowanie obsługi kategorii w pliku manifestu
Aplikacja musi zadeklarować androidx.car.app.category.MESSAGING kategorię aplikacji samochodowej w filtrze intencji w pliku CarAppService.
<application>
...
<service
...
android:name=".MyCarAppService"
android:exported="true">
<intent-filter>
<action android:name="androidx.car.app.CarAppService" />
<category android:name="androidx.car.app.category.MESSAGING"/>
</intent-filter>
</service>
...
<application>
<category>
Ustawianie minimalnego poziomu interfejsu API aplikacji samochodowej
Interfejs ConversationItem API jest obsługiwany tylko w przypadku Car API 7 lub nowszego, dlatego w metadanych minCarApiLevel należy ustawić tę wartość. Więcej informacji znajdziesz w artykule Poziom interfejsu Car App API.
<application ...>
...
<meta-data
android:name="androidx.car.app.minCarApiLevel"
android:value="7"/>
...
</application>
Deklarowanie obsługi Androida Auto
W automotive_app_desc.xml pliku, którego używasz do deklarowania obsługi Androida Auto, sprawdź, czy zadeklarowane są obie te funkcje: notification i template:
<automotiveApp>
<uses name="notification" />
<uses name="template" />
</automotiveApp>
Jeśli aplikację można ustawić jako domyślną aplikację do obsługi SMS-ów, dodaj ten element <uses>. W przeciwnym razie do obsługi przychodzących wiadomości SMS/MMS będzie używany domyślny moduł obsługi wbudowany w Androida Auto, co może prowadzić do zduplikowanych powiadomień.
<automotiveApp>
...
<uses name="sms" />
</automotiveApp>
Wyświetlanie rozmów
Aby wyświetlić przegląd rozmów użytkownika, możesz wyświetlić listę obiektów ConversationItem w komponencie ListTemplate lub SectionedItemTemplate.
Aby zapewnić użytkownikom wygodę, zalecamy udostępnianie co najwyżej 5–10 najnowszych lub najważniejszych rozmów, a w przypadku każdej z nich nie więcej niż 5 najnowszych wiadomości. Pomaga to zwiększyć wydajność wczytywania, wyświetlać użytkownikom najbardziej trafne treści i skracać czas interakcji.
class MyMessagingScreen() : Screen() {
override fun onGetTemplate(): Template {
val itemListBuilder = ItemList.Builder()
val conversations: List<MyConversation> = // Retrieve conversations
for (conversation: MyConversation in conversations) {
val carMessages: List<CarMessage> = conversation.getMessages()
.map { message ->
// CarMessage supports additional fields such as MIME type and URI,
// which you should set if available
CarMessage.Builder()
.setSender(message.sender)
.setBody(message.body)
.setReceivedTimeEpochMillis(message.receivedTimeEpochMillis)
.setRead(message.isRead)
.build()
}
itemListBuilder.addItem(
ConversationItem.Builder()
.setConversationCallback { /* Implement your conversation callback logic here */ }
.setId(/* Set conversation ID */)
.setTitle(/* Set conversation title */)
.setIcon(/* Set conversation icon if available */)
.setMessages(carMessages)
/* When the sender of a CarMessage is equal to this Person,
message readout is adjusted to "you said" instead of "<person>
said" */
.setSelf(/* Set self-sender */)
.setGroupConversation(/* Set if the message contains more than 2 participants */)
.build()
)
}
return ListTemplate.Builder()
.setTitle("Conversations")
.setHeaderAction(Action.APP_ICON)
.setSingleList(itemListBuilder.build())
.build()
}
}
Każda ConversationItem automatycznie wyświetla działania związane z odtwarzaniem wiadomości, oznaczaniem jej jako przeczytanej i odpowiadaniem na nią. Te działania są obsługiwane przez ConversationCallbackDelegate, który podajesz podczas tworzenia ConversationItem.
Jeśli Twoja aplikacja udostępnia skróty do rozmów, sprawdź, czy identyfikator podany podczas tworzenia elementu ConversationItem jest taki sam jak identyfikator skrótu do tej rozmowy.
Aktualizowanie wątków
Gdy użytkownicy wysyłają i odbierają wiadomości, odświeżaj ekrany aplikacji, aby uwzględniać nowe wiadomości, wywołując funkcję invalidate(). Zobacz Odświeżanie zawartości szablonu.
Z myślą o wygodzie użytkowników zalecamy, aby czas odświeżania nie przekraczał 500 milisekund. Jeśli częste odświeżanie trwa dłużej, możesz wyświetlać stan ładowania podczas wczytywania przychodzących wiadomości.
Odpowiednio ustaw ważność powiadomień
Aby ograniczyć rozpraszanie uwagi, aplikacja powinna obniżać ważność przychodzących powiadomień, gdy użytkownik korzysta z odpowiedniej rozmowy lub ją wyświetla, tak aby powiadomienia nie pojawiały się jako powiadomienia wyskakujące.
Możesz śledzić, czy rozmowa jest widoczna, obserwując cykl życia elementu Screen, który ją wyświetla. Zobacz Cykl życia ekranu.
Aby powiadomienie nie wyświetlało się jako powiadomienie o wysokim priorytecie, ustaw priorytet na IMPORTANCE_DEFAULT lub niższy.
Rozpowszechnianie aplikacji do obsługi wiadomości opartych na szablonach
Aplikacje obsługujące gotowe wiadomości można publikować tylko na ścieżkach testów wewnętrznych i zamkniętych w Google Play, dlatego nie należy promować wersji, które obsługują te ścieżki, na ścieżkach testów otwartych ani produkcyjnych, ponieważ zgłoszenia zawierające wersje na tych ścieżkach zostaną odrzucone.