Build a point of interest app

This guide details the different features of the Car App Library that you can use to implement the functionality of your point of interest (POI) app.

Declare category support in your manifest

Your app needs to declare the androidx.car.app.category.POI car app category in the intent filter of its CarAppService.

The following example shows how to declare the app category:

<application>
    ...
   <service
       ...
        android:name=".MyCarAppService"
        android:exported="true">
      <intent-filter>
        <action android:name="androidx.car.app.CarAppService" />
        <category android:name="androidx.car.app.category.POI"/>
      </intent-filter>
    </service>
    ...
<application>

Access the map templates

POI apps can access the PlaceListMapTemplate and MapWithContentTemplate.

The PlaceListMapTemplate is specifically designed for showing a list of the POIs alongside a map that is rendered by the host.

The MapWithContentTemplate can be used to display lists and other types of content alongside a map that is rendered by your app. See Draw maps for more details on using this template.

To access these templates, your app needs to declare the androidx.car.app.MAP_TEMPLATES permission in its AndroidManifest.xml file:

<manifest ...>
  ...
  <uses-permission android:name="androidx.car.app.MAP_TEMPLATES"/>
  ...
</manifest>

Refresh PlaceListMapTemplate content

You can let drivers refresh content with the tap of a button while browsing lists of places built with PlaceListMapTemplate. Implement the OnContentRefreshListener interface's onContentRefreshRequested method, and use PlaceListMapTemplate.Builder.setOnContentRefreshListener to set the listener on the template to enable list refresh.

The following snippet shows how to set the listener on the template:

Kotlin

PlaceListMapTemplate.Builder()
    ...
    .setOnContentRefreshListener {
        // Execute any desired logic
        ...
        // Then call invalidate() so onGetTemplate() is called again
        invalidate()
    }
    .build()

Java

new PlaceListMapTemplate.Builder()
        ...
        .setOnContentRefreshListener(() -> {
            // Execute any desired logic
            ...
            // Then call invalidate() so onGetTemplate() is called again
            invalidate();
        })
        .build();

The refresh button is only shown in the header of the PlaceListMapTemplate if the listener has a value.

When the user clicks the refresh button, the onContentRefreshRequested method of your OnContentRefreshListener implementation is called. Within onContentRefreshRequested, call the Screen.invalidate method. The host then calls back into your app’s Screen.onGetTemplate method to retrieve the template with the refreshed content. See Refresh the contents of a template for more information about refreshing templates. As long as the next template returned by onGetTemplate is of the same type, it is counted as a refresh and does not count toward the template quota.

Integrate with Google Assistant using App Actions

Voice-enable your POI app using Assistant to allow users to search for points of interest by asking things like, "Hey Google, find nearby charging stations on ExampleApp". For detailed instructions, see App Actions for Cars.