Ativando (ou desativando) o armazenamento em massa USB através de comandos adb

17

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
Howard anônimo
fonte
Uma pergunta muito bem pesquisada, gostaria de poder votar duas vezes! Obrigado por seus esforços e por compartilhar esses comandos úteis e já funcionando! Exemplo :) Cruzando os dedos, alguém pode inventar a peça que falta, pois isso seria realmente útil!
Izzy

Respostas:

9

Infelizmente, UsbStorageActivityele não usa a intenção de ativar e desativar o armazenamento em massa USB, portanto não há como conseguir isso am. Em vez disso, chama as funções StorageManager.enableUsbMassStoragee `StorageManager.disableUsbMassStoragefaz 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 MountServicepara chamar sua setUsbMassStorageEnabledfunção, mas isso seria muito fora de tópico para este site.

Dan Hulme
fonte
1
Mas o que exatamente acontece quando toco no botão "Ativar armazenamento USB"? Por que não é possível obter o efeito desse pressionamento de botão, mesmo quando você se esforça ao máximo para escrever um aplicativo totalmente novo? Uma variante mais inteligente do utilitário "monkey" não funcionaria?
Anônimo Howard
Expliquei isso na minha resposta: ele chama as funções que mencionei, que por sua vez chamam um serviço de sistema, e o serviço do sistema faz todo o trabalho. Para mais detalhes, você terá que ler a fonte. Você nem pode monkeyclicar no botão, pois o código possui uma verificação explícita para interromper os testes que desmontam acidentalmente o armazenamento.
21813 Dan Hulme
Você pode tentar a serviceferramenta CLI, que pode chamar métodos de serviço do sistema.
Léo Lam
5


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:

 StorageManager storage = (StorageManager)getApplicationContext().getSystemService(STORAGE_SERVICE);
 Method method = storage.getClass().getDeclaredMethod("enableUsbMassStorage");
 method.setAccessible(true); 
 Object r = method.invoke(storage);

E para desativar o armazenamento em massa:

StorageManager storage = (StorageManager) getApplicationContext().getSystemService(STORAGE_SERVICE);
Method method = storage.getClass().getDeclaredMethod("disbleUsbMassStorage");
method.setAccessible(true);
Object r = method.invoke(storage);
Amir Brand
fonte
Amir Brand- Eu tentei usar esse método, mas não consigo desativar meu armazenamento USB. Está trabalhando com você? Se sim, você pode por favor me ajudem .thanks
Khanna
Oi Khanna Claro. Sem problemas. Envie-me um email para [email protected] com o problema e tentarei encontrar a solução.
Amir Brand