Antecedentes: Eu tenho um dispositivo Android com pendrive (por exemplo, RikoMagic), que geralmente corro no modo "sem cabeça". Entre outras coisas, eu já descobri como desligá-lo por meio de uma combinação de adb e o comando interno "am":
adb shell am start -n android/com.android.server.ShutdownActivity
Agora estou tentando descobrir como ativar e desativar o suporte a armazenamento em massa USB. Cheguei ao ponto de exibir a janela de atividade de armazenamento USB através do seguinte comando:
adb shell am start -n com.android.systemui/.usb.UsbStorageActivity
Infelizmente, não consegui descobrir como enviar a "intenção" equivalente para realmente "desmontar" ou "cancelar o compartilhamento" do volume compartilhado (ou "montar" ou "compartilhá-lo"). O seguinte comando não faz nada:
adb shell am start -n com.android.systemui/.usb.UsbStorageActivity -a android.intent.action.MEDIA_UNSHARED file:///mnt/sdcard
O que estou fazendo de errado? Qual é o encantamento mágico para montar / desmontar o armazenamento interno de um dispositivo Android?
Nota 1: Eu sei que existe o comando óbvio Linux "mount" / "umount". No entanto, simplesmente montar ou desmontar o volume não acionará as funções do sistema vitais para, por exemplo, reiniciar ou interromper os aplicativos que foram movidos para o cartão SD. Uma "quantidade" provavelmente falhará de qualquer maneira quando um aplicativo no cartão SD ainda estiver ativo.
Nota 2: Aparentemente, existe um comando "setprop" que pode ativar / desativar o suporte ao armazenamento em massa USB ATÉ a próxima reinicialização. Novamente, essa abordagem de tudo ou nada não é o que estou procurando, mas a capacidade de ativar e desativar o armazenamento em massa USB durante uma única sessão, como pode ser feito pela interface de toque.
adb shell setprop sys.usb.config mass_storage
fonte
Respostas:
Infelizmente,
UsbStorageActivity
ele não usa a intenção de ativar e desativar o armazenamento em massa USB, portanto não há como conseguir issoam
. Em vez disso, chama as funçõesStorageManager.enableUsbMassStorage
e`StorageManager.disableUsbMassStorage
faz o seu trabalho. Como essas funções estão ocultas na estrutura, também não é possível escrever um aplicativo para fazer isso. Até onde eu sei, não há comando existente para fazer isso.Pode ser possível escrever um aplicativo que ofereça uma interface de linha de comando e use o serviço de sistema vinculado
MountService
para chamar suasetUsbMassStorageEnabled
função, mas isso seria muito fora de tópico para este site.fonte
monkey
clicar no botão, pois o código possui uma verificação explícita para interromper os testes que desmontam acidentalmente o armazenamento.service
ferramenta CLI, que pode chamar métodos de serviço do sistema.Tentei o "StorageManager.enableUsbMassStorage" e o "StorageManager.disableUsbMassStorage" para ativar e desativar o armazenamento em massa e suas obras.
Obrigado.
Esses métodos são privados. Então, se você quiser usá-los, faça isso por reflexão. Para obter esse Storage Manager, você pode usar o método getSystemService (java.lang.String) incluído nas atividades:
E para desativar o armazenamento em massa:
fonte