La API de Media Enhancement es una herramienta potente que usa la aceleración de la GPU integrada en el dispositivo para realizar mejoras de imágenes de alta calidad y baja latencia. Esto incluye funciones como la asignación automática de tono, la eliminación de desenfoque, la reducción de ruido y el reescalado.
Antes de inicializar la API, debes configurar las dependencias del proyecto y declarar los requisitos de aceleración por hardware en el manifiesto. Omitir estas configuraciones es la causa principal de los errores de tiempo de ejecución de GLOBAL_INIT_FAILED.
Dependencias de Gradle
Agrega las siguientes dependencias a tu archivo app/build.gradle.kts. Para facilitar la ejecución asíncrona y sin bloqueos, incluye corrutinas de Kotlin y Jetpack Media3 para el control de superficies de hardware.
dependencies {
// Google Play services Media Enhancement Library (Beta)
implementation("com.google.android.gms:play-services-media-effect-enhancement:16.0.0-beta04")
}
Consulta los detalles del paquete para play-services-media-effect-enhancement en el repositorio de Maven de Google.
También recomendamos usar corrutinas de Kotlin para administrar las sesiones de mejora de forma asíncrona.
// Kotlin coroutines for asynchronous API handling
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.3")
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-play-services:1.7.3")
Requisitos del manifiesto de Android
Agrega los siguientes elementos dentro de la etiqueta <application> de tu archivo AndroidManifest.xml:
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
<application>
<!-- 1. Google Play services version for runtime compatibility checks -->
<meta-data
android:name="com.google.android.gms.version"
android:value="@integer/google_play_services_version" />
<!-- 2. Declare OpenCL compute libraries for NPU/GPU neural acceleration -->
<uses-native-library android:name="libOpenCL.so" android:required="false" />
<uses-native-library android:name="libOpenCL-car.so" android:required="false" />
<uses-native-library android:name="libOpenCL-pixel.so" android:required="false" />
<!-- 3. Declare OpenGL ES for high-performance graphics rendering -->
<uses-native-library android:name="libGLESv2.so" android:required="false" />
<uses-native-library android:name="libGLESv3.so" android:required="false" />
</application>
</manifest>
OpenCL proporciona las bibliotecas de procesamiento nativas necesarias para habilitar la aceleración neuronal de la NPU y la GPU para las tareas de Mejora de medios. Declarar estas bibliotecas en tu manifiesto es un requisito previo para que la API aproveche la aceleración por hardware, lo que es esencial para realizar mejoras de alta calidad y baja latencia. Para obtener más información sobre OpenCL, consulta Implementaciones de OpenCL.
OpenGL ES proporciona las bibliotecas de gráficos nativas necesarias para el procesamiento de alto rendimiento de los resultados de la mejora de medios. Declarar estas bibliotecas en tu manifiesto es fundamental para garantizar que la canalización de renderización pueda mostrar de manera eficaz los medios procesados en superficies aceleradas por hardware. Para obtener información sobre OpenGL, consulta la descripción general de la documentación de la API de OpenGL.
La canalización de procesamiento de Android debe estar acelerada por hardware para evitar cuellos de botella. Si bien está habilitado de forma predeterminada para las apps que segmentan la API 14 y versiones posteriores, establece android:hardwareAccelerated="true" de forma explícita dentro de tus etiquetas <activity>.
Compatibilidad del dispositivo y configuración del módulo
Los Servicios de Google Play entregan modelos de aprendizaje automático de forma dinámica para conservar el espacio de almacenamiento inicial del APK. Antes de realizar mejoras, la aplicación debe usar EnhancementClient para verificar la compatibilidad del hardware y asegurarse de que los pesos del modelo necesarios se descarguen y almacenen en caché de forma local. Este es un proceso que solo se debe realizar una vez por dispositivo.
Con suspendCancellableCoroutine, puedes encapsular las devoluciones de llamada del cliente basadas en tareas en funciones de suspensión estándar de Kotlin para una ejecución más limpia y secuencial:
// Verifies if host hardware supports NPU/GPU acceleration
suspend fun EnhancementClient.isDeviceSupportedAsync(): Boolean = suspendCancellableCoroutine { continuation ->
this.isDeviceSupported()
.addOnSuccessListener { result -> continuation.resume(result) }
.addOnFailureListener { exception -> continuation.resumeWithException(exception) }
}
// Verifies the presence of required neural network models
suspend fun EnhancementClient.isModuleInstalledAsync(): Boolean = suspendCancellableCoroutine { continuation ->
this.isModuleInstalled()
.addOnSuccessListener { result -> continuation.resume(result) }
.addOnFailureListener { exception -> continuation.resumeWithException(exception) }
}