Directrices para dispositivos móviles — Android
En este tema se abordan las consideraciones que hay que tener en cuenta a la hora de desarrollar aplicaciones para un dispositivo Android:
- Permisos
- Creación de una aplicación de VoIP utilizando el ConnectionService de Android
- Configuración de servicios en primer plano
- Más información
Permisos
Para conocer los permisos que requiere el SDK de OpenTok para Android, consulta la sección «Permisos» de la descripción general del SDK de Android.
Creación de una aplicación de VoIP utilizando el ConnectionService de Android
Utiliza Android Servicio de conexión clase para crear una aplicación de VoIP que utilice las funciones de audio y vídeo del SDK de OpenTok para Android.
Como mínimo, sigue estas pautas para crear una aplicación básica de VoIP:
-
Registra el
android.telecom.ConnectionServiceen el archivo AndroidManifest.xml.Copia<service android:name="com.example.package.MyConnectionService" android:label="@string/some_label_for_my_connection_service" android:permission="android.permission.BIND_TELECOM_CONNECTION_SERVICE"> <intent-filter> <action android:name="android.telecom.ConnectionService" /> </intent-filter> </service> -
Crear una clase que extienda la clase
android.telecom.ConnectionServiceclase. Implementar métodos de la claseConnectionServiceclase, incluyendoonCreateIncomingConnection(),onCreateOutgoingConnection,onCreateIncomingConnectionFailed()yonCreateOutgoingConnectionFailed(). -
Crear una clase que extienda la clase
android.telecom.Connectionclase. Implementar métodos de la claseConnectionclase, incluyendoonAnswer()yonDisconnect. En la aplicación de laonAnswer()método, puedes conectarte a una sesión de OpenTok, publicar una transmisión en la sesión y habilitar el código para suscribirse a las transmisiones creadas en la sesión. En la implementación delonDisconnect()Con este método, puedes desconectarte de la sesión de OpenTok (y dejar de publicar y suscribirte a las transmisiones). -
Puedes utilizar servicios como Google Firebase para implementar notificaciones push para la aplicación. Puedes configurar las notificaciones para saber cuándo tu aplicación está en segundo plano o cerrada. De este modo, tu aplicación puede recibir una llamada VoIP mientras está cerrada.
Al utilizar ConnectionService, utiliza el AudioDeviceManager.getAudioFocusManager() método e implementa los métodos de la instancia de `AudioFocusManager` devuelta para delegar el control del foco de audio a tu aplicación. Estos se definen en el SDK de OpenTok para Android:
private AudioDeviceManager audioDeviceManager;
private AudioFocusManager audioFocusManager;
public void setupAudioFocusManager(Context context) {
audioDeviceManager = new AudioDeviceManager(context);
audioFocusManager = audioDeviceManager.getAudioFocusManager();
audioFocusManager.setRequestAudioFocus(false);
}
public void notifyAudioFocusIsActive() {
audioFocusManager.audioFocusActivated();
}
public void notifyAudioFocusIsInactive() {
audioFocusManager.audioFocusDeactivated();
}
Al delegar el control del audio a la aplicación, el SDK detiene su enrutamiento automático de audio. En su lugar, esta lógica de enrutamiento la gestiona ConnectionService, que notifica a la aplicación los dispositivos de audio disponibles a través de las API CallEndpoint y CallAudioState de Connection. Tu aplicación debe implementar la compatibilidad con la enumeración de dispositivos de audio y la lógica de selección.
Esta delegación garantiza el enrutamiento adecuado del audio y la coordinación con el sistema Android Telecom.
Véase el Aplicación de VOIP de ejemplo en el repositorio «opentok-android-sdk-samples». En él se muestra cómo implementar la clase «ConnectionService» para crear una aplicación de VoIP que utilice el SDK de OpenTok para Android.
Configuración de servicios en primer plano
Los servicios en primer plano te permiten realizar de forma asíncrona operaciones que el usuario puede percibir. Los servicios en primer plano muestran una notificación en la barra de estado para que los usuarios sepan que tu aplicación está realizando una tarea en primer plano y consumiendo recursos del sistema. Ten en cuenta que el ConnectionService se puede utilizar como servicio en primer plano. Entre los ejemplos de casos de uso que emplean servicios en primer plano se incluyen:
-
Sigue capturando y enviando audio a los compañeros aunque el usuario abra otra aplicación.
-
Permitir que un usuario comparta su pantalla mientras cambia de una aplicación a otra.
-
Permitir a los usuarios apagar la pantalla sin dejar de escuchar una videollamada.
Tipos de servicios en primer plano
Android 10 introdujo el atributo «android:foregroundServiceType» dentro del elemento. La idea es especificar de forma explícita qué tipo de tarea realiza el servicio.
Android 14 obliga a especificar el tipo de servicio en primer plano. Con ello se pretende garantizar el uso correcto de los servicios en primer plano y la coherencia entre fabricantes de dispositivos.
Los tipos admitidos actualmente son:
-
camera(obligatorio en Android 11) — Al acceder a la cámara desde un proceso en segundo plano, como en el caso de las aplicaciones de videollamadas -
connectedDevice— Al interactuar con un dispositivo externo, como un dispositivo de fitness con Bluetooth -
dataSync— A la hora de cargar o descargar datos, esta función quedará obsoleta y se deberán utilizar alternativas como DownloadManager, BackupManager o WorkManager en su lugar. -
health(novedad en Android 14) — Para aplicaciones de fitness, como las de seguimiento de ejercicio -
location(obligatorio en Android 10) — Cuando se requiere la ubicación, por ejemplo, para la navegación -
mediaPlayback— Al reanudar la reproducción de audio o vídeo desde segundo plano, como en Spotify o Netflix -
mediaProjection— Al proyectar contenido en dispositivos o pantallas externos -
microphone(obligatorio en Android 11) — Al acceder al micrófono desde segundo plano, como en el caso de las aplicaciones de llamadas -
phoneCall— Al continuar una llamada en curso -
remoteMessaging(novedad en Android 14) — al transferir mensajes de texto de un dispositivo a otro -
shortService— Cuando se necesita un servicio para completar rápidamente una tarea crítica que no puede interrumpirse (su duración está limitada a unos 3 minutos) -
specialUse— Cuando otros tipos no se ajustan a tu caso de uso -
systemExempted— Reservado para aplicaciones del sistema
Declarar el tipo de servicio en primer plano
El primer paso para soportar Android 14 es actualizar su declaración de servicio en el archivo AndroidManifest y especificar el tipo de servicio en primer plano correcto.
Si su servicio requiere varios tipos, puede combinarlos utilizando el operador | de la siguiente manera:
<manifest xmlns:android="http://schemas.android.com/apk/res/android" ...>
<service
android:name=".MyForegroundService"
android:foregroundServiceType="microphone|camera"
android:exported="false">
</service>
</manifest>
Si intenta iniciar un servicio en primer plano sin declarar su tipo en el manifiesto, el sistema lanzará un error MissingForegroundServiceTypeException al llamar startForeground().
Solicitar permisos específicos para servicios en primer plano
A partir de Android 9 (API 28), las aplicaciones tenían que solicitar el FOREGROUND_SERVICE permiso en el manifiesto de la aplicación, que el sistema concedió automáticamente.
<uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>
A partir de Android 14 (API 34), las aplicaciones deben solicitar además permisos específicos en función del tipo de servicio en primer plano. Por lo tanto, si tu servicio sigue accediendo al micrófono en segundo plano, debes especificar FOREGROUND_SERVICE_MICROPHONE. El sistema concede automáticamente el permiso.
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_MICROPHONE"/>
Si tu servicio requiere varios tipos, debes declarar este permiso para cada uno de ellos.
Si te olvidas de declarar cualquiera de los dos permisos, recibirás un SecurityException indicando el motivo exacto.
Iniciar un servicio en primer plano
Dependiendo del nivel de API que se utilice, inicia el servicio tal y como se indica a continuación:
Intent serviceIntent = new Intent(this, MyForegroundService.class);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { // Android 8.0 (API 26) and above
startForegroundService(serviceIntent);
} else { // Android 7.0 (API 24, 25)
startService(serviceIntent);
}
El fragmento de código inicia un servicio. Sin embargo, el servicio aún no se está ejecutando en primer plano. Dentro del propio servicio, debes llamar a startForeground() para convertir el servicio en un servicio en primer plano. Si utilizas AndroidX, debes llamar a ServiceCompat.startForeground().
Proporcione detalles de su caso de uso en Google Play Console
Después de cargar la nueva versión de la aplicación dirigida a Android 14 y que utiliza un tipo de servicio en primer plano en Google Play Console, aparecerá un mensaje en la consola para que proporcione información adicional sobre su uso.
Como Google quiere asegurarse de que las aplicaciones utilizan los servicios en primer plano de forma adecuada, tendrás que enviar una nueva declaración en la página de contenido de la aplicación (Política -> Contenido de la aplicación).
Por cada tipo de servicio en primer plano que declares, deberás hacer lo siguiente:
-
Describe las funciones de la aplicación que utilizan el tipo de servicio en primer plano.
-
Describe las consecuencias para el usuario en caso de que el sistema aplace o interrumpa la tarea.
-
Incluya un enlace a un vídeo que muestre cada función de los servicios en primer plano. El vídeo debe mostrar los pasos que el usuario debe seguir en la aplicación para activar la función.
-
Elija su caso de uso específico para cada tipo de servicio en primer plano. Puede elegir entre una lista preestablecida de casos de uso que se enumeran aquí o introducirla manualmente.
Aplicación de ejemplo y más información
Véase el Chat de vídeo básico con servicios en primer plano en Java muestra en el opentok-android-sdk-ejemplos repo.
Más información en la sección de Android Servicios en primer plano documentación.
Más información
Para obtener más información, consulta: