¿Cómo puedo cambiar el volumen de forma remota?

9

En casa, a menudo conecto mi Android a algunos altavoces para escuchar la radio por Internet. Me gustaría poder cambiar el nivel de sonido a través de un comando en mi computadora portátil.

Puedo abrir un shell ssh en el teléfono, pero estoy atascado al encontrar un comando para cambiar el volumen en el Android.

¿Hay un comando para cambiar el volumen de audio en el shell de Android? ¿O tal vez hay un enfoque diferente sin ssh que me perdí por completo?

Estoy ejecutando Android 4.1.

Editar

La respuesta aceptada debería funcionar para dispositivos rooteados. Todavía estoy interesado en obtener una respuesta para un dispositivo no rooteado.

oscuridad
fuente

Respuestas:

13

Eche un vistazo a la simulación de eventos clave en Android y busque "KEYCODE_VOLUME_UP" y "KEYCODE_VOLUME_DOWN".

Los eventos se pueden generar ejecutando "input":

#local shell:
input keyevent 24 #vol up
input keyevent 25 #vol down
#remotely using ssh
ssh your-phone input keyevent 24 #vol up
ssh your-phone input keyevent 25 #vol down

# 'su -c command' to make it run as root (if not already). EDIT: now escaped properly.
ssh your-phone su -c "input\ keyevent\ 24" #vol up
ssh your-phone su -c "input\ keyevent\ 25" #vol down"

Supongo que su shell necesita los permisos apropiados para disparar eventos de entrada. Si realiza la autenticación de clave pública y mantiene su clave privada cargada en la memoria (ssh-add), puede hacer una secuencia de comandos de envoltura y simplemente ejecutar esto sin que se le solicite una frase de contraseña. Nota: Hay una sobrecarga considerable tanto para 'su' como para 'input', en general, un solo ajuste de volumen tarda 2.5s en completarse en mi HTC Desire.

EDIT2:

shell@android:/ $ id
uid=2000(shell) gid=2000(shell) groups=1003(graphics),1004(input),[...]
shell@android:/ $ time input keyevent 24                                       
    0m0.92s real     0m0.29s user     0m0.06s system

Parece que tienes que ser miembro del grupo de entrada (aquí GID = 2004) para tener la capacidad de generar eventos clave usando 'input'. Además, noté que la pantalla no tiene que estar bloqueada (y / o apagada), porque el bloqueo eventualmente consumiría todos los eventos clave. Tenga en cuenta también que el comando tarda casi 1 segundo.

ce4
fuente
Esto se ve muy prometedor. El shell acepta los comandos sin fallar, pero el volumen no cambia. Probablemente tendré que jugar un poco más con mis permisos.
mirk
funciona para mí (usando un teléfono conectado localmente a través de "adb shell" con root) Lo más probable es que se trate de permisos. Tal vez mire logcat si hay algún resultado sobre llamadas de 'entrada' rechazadas
ce4
No: no creo que tenga acceso de root. Además, me dice 'su no encontrado' cuando se ejecuta como usuario de Android. Logcat da el siguiente resultado: I/Input ( 2502): InjectKeyEvent: KeyEvent { action=ACTION_DOWN, keyCode=KEYCODE_VOLUME_UP, scanCode=0, metaState=0, flags=0x0, repeatCount=0, eventTime=399847, downTime=399847, deviceId=-1, source=0x101 } I/Input ( 2502): InjectKeyEvent: KeyEvent { action=ACTION_UP, keyCode=KEYCODE_VOLUME_UP, scanCode=0, metaState=0, flags=0x0, repeatCount=0, eventTime=399847, downTime=399847, deviceId=-1, source=0x101 }. Tengo que agregar que soy nuevo en Android.
mirk
Ok, no soy miembro del grupo input (1004). Un día rootearé mi dispositivo e intentaré nuevamente.
mirk
Debe haber una opción para no necesitar root, como (mal) usar tasker con intenciones para eso (tasker probablemente tenga los derechos necesarios para casi todo ...)
ce4