3 votos

¿Cómo conceder a una aplicación un permiso que no está en su manifiesto para la grabación de audio?

Moto G6 Play no rooteado con Android 9.

Estoy usando Termux y me gustaría usar el comando rec de Sox para grabar audio desde la terminal. Desafortunadamente, como Termux no solicita el permiso de micrófono, simplemente graba silencio. No puedo otorgar el permiso a Termux en Configuración porque... bueno, no lo solicita. No está en el manifiesto de la aplicación, por lo tanto Android (comprensiblemente) asume que no sabría qué hacer con el permiso si lo tuviera y no enumera "grabar audio" como una opción.

¿Hay alguna forma de forzar a Android a otorgarle a una aplicación un permiso que nunca solicitó?

0 votos

Solo en caso de que esto sea un problema XY (X: cómo grabar audio usando sox desde la terminal, Y: cómo otorgar un nuevo permiso en Termux), podrías estar interesado en ZShaolin que afirma tener sox integrado (también está el gratuito ZShaolin Light XDA-Dev, aunque no estoy seguro si incluye sox).

6voto

Jack Wade Puntos 231

No es posible sin root, pero incluso con root, la grabación de SoX podría no funcionar.


Permisos en el Manifiesto de Android

El sistema de permisos de Android tiene diferentes Niveles de Protección (1, 2); los permisos Normales se conceden a cualquier aplicación sin interacción del usuario, mientras que los permisos Firma|Privilegiado (FirmaOSistema) (en lista blanca en /etc/permissions/privapp-permissions-*.xml) solo se otorgan a aplicaciones del sistema. Ambos se conceden al instalar la aplicación o al iniciarla por primera vez (si es una aplicación del sistema) y la configuración se guarda en el archivo /data/system/packages.xml. Algunos permisos de firma pueden otorgarse a aplicaciones que no son del sistema después de la aprobación del usuario mediante appops.

Los permisos Peligrosos son aquellos que requieren la aprobación o denegación del usuario. La elección del usuario se guarda en /data/system/users//runtime-permissions.xml donde el User_ID del propietario del dispositivo es 0 (no confundirlo con el UID del DAC de UNIX).

La mayoría de los permisos del manifiesto son aplicados por el framework de Android (system_server), pero algunos están mapeados a GIDs; por lo tanto, son aplicados por el kernel. El mapeo de permisos a GID se guarda en /data/system/packages.list.

Cómo Conceder un Permiso No Solicitado a una Aplicación

Puedes modificar los archivos mencionados anteriormente para otorgar un permiso que no sea solicitado por una aplicación en su Manifiesto. No he probado con todos los permisos, pero este truco funciona (al menos hasta Pie) porque el framework de Android no verifica la configuración de permisos guardada frente a los archivos del manifiesto de las aplicaciones en cada reinicio (es posible que los cambios se reviertan al estado original durante una tarea de mantenimiento programada o cuando se instala o actualiza alguna aplicación; no estoy seguro).

En nuestro caso, queremos otorgar android.permission.RECORD_AUDIO a Termux, que es un permiso peligroso, así es como deberías editar tu runtime-permissions.xml seguido de un reinicio inmediato:

  ...

  ...

Para confirmar:

~$ pm dump com.termux | grep -A3 'runtime permissions:'
      runtime permissions:
        android.permission.READ_EXTERNAL_STORAGE: granted=true
        android.permission.WRITE_EXTERNAL_STORAGE: granted=true
        android.permission.RECORD_AUDIO: granted=true

¿Por qué SoX no funciona?

Dicho esto, aún así, SoX no podrá grabar audio porque (hasta donde sé) no está utilizando las API de Java de Android (android.media) o las API nativas (aaudio/opensles). Utiliza directamente el controlador ALSA/OSS o a través de PulseAudio, lo cual necesita acceso directo a las interfaces del dispositivo en /dev/snd/ o /dev/{audio,dsp*} y al árbol de procesos en /proc/asound/. Para más detalles, consulta Arquitectura de Audio en Android.

Sin embargo, el acceso directo al nivel del kernel no es algo común en Android, por lo que necesitas acceso root. Las aplicaciones con android.permission.MANAGE_VOICE_KEYPHRASES tienen permitido leer los dispositivos /dev/snd/*. Es un permiso de nivel de firma privilegiado que está mapeado al GID audio (1005). Puedes editar packages.xml para conceder este permiso:

Y en packages.list:

com.termux ... 0 /data/user/0/com.termux default:targetSdkVersion=28... 1005,3003

Pero SELinux solo permite que las aplicaciones privilegiadas (con contexto priv_app) lean archivos en /dev/snd, mientras que /proc/asound/ no es legible por las aplicaciones en absoluto, por lo que también necesitas parchear sepolicy.

E incluso después de eso, la configuración de SoX para usar ALSA/OSS/PA queda a tu elección.


Soluciones sin Root

En lugar de usar ALSA directamente, PulseAudio también se puede configurar para transmitir audio a través de TCP o UDP o sockets UNIX. Así es como funciona la reproducción de medios en Termux. Consulta este problema. Sin embargo, la captura de audio solo funciona a través de las API de Android. Puedes instalar el paquete termux-api para usar el comando termux-microphone-record para grabar audio. Utiliza la clase MediaRecorder de las API de Java, o puedes considerar modificar la fuente de SoX para usar las APIs nativas de Android.


RELACIONADO

0voto

pr0nin Puntos 353

Hay dos maneras:

  1. Termux es una aplicación de código abierto en Github. Por lo tanto, solo necesitas las herramientas de desarrollo de Android y git para clonar y construir una versión personalizada (quizás con un nombre de paquete diferente para que puedas tener tanto tu versión como la oficial instalada).

  2. Como tu dispositivo tiene acceso root, puedes intentar añadir el permiso a la lista de permisos registrados de un Termux instalado. Hasta donde sé, los datos relevantes deberían estar en /data/system/packages.list o /data/system/packages.xml. Después de modificar esos archivos, debes reiniciar el dispositivo para activar los cambios. Para más detalles, consulta también esta respuesta. Nota: No estoy seguro de qué sucede con estas modificaciones en caso de que se instale una actualización de Termux. Supongo que la actualización revertirá tus cambios.

PreguntAndroid.com

PreguntAndroid es una comunidad de usuarios de Android en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X