{"id":50991,"date":"2024-03-08T09:02:21","date_gmt":"2024-03-08T08:02:21","guid":{"rendered":"https:\/\/www.inovex.de\/?p=50991"},"modified":"2024-08-19T16:30:47","modified_gmt":"2024-08-19T14:30:47","slug":"how-to-add-android-auto-functionality-to-your-existing-app","status":"publish","type":"post","link":"https:\/\/www.inovex.de\/de\/blog\/how-to-add-android-auto-functionality-to-your-existing-app\/","title":{"rendered":"How to Add Android Auto Functionality to Your Existing App"},"content":{"rendered":"<p>This article discusses <a title=\"Android Automotive OS: Was ist das &amp; wie funktioniert es?\" href=\"https:\/\/www.inovex.de\/de\/blog\/android-automotive-os\/\" rel=\"\">Android Automotive<\/a> \/ Auto and provides guidance on implementing Android Auto support in an existing app.<!--more--><\/p>\n<p>In the past(\u2122), not so long ago, the only purpose of connecting your smartphone to your car was to stream music via Bluetooth. Fortunately, this has changed more and more in recent years. It is now commonplace to connect your phone to your car, and Android Auto or Apple CarPlay offer much more than just music playback.<\/p>\n<p>Have an appointment in your calendar and set the location? Get in the car and the software will most likely already know what the address of your destination will already be in the navigation system.<\/p>\n<p>The popularity of this support continues to grow. Whether it is in the automotive sector or simple consumer applications, we see that this is an area that is growing as well.<\/p>\n<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_79_2 counter-hierarchy ez-toc-counter ez-toc-custom ez-toc-container-direction\">\n<div class=\"ez-toc-title-container\"><p class=\"ez-toc-title\" style=\"cursor:inherit\"><\/p>\n<\/div><nav><ul class='ez-toc-list ez-toc-list-level-1 ' ><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/www.inovex.de\/de\/blog\/how-to-add-android-auto-functionality-to-your-existing-app\/#Terminology\" >Terminology<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/www.inovex.de\/de\/blog\/how-to-add-android-auto-functionality-to-your-existing-app\/#Android\" >Android<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/www.inovex.de\/de\/blog\/how-to-add-android-auto-functionality-to-your-existing-app\/#Android-Auto\" >Android Auto<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/www.inovex.de\/de\/blog\/how-to-add-android-auto-functionality-to-your-existing-app\/#Android-Automotive\" >Android Automotive<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-5\" href=\"https:\/\/www.inovex.de\/de\/blog\/how-to-add-android-auto-functionality-to-your-existing-app\/#Starting-point\" >Starting point<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-6\" href=\"https:\/\/www.inovex.de\/de\/blog\/how-to-add-android-auto-functionality-to-your-existing-app\/#Implementation\" >Implementation<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-7\" href=\"https:\/\/www.inovex.de\/de\/blog\/how-to-add-android-auto-functionality-to-your-existing-app\/#Prerequisites\" >Prerequisites<\/a><ul class='ez-toc-list-level-4' ><li class='ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-8\" href=\"https:\/\/www.inovex.de\/de\/blog\/how-to-add-android-auto-functionality-to-your-existing-app\/#Add-dependency\" >Add dependency<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-9\" href=\"https:\/\/www.inovex.de\/de\/blog\/how-to-add-android-auto-functionality-to-your-existing-app\/#AndroidManifestxml\" >AndroidManifest.xml<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-10\" href=\"https:\/\/www.inovex.de\/de\/blog\/how-to-add-android-auto-functionality-to-your-existing-app\/#Service\" >Service<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-11\" href=\"https:\/\/www.inovex.de\/de\/blog\/how-to-add-android-auto-functionality-to-your-existing-app\/#Session\" >Session<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-12\" href=\"https:\/\/www.inovex.de\/de\/blog\/how-to-add-android-auto-functionality-to-your-existing-app\/#Summary\" >Summary<\/a><\/li><\/ul><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-13\" href=\"https:\/\/www.inovex.de\/de\/blog\/how-to-add-android-auto-functionality-to-your-existing-app\/#Screens-and-UI\" >Screens and UI<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-14\" href=\"https:\/\/www.inovex.de\/de\/blog\/how-to-add-android-auto-functionality-to-your-existing-app\/#The-first-screen\" >The first screen<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-15\" href=\"https:\/\/www.inovex.de\/de\/blog\/how-to-add-android-auto-functionality-to-your-existing-app\/#Deployment\" >Deployment<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-16\" href=\"https:\/\/www.inovex.de\/de\/blog\/how-to-add-android-auto-functionality-to-your-existing-app\/#More-functionality\" >More functionality<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-17\" href=\"https:\/\/www.inovex.de\/de\/blog\/how-to-add-android-auto-functionality-to-your-existing-app\/#PlaceListTemplate\" >PlaceListTemplate<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-18\" href=\"https:\/\/www.inovex.de\/de\/blog\/how-to-add-android-auto-functionality-to-your-existing-app\/#PaneTemplate\" >PaneTemplate<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-19\" href=\"https:\/\/www.inovex.de\/de\/blog\/how-to-add-android-auto-functionality-to-your-existing-app\/#Summary-2\" >Summary<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-20\" href=\"https:\/\/www.inovex.de\/de\/blog\/how-to-add-android-auto-functionality-to-your-existing-app\/#References\" >References<\/a><\/li><\/ul><\/li><\/ul><\/nav><\/div>\n<h2><span class=\"ez-toc-section\" id=\"Terminology\"><\/span>Terminology<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Android? Android Auto? Android Automotive? It\u2019s the same right?<\/p>\n<h1><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-50992 aligncenter\" title=\"\" src=\"https:\/\/www.inovex.de\/wp-content\/uploads\/imgmeme-300x261.png\" alt=\"\" width=\"355\" height=\"309\" srcset=\"https:\/\/www.inovex.de\/wp-content\/uploads\/imgmeme-300x261.png 300w, https:\/\/www.inovex.de\/wp-content\/uploads\/imgmeme-400x348.png 400w, https:\/\/www.inovex.de\/wp-content\/uploads\/imgmeme-360x314.png 360w, https:\/\/www.inovex.de\/wp-content\/uploads\/imgmeme.png 528w\" sizes=\"auto, (max-width: 355px) 100vw, 355px\" \/><\/h1>\n<h3><span class=\"ez-toc-section\" id=\"Android\"><\/span>Android<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>Android is an operating system and software platform for mobile devices, including smartphones, tablet computers, televisions, media players, netbooks, and cars. It was developed by the Open Handset Alliance, founded by Google, and is based on a Linux kernel.<\/p>\n<h3><span class=\"ez-toc-section\" id=\"Android-Auto\"><\/span>Android Auto<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>Android Auto is a feature that allows you to \u201cproject\u201c your smartphone onto your car&#8217;s display. It requires a connected smartphone.<br \/>\nThe smartphone handles the rendering of the UI, while the car&#8217;s hardware forwards user input, such as buttons or touch events, to the phone.<\/p>\n<p><strong>Example<\/strong>: The car from company XYZ has its own operating system and navigation system, despite offering this interface.<\/p>\n<h3><span class=\"ez-toc-section\" id=\"Android-Automotive\"><\/span>Android Automotive<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>The car&#8217;s embedded operating system is based on Android, and we develop standalone applications for this platform.<\/p>\n<p><strong>Example<\/strong>: Polestar utilizes Android as the operating system for its cars, rather than developing its own.<\/p>\n<p>As mentioned earlier, we will focus on Android Auto support and show how to add Android Auto features to an existing app.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"Starting-point\"><\/span>Starting point<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"size-medium wp-image-50996 aligncenter\" title=\"\" src=\"https:\/\/www.inovex.de\/wp-content\/uploads\/sc_mobile1-142x300.png\" alt=\"\" width=\"142\" height=\"300\" srcset=\"https:\/\/www.inovex.de\/wp-content\/uploads\/sc_mobile1-142x300.png 142w, https:\/\/www.inovex.de\/wp-content\/uploads\/sc_mobile1-486x1024.png 486w, https:\/\/www.inovex.de\/wp-content\/uploads\/sc_mobile1-768x1618.png 768w, https:\/\/www.inovex.de\/wp-content\/uploads\/sc_mobile1-729x1536.png 729w, https:\/\/www.inovex.de\/wp-content\/uploads\/sc_mobile1-972x2048.png 972w, https:\/\/www.inovex.de\/wp-content\/uploads\/sc_mobile1-400x843.png 400w, https:\/\/www.inovex.de\/wp-content\/uploads\/sc_mobile1-360x758.png 360w, https:\/\/www.inovex.de\/wp-content\/uploads\/sc_mobile1.png 1216w\" sizes=\"auto, (max-width: 142px) 100vw, 142px\" \/><\/p>\n<p>We will use an application we have already built to query the <a href=\"https:\/\/photon.komoot.io\/\" target=\"_blank\" rel=\"noopener\">photon.komoot.io<\/a> API for points of interest in our area. If we find a place interesting, we can open it in Google Maps. The app is sufficient for our needs.<\/p>\n<p>The app&#8217;s source code is available but we will not be examining the mobile component. Our objective is to provide a small benefit to our app users while they are driving.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"Implementation\"><\/span>Implementation<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Let\u2019s get started. What is the minimum requirement to open our app on a smartphone while driving?<\/p>\n<h3><span class=\"ez-toc-section\" id=\"Prerequisites\"><\/span>Prerequisites<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>To inform the system that our application is car-compatible, we must first complete the following steps.<\/p>\n<h4><span class=\"ez-toc-section\" id=\"Add-dependency\"><\/span>Add dependency<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p>In the code base available at <a href=\"https:\/\/github.com\/inovex\/blog-android-car-finder\">GitHub<\/a> we use the <a href=\"https:\/\/developer.android.com\/build\/migrate-to-catalogs\" target=\"_blank\" rel=\"noopener\">Gradle Version Catalog<\/a>, but let\u2019s keep it simple here.<\/p>\n<p><code>implementation(\"androidx.car.app:app:1.2.0\")<\/code><\/p>\n<h4><span class=\"ez-toc-section\" id=\"AndroidManifestxml\"><\/span>AndroidManifest.xml<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p>We provide the system with the necessary information to indicate that it is ready for use in a car. We declare the POI category for our application.<\/p>\n<blockquote><p>An app that provides functionality relevant to finding points of interest, such as parking, charging stations, and gas stations.<\/p>\n<p>We will also add permission here that will be necessary for implementing the PlaceListTemplate.<\/p><\/blockquote>\n<pre class=\"lang:xml decode:true\" title=\"AndroidManifest.xml\">&lt;uses-permission android:name=\"androidx.car.app.MAP_TEMPLATES\" \/&gt;\r\n\r\n&lt;application\r\n...\r\n   &lt;meta-data\r\n       android:name=\"com.google.android.gms.car.application\"\r\n       android:resource=\"@xml\/car_desc\" \/&gt;\r\n\r\n   &lt;meta-data\r\n       android:name=\"androidx.car.app.minCarApiLevel\"\r\n       android:value=\"1\" \/&gt;\r\n\r\n   &lt;service\r\n       android:name=\".data.car.CarService\"\r\n       android:exported=\"true\"&gt;\r\n       &lt;intent-filter&gt;\r\n           &lt;action android:name=\"androidx.car.app.CarAppService\" \/&gt;\r\n           &lt;category android:name=\"androidx.car.app.category.POI\" \/&gt;\r\n       &lt;\/intent-filter&gt;\r\n   &lt;\/service&gt;\r\n&lt;\/application&gt;<\/pre>\n<h4><span class=\"ez-toc-section\" id=\"Service\"><\/span>Service<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p>To be recognized by the host as a corresponding application, we must add a CarAppService.<\/p>\n<pre class=\"lang:default decode:true\" title=\"CarService.kt\">class CarService : CarAppService() {\r\n   override fun createHostValidator(): HostValidator {\r\n       return HostValidator.ALLOW_ALL_HOSTS_VALIDATOR\r\n   }\r\n\r\n   override fun onCreateSession(): Session {\r\n       return CarSession()\r\n   }\r\n}\r\n<\/pre>\n<p><code>CarAppService<\/code> is an abstract service class that your application must implement and export in order to be discovered and managed by the host.<\/p>\n<p>CarAppService now expects us to return a session.<\/p>\n<h4><span class=\"ez-toc-section\" id=\"Session\"><\/span>Session<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<pre class=\"lang:kotlin decode:true\" title=\"CarSession.kt\">class CarSession : Session() {\r\n   override fun onCreateScreen(intent: Intent): Screen {\r\n       return MainScreen(carContext)\r\n   }\r\n}\r\n<\/pre>\n<p>The Session class is an abstract class that your app must implement and return using <code>CarAppService.onCreateSession<\/code>. It is the starting point for displaying information on the car screen and manages the lifecycle.<\/p>\n<p>The host requests the initial screen to display using the <code>onCreateScreen<\/code> method when a Session is started, such as when the app is first launched.<\/p>\n<p>Session expects us to return a screen&#8230;<\/p>\n<h4><span class=\"ez-toc-section\" id=\"Summary\"><\/span>Summary<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p>To summarize, there are three code blocks.<\/p>\n<p>We added some information to the AndroidManifest and created a CarAppService to inform the host that we can provide a certain functionality via the corresponding session.<\/p>\n<p>The session manages the app&#8217;s lifecycle. We use onCreateScreen to specify the desired screen.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"Screens-and-UI\"><\/span>Screens and UI<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>The Screen class in the context of Android Auto is provided by the library for managing the user interface presented to the user.<\/p>\n<h3><span class=\"ez-toc-section\" id=\"The-first-screen\"><\/span>The first screen<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-51005\" title=\"\" src=\"https:\/\/www.inovex.de\/wp-content\/uploads\/screenshot0-300x189.png\" alt=\"\" width=\"300\" height=\"189\" srcset=\"https:\/\/www.inovex.de\/wp-content\/uploads\/screenshot0-300x189.png 300w, https:\/\/www.inovex.de\/wp-content\/uploads\/screenshot0-1024x644.png 1024w, https:\/\/www.inovex.de\/wp-content\/uploads\/screenshot0-768x483.png 768w, https:\/\/www.inovex.de\/wp-content\/uploads\/screenshot0-400x251.png 400w, https:\/\/www.inovex.de\/wp-content\/uploads\/screenshot0-360x226.png 360w, https:\/\/www.inovex.de\/wp-content\/uploads\/screenshot0.png 1042w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/p>\n<p>Unlike mobile device development, where we can create the UI ourselves using Compose or XML, Android Auto development requires the use of predefined templates from the library. This is a restriction due to safety regulations.<br \/>\nWe will begin with the <code>MainScreen<\/code> and a <code>GridTemplate<\/code>, which will serve as the main menu.<\/p>\n<pre class=\"lang:kotlin decode:true \" title=\"MainScreen.kt - our first UI element\">class MainScreen(carContext: CarContext) : Screen(carContext) {\r\n\r\n   override fun onGetTemplate(): Template {\r\n       val searchItem = GridItem.Builder()\r\n           .setTitle(\"Search\")\r\n           .build()\r\n       val iceCream = GridItem.Builder()\r\n           .setTitle(\"Get Ice Cream\")\r\n           .build()\r\n\r\n       val itemList = ItemList.Builder().addItem(searchItem).addItem(iceCream)\r\n       return GridTemplate.Builder()\r\n           .setTitle(\"Hello!\")\r\n           .setLoading(false)\r\n           .setSingleList(itemList.build())\r\n           .build()\r\n   }\r\n  \r\n}\r\n<\/pre>\n<p>In the Android Auto context, screens always follow a consistent structure. A template is provided and displayed by the system. In this screen, we use one of the templates (GridTemplate) provided by the Car Library to display a simple menu.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"Deployment\"><\/span>Deployment<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Now that we understand how the system works, how do we install it in our car?<br \/>\nLuckily, there is a desktop head unit emulator available for testing, so there is no need to install the app on your phone and walk to your car.<\/p>\n<p>Please refer to the <a href=\"https:\/\/developer.android.com\/training\/cars\/testing\/dhu\">official documentation<\/a> for more information.<\/p>\n<p>In a nutshell: To install the app, we install it as usual on our smartphone, which is connected to our laptop via USB. Route a port accordingly via adb and then start the head unit emulator.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"More-functionality\"><\/span>More functionality<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>We will now examine two more templates to add some more functionality.<\/p>\n<h3><span class=\"ez-toc-section\" id=\"PlaceListTemplate\"><\/span>PlaceListTemplate<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>The PlaceListMapTemplate is utilized to display a list of places along with an accompanying map and markers.<\/p>\n<p>This template functions precisely as its name suggests. Let&#8217;s take a look at some code.<\/p>\n<pre class=\"lang:default decode:true\" title=\"PlaceListMapScreen.kt\">class PlaceListMapScreen(carContext: CarContext) : Screen(carContext), KoinComponent {\r\n   init {\r\n       loadResults()\r\n   }\r\n\r\n   private fun loadResults() {\r\n       \/\/ Get Location and data from API\r\n       \/\/ Set uiState Variable by result\r\n       uiState = ListUiState(pois = listOf(poi1, poi2))\r\n\r\n       \/\/ Requests the current template to be invalidated, which eventually\r\n       \/\/ triggers a call to onGetTemplate to get the new template to display.\r\n       invalidate()\r\n   }\r\n\r\n   override fun onGetTemplate(): Template {\r\n       \/\/ check for loading and error state\r\n\r\n       val builder = PlaceListMapTemplate.Builder()\r\n           .setTitle(carContext.getString(R.string.app_name))\r\n           .setHeaderAction(Action.BACK)\r\n           .setCurrentLocationEnabled(true)\r\n\r\n       \/\/ Add items\r\n       val itemListBuilder = ItemList.Builder()\r\n       uiState.pois.forEach {\r\n           val item = buildPOIItem(it) { poi -&gt;\r\n               \/\/ onClick\r\n           }\r\n           itemListBuilder.addItem(item)\r\n       }\r\n       builder.setItemList(itemListBuilder.build())\r\n       return builder.build()\r\n   }\r\n\r\n   private fun buildPOIItem(poi: POI, clickListener: (poi: POI) -&gt; Unit): Row {\r\n       val place = Place.Builder(\r\n           CarLocation.create(poi.long, poi.lat)\r\n       ).setMarker(\r\n           PlaceMarker.Builder()\r\n               .setColor(CarColor.BLUE).build()\r\n       ).build()\r\n\r\n       val metadata = Metadata.Builder().setPlace(place).build()\r\n\r\n       return Row.Builder()\r\n           .setTitle(poi.name)\r\n           .setMetadata(metadata)\r\n           .setBrowsable(true)\r\n           .setOnClickListener {\r\n               clickListener(poi)\r\n           }\r\n           .addText(poi.address)\r\n           .build()\r\n   }\r\n}\r\n<\/pre>\n<p>For illustrative purposes, the code is shortened to focus on building the UI.<\/p>\n<p>Upon screen initiation, data is loaded from the API. A marker is built on the map and a row displays the results for each data point.<br \/>\n<img loading=\"lazy\" decoding=\"async\" class=\"size-medium wp-image-51011 aligncenter\" title=\"\" src=\"https:\/\/www.inovex.de\/wp-content\/uploads\/screenshotcarlist-300x190.png\" alt=\"\" width=\"300\" height=\"190\" srcset=\"https:\/\/www.inovex.de\/wp-content\/uploads\/screenshotcarlist-300x190.png 300w, https:\/\/www.inovex.de\/wp-content\/uploads\/screenshotcarlist-768x486.png 768w, https:\/\/www.inovex.de\/wp-content\/uploads\/screenshotcarlist-400x253.png 400w, https:\/\/www.inovex.de\/wp-content\/uploads\/screenshotcarlist-360x228.png 360w, https:\/\/www.inovex.de\/wp-content\/uploads\/screenshotcarlist.png 956w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/p>\n<p>To round things off, we want to add the functionality of a POI detail view and launch navigation.<\/p>\n<p>We could now start the navigation directly by clicking on the respective item &#8230;<\/p>\n<pre class=\"lang:default decode:true \" title=\"OnClickListener\">return Row.Builder()\r\n    .setOnClickListener {\r\n        val intent = Intent().apply {\r\n            action = CarContext.ACTION_NAVIGATE\r\n            data = Uri.parse(\"geo:${poi.long},${poi.lat}\")\r\n        }\r\n        carContext.startCarApp(intent)\r\n    }\r\n.setTitle(poi.name)\r\n...<\/pre>\n<p>Sending the system a corresponding intent can accomplish this task easily. The system has already implemented this action for us. Additionally, there is another template available that allows for a deeper exploration of the UI.<\/p>\n<h3><span class=\"ez-toc-section\" id=\"PaneTemplate\"><\/span>PaneTemplate<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>In theory, we could use different templates in a screen by returning a specific template in onGetTemplate based on user interaction. However, this may not improve readability in our case.<\/p>\n<p>We will therefore take a look at the <code>PaneTemplate<\/code> implemented on a second screen.<\/p>\n<p>What is a <code>Pane<\/code>?<\/p>\n<p>Well, it simply represents a list of rows used to display informational content and a set of actions that users can perform based on that content.<\/p>\n<pre class=\"lang:default decode:true \" title=\"DetailPaneScreen.kt\">class DetailPaneScreen(carContext: CarContext, val poi: POI) : Screen(carContext), KoinComponent {\r\n\r\n   override fun onGetTemplate(): Template {\r\n       val navigationAction =\r\n           Action.Builder()\r\n               .setTitle(\"Navigation\")\r\n               .setOnClickListener {\r\n                   \/\/ Start Navigation\r\n               }.build()\r\n\r\n       val backAction = Action.Builder()\r\n           .setTitle(\"Back\")\r\n           .setOnClickListener {\r\n               \/\/ go back\r\n           }.build()\r\n\r\n       val row = Row.Builder()\r\n           .setTitle(poi.name)\r\n           .addText(poi.address)\r\n           .addText(poi.location)\r\n           .setImage(CarIcon.APP_ICON)\r\n           .build()\r\n\r\n       return PaneTemplate.Builder(\r\n           Pane.Builder()\r\n               .addRow(row)\r\n               .addAction(navigationAction)\r\n               .addAction(backAction)\r\n               .build()\r\n       )\r\n           .setTitle(\"Details\")\r\n           .setHeaderAction(Action.BACK)\r\n           .build()\r\n   }\r\n}\r\n<\/pre>\n<p>The code shown is minimally summarized, but it clearly shows how simple it is to achieve our goal so far.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"size-medium wp-image-51013 aligncenter\" title=\"\" src=\"https:\/\/www.inovex.de\/wp-content\/uploads\/screenshot2-300x188.png\" alt=\"\" width=\"300\" height=\"188\" srcset=\"https:\/\/www.inovex.de\/wp-content\/uploads\/screenshot2-300x188.png 300w, https:\/\/www.inovex.de\/wp-content\/uploads\/screenshot2-1024x643.png 1024w, https:\/\/www.inovex.de\/wp-content\/uploads\/screenshot2-768x482.png 768w, https:\/\/www.inovex.de\/wp-content\/uploads\/screenshot2-400x251.png 400w, https:\/\/www.inovex.de\/wp-content\/uploads\/screenshot2-360x226.png 360w, https:\/\/www.inovex.de\/wp-content\/uploads\/screenshot2.png 1040w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/p>\n<p>Our template includes a simple UI with text and two actions. action and a simple back action.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"Summary-2\"><\/span>Summary<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>This post explains how to add Android Auto functionality to an existing app. It covers various templates with different purposes and discusses the platform&#8217;s restrictions and benefits.<\/p>\n<p>It is important to note that Android Auto and <a title=\"Android Automotive OS\" href=\"https:\/\/www.inovex.de\/de\/leistungen\/embedded-systems\/android-automotive-os\/\" rel=\"\">Android Automotive apps<\/a> differ significantly, as previously mentioned.<\/p>\n<p>The source code with added functionality, including a search function and basic error handling, is available on <a href=\"https:\/\/github.com\/inovex\/blog-android-car-finder\">GitHub<\/a>.<\/p>\n<p>If you require assistance with Android automotive apps or are interested in working on such projects, feel free to contact us.<\/p>\n<h3><span class=\"ez-toc-section\" id=\"References\"><\/span>References<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p><a href=\"https:\/\/developers.google.com\/cars\/design\/design-foundations\">https:\/\/developers.google.com\/cars\/design\/design-foundations<\/a><\/p>\n<p><a href=\"https:\/\/developer.android.com\/training\/cars\">https:\/\/developer.android.com\/training\/cars<\/a><\/p>\n<p><a href=\"https:\/\/source.android.com\/docs\/automotive\/start\/terms\">https:\/\/source.android.com\/docs\/automotive\/start\/terms<\/a><\/p>\n<p><a href=\"https:\/\/github.com\/inovex\/blog-android-car-finder\">https:\/\/github.com\/inovex\/blog-android-car-finder<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>This article discusses Android Automotive \/ Auto and provides guidance on implementing Android Auto support in an existing app.<\/p>\n","protected":false},"author":56,"featured_media":52262,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"ep_exclude_from_search":false,"footnotes":""},"tags":[149,510],"service":[420],"coauthors":[{"id":56,"display_name":"Christopher Jakob","user_nicename":"cjakob"}],"class_list":["post-50991","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","tag-android","tag-apps-2","service-apps"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v26.5 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>How to Add Android Auto Functionality to Your Existing App - inovex GmbH<\/title>\n<meta name=\"description\" content=\"Android Auto? Android Automotive? We aim to explore the integration of Android Auto functionality into our existing app.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.inovex.de\/de\/blog\/how-to-add-android-auto-functionality-to-your-existing-app\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"How to Add Android Auto Functionality to Your Existing App - inovex GmbH\" \/>\n<meta property=\"og:description\" content=\"Android Auto? Android Automotive? We aim to explore the integration of Android Auto functionality into our existing app.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.inovex.de\/de\/blog\/how-to-add-android-auto-functionality-to-your-existing-app\/\" \/>\n<meta property=\"og:site_name\" content=\"inovex GmbH\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/inovexde\" \/>\n<meta property=\"article:published_time\" content=\"2024-03-08T08:02:21+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-08-19T14:30:47+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.inovex.de\/wp-content\/uploads\/Android_Auto_v1.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1500\" \/>\n\t<meta property=\"og:image:height\" content=\"880\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Christopher Jakob\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:image\" content=\"https:\/\/www.inovex.de\/wp-content\/uploads\/Android_Auto_v1-1024x601.png\" \/>\n<meta name=\"twitter:creator\" content=\"@inovexgmbh\" \/>\n<meta name=\"twitter:site\" content=\"@inovexgmbh\" \/>\n<meta name=\"twitter:label1\" content=\"Verfasst von\" \/>\n\t<meta name=\"twitter:data1\" content=\"Christopher Jakob\" \/>\n\t<meta name=\"twitter:label2\" content=\"Gesch\u00e4tzte Lesezeit\" \/>\n\t<meta name=\"twitter:data2\" content=\"8\u00a0Minuten\" \/>\n\t<meta name=\"twitter:label3\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data3\" content=\"Christopher Jakob\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.inovex.de\/de\/blog\/how-to-add-android-auto-functionality-to-your-existing-app\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.inovex.de\/de\/blog\/how-to-add-android-auto-functionality-to-your-existing-app\/\"},\"author\":{\"name\":\"Christopher Jakob\",\"@id\":\"https:\/\/www.inovex.de\/de\/#\/schema\/person\/c266a0abd8422c5cabc881b84740beba\"},\"headline\":\"How to Add Android Auto Functionality to Your Existing App\",\"datePublished\":\"2024-03-08T08:02:21+00:00\",\"dateModified\":\"2024-08-19T14:30:47+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.inovex.de\/de\/blog\/how-to-add-android-auto-functionality-to-your-existing-app\/\"},\"wordCount\":1265,\"commentCount\":2,\"publisher\":{\"@id\":\"https:\/\/www.inovex.de\/de\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.inovex.de\/de\/blog\/how-to-add-android-auto-functionality-to-your-existing-app\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.inovex.de\/wp-content\/uploads\/Android_Auto_v1.png\",\"keywords\":[\"Android\",\"Apps\"],\"articleSection\":[\"Applications\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.inovex.de\/de\/blog\/how-to-add-android-auto-functionality-to-your-existing-app\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.inovex.de\/de\/blog\/how-to-add-android-auto-functionality-to-your-existing-app\/\",\"url\":\"https:\/\/www.inovex.de\/de\/blog\/how-to-add-android-auto-functionality-to-your-existing-app\/\",\"name\":\"How to Add Android Auto Functionality to Your Existing App - inovex GmbH\",\"isPartOf\":{\"@id\":\"https:\/\/www.inovex.de\/de\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.inovex.de\/de\/blog\/how-to-add-android-auto-functionality-to-your-existing-app\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.inovex.de\/de\/blog\/how-to-add-android-auto-functionality-to-your-existing-app\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.inovex.de\/wp-content\/uploads\/Android_Auto_v1.png\",\"datePublished\":\"2024-03-08T08:02:21+00:00\",\"dateModified\":\"2024-08-19T14:30:47+00:00\",\"description\":\"Android Auto? Android Automotive? We aim to explore the integration of Android Auto functionality into our existing app.\",\"breadcrumb\":{\"@id\":\"https:\/\/www.inovex.de\/de\/blog\/how-to-add-android-auto-functionality-to-your-existing-app\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.inovex.de\/de\/blog\/how-to-add-android-auto-functionality-to-your-existing-app\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\/\/www.inovex.de\/de\/blog\/how-to-add-android-auto-functionality-to-your-existing-app\/#primaryimage\",\"url\":\"https:\/\/www.inovex.de\/wp-content\/uploads\/Android_Auto_v1.png\",\"contentUrl\":\"https:\/\/www.inovex.de\/wp-content\/uploads\/Android_Auto_v1.png\",\"width\":1500,\"height\":880,\"caption\":\"Grafik zum Thema Android Auto: Ein Lenkrad, daneben ein Navigationssystem und daneben ein Smartphone, dass ein Signal sendet.\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.inovex.de\/de\/blog\/how-to-add-android-auto-functionality-to-your-existing-app\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.inovex.de\/de\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"How to Add Android Auto Functionality to Your Existing App\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.inovex.de\/de\/#website\",\"url\":\"https:\/\/www.inovex.de\/de\/\",\"name\":\"inovex GmbH\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\/\/www.inovex.de\/de\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.inovex.de\/de\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"de\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.inovex.de\/de\/#organization\",\"name\":\"inovex GmbH\",\"url\":\"https:\/\/www.inovex.de\/de\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\/\/www.inovex.de\/de\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.inovex.de\/wp-content\/uploads\/2021\/03\/inovex-logo-16-9-1.png\",\"contentUrl\":\"https:\/\/www.inovex.de\/wp-content\/uploads\/2021\/03\/inovex-logo-16-9-1.png\",\"width\":1921,\"height\":1081,\"caption\":\"inovex GmbH\"},\"image\":{\"@id\":\"https:\/\/www.inovex.de\/de\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/inovexde\",\"https:\/\/x.com\/inovexgmbh\",\"https:\/\/www.instagram.com\/inovexlife\/\",\"https:\/\/www.linkedin.com\/company\/inovex\",\"https:\/\/www.youtube.com\/channel\/UC7r66GT14hROB_RQsQBAQUQ\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.inovex.de\/de\/#\/schema\/person\/c266a0abd8422c5cabc881b84740beba\",\"name\":\"Christopher Jakob\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\/\/www.inovex.de\/de\/#\/schema\/person\/image\/1410dc23bb681b59bd0017eb27d50541\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/3d0f657dd7efee2b54cd0e7793e61f2eac1b93735fc6614e1c172c5135075e1e?s=96&d=retro&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/3d0f657dd7efee2b54cd0e7793e61f2eac1b93735fc6614e1c172c5135075e1e?s=96&d=retro&r=g\",\"caption\":\"Christopher Jakob\"},\"url\":\"https:\/\/www.inovex.de\/de\/blog\/author\/cjakob\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"How to Add Android Auto Functionality to Your Existing App - inovex GmbH","description":"Android Auto? Android Automotive? We aim to explore the integration of Android Auto functionality into our existing app.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.inovex.de\/de\/blog\/how-to-add-android-auto-functionality-to-your-existing-app\/","og_locale":"de_DE","og_type":"article","og_title":"How to Add Android Auto Functionality to Your Existing App - inovex GmbH","og_description":"Android Auto? Android Automotive? We aim to explore the integration of Android Auto functionality into our existing app.","og_url":"https:\/\/www.inovex.de\/de\/blog\/how-to-add-android-auto-functionality-to-your-existing-app\/","og_site_name":"inovex GmbH","article_publisher":"https:\/\/www.facebook.com\/inovexde","article_published_time":"2024-03-08T08:02:21+00:00","article_modified_time":"2024-08-19T14:30:47+00:00","og_image":[{"width":1500,"height":880,"url":"https:\/\/www.inovex.de\/wp-content\/uploads\/Android_Auto_v1.png","type":"image\/png"}],"author":"Christopher Jakob","twitter_card":"summary_large_image","twitter_image":"https:\/\/www.inovex.de\/wp-content\/uploads\/Android_Auto_v1-1024x601.png","twitter_creator":"@inovexgmbh","twitter_site":"@inovexgmbh","twitter_misc":{"Verfasst von":"Christopher Jakob","Gesch\u00e4tzte Lesezeit":"8\u00a0Minuten","Written by":"Christopher Jakob"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.inovex.de\/de\/blog\/how-to-add-android-auto-functionality-to-your-existing-app\/#article","isPartOf":{"@id":"https:\/\/www.inovex.de\/de\/blog\/how-to-add-android-auto-functionality-to-your-existing-app\/"},"author":{"name":"Christopher Jakob","@id":"https:\/\/www.inovex.de\/de\/#\/schema\/person\/c266a0abd8422c5cabc881b84740beba"},"headline":"How to Add Android Auto Functionality to Your Existing App","datePublished":"2024-03-08T08:02:21+00:00","dateModified":"2024-08-19T14:30:47+00:00","mainEntityOfPage":{"@id":"https:\/\/www.inovex.de\/de\/blog\/how-to-add-android-auto-functionality-to-your-existing-app\/"},"wordCount":1265,"commentCount":2,"publisher":{"@id":"https:\/\/www.inovex.de\/de\/#organization"},"image":{"@id":"https:\/\/www.inovex.de\/de\/blog\/how-to-add-android-auto-functionality-to-your-existing-app\/#primaryimage"},"thumbnailUrl":"https:\/\/www.inovex.de\/wp-content\/uploads\/Android_Auto_v1.png","keywords":["Android","Apps"],"articleSection":["Applications"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.inovex.de\/de\/blog\/how-to-add-android-auto-functionality-to-your-existing-app\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.inovex.de\/de\/blog\/how-to-add-android-auto-functionality-to-your-existing-app\/","url":"https:\/\/www.inovex.de\/de\/blog\/how-to-add-android-auto-functionality-to-your-existing-app\/","name":"How to Add Android Auto Functionality to Your Existing App - inovex GmbH","isPartOf":{"@id":"https:\/\/www.inovex.de\/de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.inovex.de\/de\/blog\/how-to-add-android-auto-functionality-to-your-existing-app\/#primaryimage"},"image":{"@id":"https:\/\/www.inovex.de\/de\/blog\/how-to-add-android-auto-functionality-to-your-existing-app\/#primaryimage"},"thumbnailUrl":"https:\/\/www.inovex.de\/wp-content\/uploads\/Android_Auto_v1.png","datePublished":"2024-03-08T08:02:21+00:00","dateModified":"2024-08-19T14:30:47+00:00","description":"Android Auto? Android Automotive? We aim to explore the integration of Android Auto functionality into our existing app.","breadcrumb":{"@id":"https:\/\/www.inovex.de\/de\/blog\/how-to-add-android-auto-functionality-to-your-existing-app\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.inovex.de\/de\/blog\/how-to-add-android-auto-functionality-to-your-existing-app\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/www.inovex.de\/de\/blog\/how-to-add-android-auto-functionality-to-your-existing-app\/#primaryimage","url":"https:\/\/www.inovex.de\/wp-content\/uploads\/Android_Auto_v1.png","contentUrl":"https:\/\/www.inovex.de\/wp-content\/uploads\/Android_Auto_v1.png","width":1500,"height":880,"caption":"Grafik zum Thema Android Auto: Ein Lenkrad, daneben ein Navigationssystem und daneben ein Smartphone, dass ein Signal sendet."},{"@type":"BreadcrumbList","@id":"https:\/\/www.inovex.de\/de\/blog\/how-to-add-android-auto-functionality-to-your-existing-app\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.inovex.de\/de\/"},{"@type":"ListItem","position":2,"name":"How to Add Android Auto Functionality to Your Existing App"}]},{"@type":"WebSite","@id":"https:\/\/www.inovex.de\/de\/#website","url":"https:\/\/www.inovex.de\/de\/","name":"inovex GmbH","description":"","publisher":{"@id":"https:\/\/www.inovex.de\/de\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.inovex.de\/de\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"de"},{"@type":"Organization","@id":"https:\/\/www.inovex.de\/de\/#organization","name":"inovex GmbH","url":"https:\/\/www.inovex.de\/de\/","logo":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/www.inovex.de\/de\/#\/schema\/logo\/image\/","url":"https:\/\/www.inovex.de\/wp-content\/uploads\/2021\/03\/inovex-logo-16-9-1.png","contentUrl":"https:\/\/www.inovex.de\/wp-content\/uploads\/2021\/03\/inovex-logo-16-9-1.png","width":1921,"height":1081,"caption":"inovex GmbH"},"image":{"@id":"https:\/\/www.inovex.de\/de\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/inovexde","https:\/\/x.com\/inovexgmbh","https:\/\/www.instagram.com\/inovexlife\/","https:\/\/www.linkedin.com\/company\/inovex","https:\/\/www.youtube.com\/channel\/UC7r66GT14hROB_RQsQBAQUQ"]},{"@type":"Person","@id":"https:\/\/www.inovex.de\/de\/#\/schema\/person\/c266a0abd8422c5cabc881b84740beba","name":"Christopher Jakob","image":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/www.inovex.de\/de\/#\/schema\/person\/image\/1410dc23bb681b59bd0017eb27d50541","url":"https:\/\/secure.gravatar.com\/avatar\/3d0f657dd7efee2b54cd0e7793e61f2eac1b93735fc6614e1c172c5135075e1e?s=96&d=retro&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/3d0f657dd7efee2b54cd0e7793e61f2eac1b93735fc6614e1c172c5135075e1e?s=96&d=retro&r=g","caption":"Christopher Jakob"},"url":"https:\/\/www.inovex.de\/de\/blog\/author\/cjakob\/"}]}},"_links":{"self":[{"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/posts\/50991","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/users\/56"}],"replies":[{"embeddable":true,"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/comments?post=50991"}],"version-history":[{"count":5,"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/posts\/50991\/revisions"}],"predecessor-version":[{"id":57409,"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/posts\/50991\/revisions\/57409"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/media\/52262"}],"wp:attachment":[{"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/media?parent=50991"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/tags?post=50991"},{"taxonomy":"service","embeddable":true,"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/service?post=50991"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/coauthors?post=50991"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}