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.