Cómo crear una app de lugares de interés

En esta sección, se detallan las diferentes funciones de la biblioteca que puedes usar a fin de implementar la funcionalidad de tu app de lugares de interés (POI).

Cómo declarar la compatibilidad de categoría en tu manifiesto

Tu app debe declarar la categoría de app para vehículos androidx.car.app.category.POI en el filtro de intents de su 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.POI"/>
      </intent-filter>
    </service>
    ...
<application>

Cómo acceder a la plantilla de mapas

Las apps pueden acceder a la PlaceListMapTemplate, específicamente diseñada para mostrar una lista de lugares de interés junto con un mapa renderizado por el host.

Para poder acceder a esta plantilla, tu app debe declarar el permiso androidx.car.app.MAP_TEMPLATES en su AndroidManifest.xml:

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

Realiza la integración con Asistente de Google mediante Acciones en apps

Acciones en apps permite que los usuarios lancen y controlen apps para Android con la voz mediante el Asistente de Google. Para integrar Asistente con apps de lugares de interés, agrega una capacidad de Acciones en apps. Las habilidades son una expresión de la función relevante de una app y contienen un intent integrado (BII) y su entrega. Por ejemplo, esto permite que los usuarios digan "Hey Google, inicia AppDeEjemplo y busca un lugar para estacionar en la calle", y tu app se puede abrir en la pantalla especial.

Limitaciones

Las Acciones en apps tienen las siguientes limitaciones:

  • Solo están disponibles para apps que usan la Biblioteca de apps para vehículos en la categoría de lugares de interés.
  • La compatibilidad por voz solo está disponible para intents integrados de Estacionamiento o Carga.
  • La entrega de Acciones en apps solo se puede hacer con vínculos directos.

Pasos para la integración

  1. Agrega el siguiente elemento <meta-data> al elemento <application> del archivo AndroidManifest.xml:

     <meta-data
         android:name="android.app.shortcuts"
         android:resource="@xml/shortcuts" />
    
  2. Para permitir que Asistente vincule al contenido de tu app con vínculos directos, necesitas un elemento <intent-filter> en el archivo AndroidManifest.xml.

    • En el caso de Android Auto, el filtro de intents es el mismo que el de la app para dispositivos móviles.

    • Para la entrega del SO Android Automotive, las Acciones en apps se activan mediante sesiones de CarAppService. Para permitir que una sesión active tu vínculo directo, debes especificar un filtro de intents en el elemento <activity> de tu archivo AndroidManifest.xml.

    <activity
      ...
      android:name="androidx.car.app.activity.CarAppActivity">
      …
      <intent-filter>
          <action android:name="android.intent.action.VIEW" />
          <category android:name="android.intent.category.DEFAULT" />
          <category android:name="android.intent.category.BROWSABLE" />
          <data
            android:scheme="YOUR_SCHEME"
            android:host="YOUR_HOST" />
      </intent-filter>
    </activity>
    
  3. Crea un archivo shortcuts.xml en el directorio res/xml del proyecto de la app con las habilidades adecuadas:

    <?xml version="1.0" encoding="utf-8"?>
    <shortcuts xmlns:android="http://schemas.android.com/apk/res/android">
      <!-- Your Capability definitions will go here -->
    </shortcuts>
    

    Consulta las secciones Habilidades que aparece a continuación para obtener información sobre las habilidades de Estacionamiento y Carga.

  4. Actualiza tu app para controlar la entrega de una sesión.

    Los siguientes son ejemplos de control de intents para Session.onCreateScreen y Session.onNewIntent.

    onCreateScreen

    Kotlin

    @Override
    fun onCreateScreen(@NonNull intent: Intent): Screen {
      if (intent.getData() != null) {
          val uri: Uri = intent.getData()
          // uri = "YOUR_SCHEME://YOUR_HOST?name=Levis%20center"
          // Build your Templates with parsed uri parameters
      ...
     }
    }
    

    Java

    @Override
    public Screen onCreateScreen(@NonNull Intent intent) {
     if (intent.getData() != null) {
       Uri uri = intent.getData();
       // uri = "YOUR_SCHEME://YOUR_HOST?name=Levis%20center"
       // Build your Templates with parsed uri parameters
      …
     }
    }
    

    onNewIntent

    Kotlin

    @Override
    fun onNewIntent(@NonNull intent: Intent): Screen {
      if (intent.getData() != null) {
          val uri: Uri = intent.getData()
          // uri = "YOUR_SCHEME://YOUR_HOST?name=Levis%20center"
          // Build your Templates with parsed uri parameters
          …
      }
    }
    

    Java

    @Override
    public void onNewIntent(@NonNull Intent intent) {
     if (intent.getData() != null) {
       Uri uri = intent.getData();
       // uri = "YOUR_SCHEME://YOUR_HOST?name=Levis%20center"
       // Build your Templates with parsed uri parameters
       …
     }
    }
    

