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
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 tenersox
integrado (también está el gratuito ZShaolin Light XDA-Dev, aunque no estoy seguro si incluyesox
).