El SO Android Automotive permite a los usuarios instalar apps en un vehículo. Para llegar a los usuarios en esta plataforma, debes distribuir una app optimizada para conductores que sea compatible con el SO Android Automotive. Puedes reutilizar casi todo el código y los recursos de la app de Android Auto, pero debes crear una compilación independiente que cumpla con los requisitos de esta página.
Descripción general del desarrollo
Para agregar compatibilidad con el SO Android Automotive, solo debes seguir algunos pasos, como se describe en las siguientes secciones:
- Habilita las funciones automotrices en Android Studio
- Cómo crear un módulo de Automotive
- Cómo actualizar tus dependencias de Gradle
- De forma opcional, Implementa actividades de configuración y acceso
- De forma opcional, lee las sugerencias de host multimedia.
Consideraciones del diseño
El SO Android Automotive se encarga de diseñar el contenido multimedia que recibes del servicio de navegador multimedia de tu app. Eso significa que tu app no diseña la IU y no inicia ninguna de las actividades cuando un usuario activa la reproducción de contenido multimedia.
Si estás implementando actividades de configuración o acceso, estas deberán estar optimizadas para vehículos. Cuando diseñes esas áreas de la app, consulta los lineamientos de diseño para el SO Android Automotive.
Configura tu proyecto
Debes configurar varias partes diferentes del proyecto de tu app para habilitar la compatibilidad con el SO Android Automotive.
Habilita las funciones automotrices en Android Studio
Usa Android Studio 4.0 o una versión posterior para asegurarte de que todas las funciones del SO Android Automotive estén habilitadas.
Cómo crear un módulo de Automotive
Algunos componentes del SO Android Automotive, como el manifiesto, tienen requisitos específicos de la plataforma, por lo que deberás crear un módulo que pueda mantener el código de esos componentes separado de otro código del proyecto, como el que se usa en la aplicación para teléfonos.
Sigue estos pasos para agregar un módulo de Automotive a tu proyecto:
- En Android Studio, haz clic en File > New > New Project.
- Selecciona Automotive Module y, luego, haz clic en Next.
- Proporciona la información de Application/Library name. Se trata del nombre que los usuarios ven para tu app en el SO Android Automotive.
- Proporciona un nombre de módulo en Module name.
- Ajusta el valor de Package name para que coincida con tu app.
Selecciona API 28:Android 9.0 (Pie) para Minimum SDK y, luego, haz clic en Next.
Todos los vehículos compatibles con el SO Android Automotive se ejecutan en Android 9 (nivel de API 28) o versiones posteriores. Por lo tanto, si seleccionas este valor, se orientará a todos los vehículos compatibles.
Selecciona No Activity y, luego, haz clic en Finish.
Después de crear tu módulo en Android Studio, abre el archivo AndroidManifest.xml
en tu nuevo módulo de Automotive:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.media">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme" />
<uses-feature
android:name="android.hardware.type.automotive"
android:required="true" />
</manifest>
El elemento application
tiene información estándar de la app y un elemento uses-feature
que declara compatibilidad con el SO Android Automotive. Observa que no hay actividades declaradas en el manifiesto.
Si implementas actividades de acceso o configuración, agrégalas aquí. El sistema activa estas actividades mediante intents explícitos, y esas son las únicas actividades que declaras en el manifiesto de tu app con SO Android Automotive.
Después de agregar las actividades de configuración o acceso, completa tu archivo de manifiesto configurando el atributo android:appCategory="audio"
en el elemento application
y agregando los siguientes elementos uses-feature
:
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.media"> <application android:allowBackup="true" android:appCategory="audio" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/AppTheme" /> <uses-feature android:name="android.hardware.type.automotive" android:required="true" /> <uses-feature android:name="android.hardware.wifi" android:required="false" /> <uses-feature android:name="android.hardware.screen.portrait" android:required="false" /> <uses-feature android:name="android.hardware.screen.landscape" android:required="false" /> </manifest>
Configurar de forma explícita estas funciones como required="false"
garantiza que la app no entre en conflicto con las funciones de hardware disponibles en dispositivos con el SO Android Automotive.
Declara la compatibilidad del contenido multimedia con el SO Android Automotive
Usa la siguiente entrada del manifiesto para declarar que tu app es compatible con el SO Android Automotive:
<application>
...
<meta-data android:name="com.android.automotive"
android:resource="@xml/automotive_app_desc"/>
...
</application>
Esta entrada de manifiesto hace referencia a un archivo en formato XML que declara qué capacidades de Automotive admite tu app.
Para indicar que tienes una app de música, agrega un archivo en formato XML llamado automotive_app_desc.xml
al directorio res/xml/
de tu proyecto. Incluye el siguiente contenido en este archivo:
<automotiveApp>
<uses name="media"/>
</automotiveApp>
Filtros de intents
El SO Android Automotive usa intents explícitos para activar actividades en tu app de música. No incluyas ninguna actividad que tenga filtros de intents CATEGORY_LAUNCHER
o ACTION_MAIN
en el archivo de manifiesto.
Las actividades como la que se muestra en el siguiente ejemplo suelen orientarse a un teléfono o a otro dispositivo móvil. Declara estas actividades en el módulo que compila la aplicación para teléfonos, no en el que compila tu app del SO Android Automotive.
<activity android:name=".MyActivity">
<intent-filter>
<!-- You can't use either of these intents for Android Automotive OS -->
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
<!--
In their place, you can include other intent filters for any activities
that your app needs for Android Automotive OS, such as settings or
sign-in activities.
-->
</intent-filter>
</activity>
Cómo actualizar tus dependencias de Gradle
Te recomendamos que mantengas el servicio de navegador multimedia en un módulo separado compartido entre la aplicación para teléfonos y el módulo de Automotive. Si usas este enfoque, deberás actualizar el módulo de Automotive a fin de incluir el módulo compartido, como se muestra en el siguiente fragmento:
Groovy
buildscript { ... dependencies { ... implementation project(':shared_module_name') } }
Kotlin
buildscript { ... dependencies { ... implementation(project(":shared_module_name")) } }
Implementa actividades de configuración y acceso
Además del servicio de navegación multimedia, también puedes proporcionar actividades de configuración y acceso optimizadas para vehículos en tu app del SO Android Automotive. Estas actividades te permiten proporcionar una funcionalidad de la app que no está incluida en las APIs de Android Media.
Implementa estas actividades solo si tu app del SO Android Automotive necesita permitir el acceso a los usuarios o especificar la configuración de la app. Android Auto no usa estas actividades.
Flujos de trabajo de las actividades
En el siguiente diagrama, se muestra cómo interactúa un usuario con las actividades de configuración y acceso con el SO Android Automotive:
Evita las distracciones en las actividades de acceso y configuración
Para garantizar que las actividades de acceso y configuración solo estén disponibles mientras el vehículo del usuario esté estacionado, verifica que los elementos <activity>
no incluyan el siguiente elemento <meta-data>
. Si un elemento de este tipo está presente, se rechazará la app durante la revisión.
<!-- NOT ALLOWED -->
<meta-data
android:name="distractionOptimized"
android:value="true"/>
Agrega una actividad de configuración
Puedes agregar una actividad de configuración optimizada para vehículos de modo que los usuarios puedan ajustar la configuración de la app en su vehículo. Tu actividad de configuración también puede proporcionar otros flujos de trabajo, como acceder a la cuenta de un usuario, salir de ella o cambiar de una cuenta de usuario a otra. Recuerda que una app que ejecuta el SO Android Automotive es lo único que activa esta actividad. Las apps de teléfono conectadas a Android Auto no la usan.
Declara una actividad de configuración
Debes declarar la actividad de configuración en el archivo de manifiesto de la app, como se muestra en el siguiente fragmento de código:
<application>
...
<activity android:name=".AppSettingsActivity"
android:exported="true"
android:theme="@style/SettingsActivity"
android:label="@string/app_settings_activity_title">
<intent-filter>
<action android:name="android.intent.action.APPLICATION_PREFERENCES"/>
</intent-filter>
</activity>
...
</application>
Implementa tu actividad de configuración
Cuando un usuario inicie tu app, el SO Android Automotive detectará la actividad de configuración que declaraste y mostrará una opción, como un ícono.
El usuario puede presionar o seleccionar esta opción en la pantalla de su vehículo para navegar a la actividad. El SO Android Automotive envía el intent ACTION_APPLICATION_PREFERENCES
que le indica a la app que inicie la actividad de configuración.
En el resto de esta sección, se revisará cómo adaptar el código desde la app de ejemplo de Universal Android Music Player (UAMP) para implementar una actividad de configuración en tu app.
Para comenzar, descarga el código de muestra:
# Clone the UAMP repositorygit clone https://github.com/android/uamp.git
# Fetch the appropriate pull request to your local repositorygit fetch origin pull/323/head:NEW_LOCAL_BRANCH_NAME
# Switch to the new branchgit checkout NEW_LOCAL_BRANCH_NAME
A los efectos de implementar tu actividad, sigue estos pasos:
- Copia la carpeta
automotive/automotive-lib
en tu módulo de Automotive. - Define un árbol de preferencias como en
automotive/src/main/res/xml/preferences.xml
. Implementa un
PreferenceFragmentCompat
que muestre tu actividad de configuración. Consulta los archivosSettingsFragment.kt
ySettingsActivity.kt
en UAMP y la guía de configuración de Android para obtener más información.
A medida que avances en la implementación de tu actividad de configuración, ten en cuenta estas prácticas recomendadas para usar algunos de los componentes de la biblioteca de Preference:
- No tengas más de dos niveles de profundidad debajo de la vista principal en la actividad de configuración.
- No uses
DropDownPreference
. Utiliza unaListPreference
en su lugar. - Componentes organizacionales:
PreferenceScreen
- Este debe ser el nivel superior del árbol de preferencias.
PreferenceCategory
- Se usa para agrupar objetos
Preference
. - Incluye un
title
.
- Se usa para agrupar objetos
- Incluye una
key
y untitle
en todos los componentes siguientes. También puedes incluir unsummary
o unicon
, o ambos:Preference
- Personaliza la lógica en la devolución de llamada
onPreferenceTreeClick()
de la implementación de tuPreferenceFragmentCompat
.
- Personaliza la lógica en la devolución de llamada
CheckBoxPreference
- Puede tener
summaryOn
osummaryOff
en lugar desummary
para el texto condicional.
- Puede tener
SwitchPreference
- Puede tener
summaryOn
osummaryOff
en lugar desummary
para el texto condicional. - Puede tener
switchTextOn
oswitchTextOff
.
- Puede tener
SeekBarPreference
- Incluye
min
,max
ydefaultValue
.
- Incluye
EditTextPreference
- Incluye
dialogTitle
,positiveButtonText
ynegativeButtonText
. - Puede tener
dialogMessage
odialogLayoutResource
.
- Incluye
com.example.android.uamp.automotive.lib.ListPreference
- Deriva, principalmente, de
ListPreference
. - Se usa para mostrar una lista de opción única de objetos de
Preference
. - Debe tener un arreglo de
entries
yentryValues
correspondientes.
- Deriva, principalmente, de
com.example.android.uamp.automotive.lib.MultiSelectListPreference
- Deriva, principalmente, de
MultiSelectListPreference
. - Se usa para mostrar una lista de opción múltiple de objetos de
Preference
. - Debe tener un arreglo de
entries
yentryValues
correspondientes.
- Deriva, principalmente, de
Agrega una actividad de acceso
Si tu app requiere que los usuarios accedan antes de usarla, puedes agregar una actividad de acceso optimizada para vehículos que controle el acceso a tu app y la salida de ella. También puedes agregar flujos de trabajo de acceso y salida a una actividad de configuración, pero deberás usar una actividad de acceso dedicada si la app no se puede usar hasta que el usuario acceda. Recuerda que una app que ejecuta el SO Android Automotive es lo único que activa esta actividad. Las apps de teléfono conectadas a Android Auto no la usan.
Solicita el acceso cuando se inicie la app
Si quieres que un usuario tenga que acceder antes de poder usar tu app, el servicio de navegador multimedia debe realizar las siguientes acciones:
- En el método
onLoadChildren()
de tu servicio, envía el resultadonull
mediante el métodosendResult()
. - Establece el
PlaybackStateCompat
de la sesión multimedia enSTATE_ERROR
mediante el métodosetState()
. De este modo, se indica al SO Android Automotive que no se podrán llevar a cabo otras operaciones hasta que se resuelva el error. - Establece el código de error
PlaybackStateCompat
de la sesión multimedia enERROR_CODE_AUTHENTICATION_EXPIRED
. De este modo, se indica al SO Android Automotive que el usuario debe autenticarse. - Establece el mensaje de error
PlaybackStateCompat
de la sesión multimedia mediante el métodosetErrorMessage()
. Como este mensaje de error se muestra al usuario, se debe localizar según la configuración regional actual correspondiente. Configura los extras
PlaybackStateCompat
de la sesión multimedia mediante el métodosetExtras()
. Incluye las siguientes dos claves:PLAYBACK_STATE_EXTRAS_KEY_ERROR_RESOLUTION_ACTION_LABEL
: Se trata de una cadena que se muestra en el botón que inicia el flujo de trabajo de acceso. Como esta cadena se muestra al usuario, se debe localizar según la configuración regional actual correspondiente.PLAYBACK_STATE_EXTRAS_KEY_ERROR_RESOLUTION_ACTION_INTENT
: Se trata de unPendingIntent
que dirige al usuario a la actividad de acceso cuando presiona el botón al que hace referenciaPLAYBACK_STATE_EXTRAS_KEY_ERROR_RESOLUTION_ACTION_LABEL
.
En el siguiente fragmento de código, se muestra cómo la app puede requerir el acceso del usuario antes de que este pueda utilizarla:
Kotlin
import androidx.media.utils.MediaConstants val signInIntent = Intent(this, SignInActivity::class.java) val signInActivityPendingIntent = PendingIntent.getActivity(this, 0, signInIntent, 0) val extras = Bundle().apply { putString( MediaConstants.PLAYBACK_STATE_EXTRAS_KEY_ERROR_RESOLUTION_ACTION_LABEL, "Sign in" ) putParcelable( MediaConstants.PLAYBACK_STATE_EXTRAS_KEY_ERROR_RESOLUTION_ACTION_INTENT, signInActivityPendingIntent ) } val playbackState = PlaybackStateCompat.Builder() .setState(PlaybackStateCompat.STATE_ERROR, 0, 0f) .setErrorMessage( PlaybackStateCompat.ERROR_CODE_AUTHENTICATION_EXPIRED, "Authentication required" ) .setExtras(extras) .build() mediaSession.setPlaybackState(playbackState)
Java
import androidx.media.utils.MediaConstants; Intent signInIntent = new Intent(this, SignInActivity.class); PendingIntent signInActivityPendingIntent = PendingIntent.getActivity(this, 0, signInIntent, 0); Bundle extras = new Bundle(); extras.putString( MediaConstants.PLAYBACK_STATE_EXTRAS_KEY_ERROR_RESOLUTION_ACTION_LABEL, "Sign in"); extras.putParcelable( MediaConstants.PLAYBACK_STATE_EXTRAS_KEY_ERROR_RESOLUTION_ACTION_INTENT, signInActivityPendingIntent); PlaybackStateCompat playbackState = new PlaybackStateCompat.Builder() .setState(PlaybackStateCompat.STATE_ERROR, 0, 0f) .setErrorMessage( PlaybackStateCompat.ERROR_CODE_AUTHENTICATION_EXPIRED, "Authentication required" ) .setExtras(extras) .build(); mediaSession.setPlaybackState(playbackState);
Después de que el usuario se autentique de forma correcta, vuelve a configurar PlaybackStateCompat
en un estado que no sea STATE_ERROR
y, luego, regresa al SO Android Automotive llamando al método finish()
de la actividad.
Implementa tu actividad de acceso
Google ofrece varias herramientas de identidad que puedes utilizar para ayudar a los usuarios a acceder a tu app en sus vehículos. Algunas herramientas, como Firebase Authentication, proporcionan herramientas de pila completa que pueden ayudar a crear experiencias de autenticación personalizadas. Otras herramientas aprovechan las credenciales existentes de los usuarios o de otras tecnologías para ayudarte a crear experiencias de acceso sin problemas para los usuarios.
Las siguientes herramientas pueden ayudarte a crear una experiencia de acceso más simple para los usuarios que hayan accedido anteriormente desde otro dispositivo:
- Acceso con One Tap y Registro: Si ya implementaste One Tap para otros dispositivos, como tu aplicación para teléfonos, impleméntalo en tu app del SO Android Automotive para admitir a los usuarios existentes de One Tap.
- Acceso con Google: Si ya implementaste el Acceso con Google para otros dispositivos, como tu aplicación para teléfonos, impleméntalo en tu app del SO Android Automotive para admitir a los usuarios existentes de Acceso con Google.
- Autocompletar con Google: Si los usuarios habilitaron Autocompletar con Google en sus otros dispositivos Android, se guardarán sus credenciales en el Administrador de contraseñas de Google. Cuando esos usuarios acceden a tu app del SO Android Automotive, la función Autocompletar con Google sugerirá las credenciales guardadas relevantes. El uso de Autocompletar con Google no requiere ningún esfuerzo de desarrollo de aplicaciones. Sin embargo, los desarrolladores de aplicaciones pueden optimizar sus apps para obtener resultados de mejor calidad. La función Autocompletar con Google es compatible con todos los dispositivos que ejecutan Android 8.0 (nivel de API 26) o versiones posteriores, incluido el SO Android Automotive.
Usa AccountManager
Las apps del SO Android Automotive que tienen autenticación deberán usar AccountManager por los siguientes motivos:
- Mejor UX y administración sencilla de cuentas: Los usuarios podrán administrar fácilmente todas sus cuentas desde el menú de cuentas en la configuración del sistema, lo que incluye el acceso y el cierre de sesión.
- Experiencias de "invitado": Los automóviles son dispositivos compartidos, lo que significa que los OEMs pueden habilitar experiencias de "invitado" en el vehículo, y no se pueden agregar cuentas. Esta restricción se logra usando
DISALLOW_MODIFY_ACCOUNTS
paraAccountManager
.
Permisos
Si necesitas solicitar permisos del usuario, usa el mismo flujo que la actividad de autenticación o la actividad de configuración en el diagrama de flujos de trabajo de la actividad que se muestra en una sección anterior.
Leer sugerencias de host de contenido multimedia
Según la aplicación del sistema (incluida su versión) que se conecte a tu servicio de navegador multimedia, es posible que tu aplicación reciba los siguientes extras:
Manejo de errores
Los errores en las apps de música del SO Android Automotive se comunican a través del PlaybackStateCompat
de la sesión multimedia. Para todos los errores, establece un código y un mensaje de error adecuados en el PlaybackStateCompat
. Eso hará que aparezca un Toast
en la IU.
Cuando ocurre un error, pero la reproducción puede continuar, emite un error recuperable. Por ejemplo, un usuario no necesitará acceder para reproducir música en una app, pero deberá hacerlo para poder omitir una canción. Cuando usas un error recuperable, el sistema puede sugerir que el usuario acceda sin interrumpir la reproducción del elemento multimedia actual.
Cuando emites un error recuperable, conserva el resto de PlaybackStateCompat
tal como está, a excepción del código y el mensaje de error. De este modo, se permitirá que la reproducción del elemento multimedia actual continúe mientras el usuario decide si accederá o no.
Cuando no sea posible la reproducción, como cuando no hay conexión a Internet ni contenido sin conexión, establece el estado PlaybackStateCompat
en STATE_ERROR
.
En las actualizaciones posteriores de tu PlaybackStateCompat
, borra los códigos y mensajes de error para evitar que se muestren varias advertencias sobre el mismo error.
Si en algún momento no puedes cargar un árbol de navegación (por ejemplo, si necesitas autenticación y el usuario no accedió), deberás enviar un árbol de navegación vacío. Para indicar esto, muestra un resultado nulo de onLoadChildren()
para el nodo multimedia raíz. Cuando esto suceda, el sistema mostrará un error de pantalla completa con el mensaje de error establecido en el PlaybackStateCompat
.
Errores de acción
Si un error es de acción, establece los dos extras siguientes en el PlaybackStateCompat
:
PLAYBACK_STATE_EXTRAS_KEY_ERROR_RESOLUTION_ACTION_LABEL
: Es una etiqueta para el botón en el que debe hacerse clic para resolver el error. Como esta cadena se muestra al usuario, se debe localizar según la configuración regional actual correspondiente.PLAYBACK_STATE_EXTRAS_KEY_ERROR_RESOLUTION_ACTION_INTENT
: Es elPendingIntent
que ejecuta el botón para resolver el error, por ejemplo, mediante el inicio de la actividad de acceso.
Los errores de acción se mostrarán como un Dialog
y los usuarios podrán resolverlos solo cuando el vehículo esté detenido.
Prueba de casos de error
Verifica que tu app maneje correctamente los errores en todas las situaciones, incluidas las siguientes:
- Niveles diferentes de tu producto: Por ejemplo, el acceso gratuito o el premium, o la sesión iniciada o sin iniciar
- Estados de conducción diferentes: Por ejemplo, estacionado o en movimiento
- Estados de conectividad diferentes: Por ejemplo, en línea o sin conexión
Otras consideraciones
Ten en cuenta estas otras consideraciones cuando desarrolles tu app para el SO Android Automotive:
Contenido sin conexión
Si corresponde, implementa la reproducción sin conexión. Se espera que los vehículos con el SO Android Automotive tengan su propia conexión de datos, lo que significa que se incluye un plan de datos en el costo del vehículo o que el usuario paga. Sin embargo, también se espera que los vehículos tengan una conectividad más variable que los dispositivos móviles.
A continuación, se incluyen algunos aspectos que debes tener en cuenta a la hora de analizar la estrategia de soporte sin conexión:
- El mejor momento para descargar contenido es mientras tu app está en uso.
- No des por sentado que la conexión Wi-Fi está disponible. Es posible que un vehículo nunca llegue a estar dentro del rango de conexión Wi-Fi o que el OEM haya inhabilitado esa conexión para priorizar una red móvil.
- Aunque está bien almacenar en caché de forma inteligente el contenido que crees que los usuarios podrían utilizar, te recomendamos que les permitas cambiar este comportamiento mediante tu actividad de configuración.
- El espacio en el disco de los vehículos varía, por lo que debes proporcionar a los usuarios una forma de borrar contenido sin conexión, por ejemplo, a través de una opción en tu actividad de configuración.
Compatibilidad con WebView
Las WebViews son compatibles con el SO Android Automotive, pero solo se permiten para las actividades de configuración y acceso. Las actividades que usan WebView deben tener una opción "cerca" o "atrás" fuera de la WebView.
A continuación, te mostramos algunos ejemplos de casos de uso aceptables para WebViews:
- Mostrar tu Política de Privacidad, las Condiciones del Servicio u otros vínculos relacionados con cuestiones legales en tu actividad de configuración
- Un flujo basado en la Web en tu actividad de acceso
Cuando usas una WebView, puedes habilitar JavaScript.
Protege tu WebView
Toma todas las precauciones posibles para asegurarte de que tu WebView no sea un punto de entrada a Internet. Consulta el fragmento de código que aparece a continuación para ver un ejemplo de cómo bloquear la WebView en la URL que se usa en la llamada a loadUrl()
y evitar los redireccionamientos. Te recomendamos implementar protecciones como esta cuando sea posible, como cuando se muestran vínculos relacionados con cuestiones legales.
Kotlin
override fun shouldOverrideUrlLoading(webView: WebView, webResourceRequest: WebResourceRequest): Boolean { val originalUri: Uri = Uri.parse(webView.originalUrl) // Check for allowed URLs if (originalUri.equals(Uri.parse(BLANK_URL)) || originalUri.equals(webResourceRequest.url)) { return false } if (webResourceRequest.isRedirect) { logger.w("Redirect detected, not following") return true } setupWizardWebViewClientListener.onUriBlocked(webResourceRequest.url) logger.w( String.format( "Navigation prevented to %s original is %s", webResourceRequest.url, originalUri)) return true }
Java
@Override public boolean shouldOverrideUrlLoading(WebView webView, WebResourceRequest webResourceRequest) { Uri originalUri = Uri.parse(webView.getOriginalUrl()); // Check for allowed URLs if (originalUri.equals(Uri.parse(BLANK_URL)) || originalUri.equals(webResourceRequest.getUrl())) { return false; } if (webResourceRequest.isRedirect()) { logger.w("Redirect detected, not following"); return true; } setupWizardWebViewClientListener.onUriBlocked(webResourceRequest.getUrl()); logger.w( String.format( "Navigation prevented to %s original is %s", webResourceRequest.getUrl(), originalUri)); return true; }
Nombres de los paquetes
Debido a que distribuyes un kit de paquete de Android (APK) independiente para el SO Android Automotive, puedes volver a usar el nombre del paquete de tu app para dispositivos móviles o crear uno nuevo. Si usas un nombre de paquete diferente, tu app tiene dos fichas de Play Store separadas. Si reutilizas el nombre actual de tu paquete, tu app tiene una sola ficha en ambas plataformas.
Esto es, en esencia, una decisión comercial. Por ejemplo, si tienes un equipo que trabaja en la app para dispositivos móviles y otro equipo separado que trabaja en tu app del SO Android Automotive, podría tener sentido tener nombres de paquetes independientes y permitir que cada uno administre su propia ficha de Play Store. No hay una gran diferencia en términos del esfuerzo técnico necesario para usar cualquiera de los enfoques.
En la siguiente tabla, se resumen algunas otras diferencias clave entre mantener tu nombre de paquete actual y usar uno nuevo:
Función | Mismo nombre de paquete | Nuevo nombre de paquete |
---|---|---|
Ficha de Play Store | Individual | Múltiples |
Instalación duplicada | Sí: "Reinstalación rápida de app" durante el asistente de configuración | No |
Proceso de revisión de Play Store | Bloqueo de revisiones: Si la revisión falla en un APK, se bloquearán otros APKs enviados de la misma versión | Revisiones individuales |
Estadísticas, métricas e indicadores esenciales | Combinado: Puedes filtrar por datos específicos de Automotive | Separado |
Indexación y clasificación en la búsqueda | Clasificación actual del punto de partida | Sin remanente |
Integración con otras apps | Lo más probable es que no se necesiten cambios, suponiendo que el código multimedia se comparte entre ambos APKs | Es posible que debas actualizar la app correspondiente, por ejemplo, para la reproducción de URI con Asistente de Google |
Preguntas frecuentes
Consulta las secciones siguientes a fin de obtener respuestas a algunas preguntas frecuentes sobre el SO Android Automotive.
Hardware
¿Mi app puede acceder al micrófono?
En las apps orientadas a Android 10 (nivel de API 29) o versiones posteriores, consulta la documentación sobre el uso compartido de entradas de audio. Esto no es posible en niveles de API inferiores a 29.
¿A qué API de vehículos podemos acceder y cómo?
Solo podrás acceder a las APIs que exponga el OEM. Se están desarrollando procesos para estandarizar la forma en que accedes a estas APIs.
Las apps pueden acceder a las APIs de vehículos con SetProperty()
y GetProperty()
en CarPropertyManager
.
Consulta el código fuente o la documentación de referencia para ver una lista de todas las propiedades disponibles. Si la propiedad está anotada con @SystemApi
, se limita a las apps del sistema precargadas.
¿Qué tipos de códecs de audio son compatibles?
Consulta la información detallada de códecs de audio en el CDD de Android.
¿Widevine DRM es compatible?
Sí. Widevine DRM es compatible.
Desarrollo y pruebas
¿Hay restricciones o recomendaciones para usar SDK y bibliotecas de terceros?
No tenemos lineamientos específicos sobre el uso de SDKs y bibliotecas de terceros. Si eliges usar bibliotecas y SDK de terceros, serás responsable de cumplir todos los requisitos de calidad de la app para vehículos.
¿Puedo usar un servicio en primer plano?
El único caso de uso permitido para un servicio en primer plano es descargar contenido para su uso sin conexión. Si tienes otro caso de uso de un servicio en primer plano para el que quieras obtener asistencia, comunícate con nosotros a través del grupo de discusión del SO Android Automotive.
Publicación de apps para el SO Android Automotive
¿Cómo publico mi app para el SO Android Automotive con Google Play Console?
El proceso de publicación de apps es similar al de una aplicación para teléfonos, pero con un factor de forma diferente. Para habilitar tu app y poder usar el factor de forma del SO Android Automotive, sigue estos pasos:
- Abre Play Console.
- Selecciona tu app.
- En el menú de la izquierda, haz clic en Versión > Configuración > Configuración avanzada > Factores de forma.
- Haz clic en Agregar factor de forma > SO Android Automotive y sigue las instrucciones de Play Console.
Recursos adicionales
Si quieres obtener más información sobre el SO Android Automotive, consulta los siguientes recursos adicionales.
Ejemplos
Guías
- Diseño para la conducción
- Cómo usar la app de prueba del controlador multimedia
- Notificaciones en el SO Android Automotive
- Calidad de las apps para Android para vehículos
Blogs
- Actualizaciones del SO Android Automotive para desarrolladores
- Cómo desarrollar apps para el SO Android Automotive
Videos
- Cómo compilar apps de música para vehículos (Android Dev Summit 2019)
- Cómo compilar apps para Android para vehículos (Google I/O 2019)
Informa un problema en las apps de música para SO Android Automotive
Si tienes un problema mientras desarrollas tu app de música para SO Android Automotive, puedes informarlo con la herramienta de seguimiento de errores de Google. Asegúrate de llenar toda la información solicitada en la plantilla de problemas.
Antes de informar un problema nuevo, verifica si ya se informó en la lista de problemas. Para suscribirte a un problema o votarlo, haz clic en el ícono de estrella que aparece en la herramienta de seguimiento. Si deseas obtener más información, consulta Cómo suscribirte a un problema.