Como posso alterar remotamente o volume?

9

Em casa, costumo conectar meu android a alguns alto-falantes, para ouvir rádio na internet. Gostaria de poder alterar o nível do som através de um comando no meu laptop.

Posso abrir um shell ssh para o telefone, mas não consigo encontrar um comando para alterar o volume no android.

Existe um comando para alterar o volume do áudio no shell do android? Ou talvez haja uma abordagem diferente sem ssh que eu perdi completamente?

Estou executando o Android 4.1.

Editar

A resposta aceita deve funcionar para dispositivos raiz. Ainda estou interessado em obter uma resposta para um dispositivo não rooteado.

mirk
fonte

Respostas:

13

Dê uma olhada na simulação de eventos-chave no Android e pesquise "KEYCODE_VOLUME_UP" e "KEYCODE_VOLUME_DOWN".

Eventos podem ser gerados executando "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"

Seu shell precisa de permissões apropriadas, provavelmente para disparar eventos de entrada, eu acho. Se você faz autenticação de chave pública e mantém sua chave privada carregada na memória (ssh-add), é possível criar um script de wrapper e apenas executá-lo sem ser solicitada uma senha. Nota: Existe uma sobrecarga considerável para 'su' e 'input', tudo em um único ajuste de volume leva 2,5 segundos para ser concluído no meu 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 você precisa ser membro do grupo de entrada (aqui GID = 2004) para ter a capacidade de gerar eventos-chave usando 'entrada'. Além disso, notei que a tela não deve estar bloqueada (e / ou desativada), porque a trava consumiria todos os eventos de teclas eventualmente. Observe também que o comando leva quase 1 segundo.

ce4
fonte
Isso parece muito promissor. Os comandos são aceitos pelo shell sem falha, mas o volume não muda. Provavelmente terei que jogar um pouco mais com minhas permissões.
negrume
funciona para mim (usando um telefone conectado localmente via "adb shell" com root). Provavelmente é uma questão de permissões. Talvez olhar para logcat se há alguma saída sobre chamadas rejeitadas 'INPUT'
CE4
Não: acho que não tenho acesso root. Além disso, ele diz 'su not found' ao executar como usuário do Android. Logcat dá o seguinte 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 }. Eu tenho que acrescentar que eu sou novo no android.
negrume
Ok, eu não sou um membro do grupo de entrada (1004). Vou torcer meu dispositivo um dia e tentar novamente.
negrume
Deve haver uma opção para não precisar de raiz, como (des) usando tasker com intenções para que (Tasker provavelmente tem os direitos necessários para quase tudo ...)
CE4