Attivazione (o disattivazione) della memoria di massa USB tramite comandi adb


17

Sfondo: ho un dispositivo Android con chiavetta USB (ad es. RikoMagic) che eseguo principalmente in modalità "senza testa". Tra le altre cose, ho già capito come spegnerlo tramite una combinazione di adb e il comando interno "am":

adb shell am start -n android/com.android.server.ShutdownActivity

Ora sto cercando di capire come attivare e disattivare il supporto di archiviazione di massa USB. Sono arrivato a far apparire la finestra delle attività di archiviazione USB tramite il seguente comando:

adb shell am start -n com.android.systemui/.usb.UsbStorageActivity

Sfortunatamente non sono stato in grado di capire come inviare l '"intento" equivalente a "smontare" o "annullare" il volume condiviso (o "montare" o "condividerlo" per quella materia). Il seguente comando non fa nulla:

adb shell am start -n com.android.systemui/.usb.UsbStorageActivity -a android.intent.action.MEDIA_UNSHARED file:///mnt/sdcard

Che cosa sto facendo di sbagliato? Qual è l'incantesimo magico per montare / smontare la memoria interna di un dispositivo Android?

Nota 1: So che c'è l'evidente comando "mount" / "umount" di Linux. Tuttavia, il semplice montaggio o smontaggio del volume non attiverà le funzioni di sistema fondamentali, ad esempio per riavviare o arrestare le app che sono state spostate sulla scheda SD. Un "umount" probabilmente fallirà comunque quando un'app nella scheda SD è ancora attiva.

Nota 2: Apparentemente c'è un comando "setprop" che può abilitare / disabilitare il supporto di archiviazione di massa USB FINO AL riavvio successivo. Ancora una volta, questo approccio tutto o niente non è quello che sto cercando, ma la possibilità di attivare e disattivare l'archiviazione di massa USB durante una singola sessione, come può essere fatto dall'interfaccia touch.

adb shell setprop sys.usb.config mass_storage

Una domanda molto ben studiata, vorrei poterla votare due volte! Grazie per i tuoi sforzi e per condividere quei comandi utili e già funzionanti! Esemplare :) Incrociando le dita qualcuno può inventare il pezzo mancante, poiché sarebbe davvero utile!
Izzy

Risposte:


9

Purtroppo, il UsbStorageActivitynon usa un intento per abilitare e disabilitare l'archiviazione di massa USB, quindi non c'è modo di farlo usando am. Invece chiama le funzioni StorageManager.enableUsbMassStoragee `StorageManager.disableUsbMassStoragefa il suo lavoro. Poiché queste funzioni sono nascoste nel framework, non è nemmeno possibile scrivere un'app per farlo. Per quanto ne so, non esiste un comando esistente per farlo.

Potrebbe essere possibile scrivere un'app che offra un'interfaccia da riga di comando e utilizzi il servizio di sistema associato MountServiceper chiamare la sua setUsbMassStorageEnabledfunzione, ma sarebbe fuori tema per questo sito.


1
Ma cosa succede esattamente quando tocco il pulsante "Attiva archiviazione USB"? Perché non è possibile ottenere l'effetto di questo pulsante anche quando si arriva all'estremo di scrivere un'app completamente nuova? Una variante più intelligente dell'utilità "scimmia" non farebbe il trucco?
Anonimo Howard,

L'ho spiegato nella mia risposta: chiama le funzioni che ho citato, che a loro volta chiamano un servizio di sistema e il servizio di sistema fa tutto il lavoro. Per maggiori dettagli dovrai leggere la fonte. Non è nemmeno possibile utilizzare monkeyper fare clic sul pulsante, poiché il codice ha un controllo esplicito per questo, per interrompere i test smontando accidentalmente la memoria.
Dan Hulme,

È possibile provare lo servicestrumento CLI che può chiamare i metodi del servizio di sistema.
Léo Lam,

5


Ho provato "StorageManager.enableUsbMassStorage" e "StorageManager.disableUsbMassStorage" per abilitare e disabilitare l'archiviazione di massa e le sue opere.
Grazie.

Tali metodi sono metodi privati. Quindi, se vuoi usarli, dovresti farlo riflettendo. Per ottenere quel gestore di archiviazione, è possibile utilizzare il metodo getSystemService (java.lang.String) incluso nelle attività:

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

E per disabilitare l'archiviazione di massa:

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

Amir Brand: ho provato a utilizzare questo metodo ma non sono in grado di disabilitare la mia memoria USB. Funziona con te? se sì, puoi aiutarmi, per favore. Grazie
Khanna,

Ciao Khanna Sicuro. Nessun problema. Inviami una mail a netmir2002@gmail.com con il problema e cercherò di trovare la soluzione.
Amir Brand
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.