Habilidades

Las Acciones en apps son compatibles con las siguientes capacidades:

Estacionamiento

ID de acción: actions.intent.GET_PARKING_FACILITY

Descripción: Buscar un lugar para estacionar. Se puede especificar un tipo de estacionamiento, el nombre de la app y la ubicación.

Compatibilidad con configuración regional: en-US

Parámetros:

  • parkingFacility.disambiguatingDescription: Es un descriptor para el tipo de estacionamiento (por ejemplo, "gratis", "valet" o "calle"). Con este parámetro, puedes filtrar los datos por tipo de estacionamiento.
  • Los siguientes parámetros pueden ayudarte a determinar la ubicación del estacionamiento que solicitó el usuario. Si no hay ninguno, debes mostrar las instalaciones más cercanas a la ubicación actual del usuario.
    • parkingFacility.name: Es un nombre para la ubicación de la instalación (por ejemplo, "Mountain View").
    • parkingFacility.address: Es una dirección para la ubicación de la instalación (por ejemplo, "123 Easy St, Mountain View, CA").
    • parkingFacility.geo.latitude: Es la latitud de la instalación (por ejemplo, "37.3861").
    • parkingFacility.geo.longitude: Es la longitud de la instalación (por ejemplo, "-122.084").

Definición de capability de muestra:

<?xml version="1.0" encoding="utf-8"?>
<!-- This is a sample shortcuts.xml -->
<shortcuts xmlns:android="http://schemas.android.com/apk/res/android">

  <capability android:name="actions.intent.GET_PARKING_FACILITY">
    <intent>
      <url-template
       android:value="YOUR_SCHEME://YOUR_HOST{?name,address,disambiguatingDescription,latitude,longitude}">

      <!-- Eg. name = "Googleplex" -->
      <parameter
        android:name="parkingFacility.name"
        android:key="name"/>
      <!-- Eg. address = "1600 Amphitheatre Pkwy, Mountain View, CA 94043" -->
      <parameter
        android:name="parkingFacility.address"
        android:key="address"/>
      <!-- Eg. disambiguatingDescription = "valet" -->
      <parameter
        android:name="parkingFacility.disambiguatingDescription"
        android:key="disambiguatingDescription"/>
      <!-- Eg. latitude = "37.3861" -->
      <parameter
        android:name="parkingFacility.geo.latitude"
        android:key="latitude"/>
      <!-- Eg. longitude = "-122.084" -->
      <parameter
        android:name="parkingFacility.geo.longitude"
        android:key="longitude"/>
    </intent>
  </capability>
</shortcuts>

Carga

ID de acción: actions.intent.GET_CHARGING_STATION

Descripción: Buscar una estación de carga. Puede especificar la ubicación o el nombre de una aplicación.

Compatibilidad con configuración regional: en-US

Parámetros:

  • chargingStation.disambiguatingDescription: Es un descriptor para el tipo de estación (por ejemplo, "gratis" o "pago"). Con este parámetro, puedes filtrar según el tipo de estación de carga.
  • Los siguientes parámetros pueden ayudarte a determinar la ubicación de la estación de carga que solicita el usuario. Si no hay ninguno, debes mostrar las estaciones más cercanas a la ubicación actual del usuario.
    • chargingStation.name: Es un nombre para la ubicación de la estación (por ejemplo, "Mountain View").
    • chargingStation.address: Es una dirección para la ubicación de la estación (por ejemplo, "123 Easy St, Mountain View, CA").
    • chargingStation.geo.latitude: Es la latitud de la estación (por ejemplo, "37.3861").
    • chargingStation.geo.longitude: Es la longitud de la estación (por ejemplo, "-122.084").

Definición de capability de muestra:

<?xml version="1.0" encoding="utf-8"?>
<!-- This is a sample shortcuts.xml -->
<shortcuts xmlns:android="http://schemas.android.com/apk/res/android">
  <capability android:name="actions.intent.GET_CHARGING_STATION">
    <intent>
      <url-template
       android:value="YOUR_SCHEME://YOUR_HOST{?name,address,latitude,longitude,type}">

      <!-- Eg. name = "Googleplex" -->
      <parameter
        android:name="chargingStation.name"
        android:key="name"/>
      <!-- Eg. address = "1600 Amphitheatre Pkwy, Mountain View, CA 94043" -->
      <parameter
        android:name="chargingStation.address"
        android:key="address"/>
      <!-- Eg. latitude = "37.3861" -->
      <parameter
        android:name="chargingStation.geo.latitude"
        android:key="latitude"/>
      <!-- Eg. longitude = "-122.084" -->
      <parameter
        android:name="chargingStation.geo.longitude"
        android:key="longitude"/>
    </intent>
  </capability>
</shortcuts>