Mengaktifkan / menonaktifkan penyimpanan massal USB melalui perintah adb

17

Latar Belakang: Saya memiliki perangkat Android stick USB (mis. RikoMagic) yang kebanyakan saya jalankan dalam mode "tanpa kepala". Di antara hal-hal lain, saya sudah menemukan cara mematikannya melalui kombinasi adb dan perintah internal "am":

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

Saya sekarang mencoba mencari cara untuk menghidupkan dan mematikan dukungan penyimpanan massal USB. Sejauh ini saya memiliki jendela aktivitas penyimpanan USB yang muncul melalui perintah berikut:

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

Sayangnya saya belum dapat menemukan cara mengirim "maksud" yang setara untuk benar-benar "melepaskan" atau "membatalkan berbagi" volume bersama (atau "me-mount" atau "berbagi" dalam hal ini). Perintah berikut tidak melakukan apa-apa:

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

Apa yang saya lakukan salah? Apa mantra sihir untuk memasang / melepas penyimpanan internal perangkat Android?

Catatan 1: Saya tahu ada perintah "mount" / "umount" Linux yang jelas. Namun, hanya dengan memasang atau melepas volume tidak akan memicu fungsi sistem yang vital, misalnya, memulai ulang atau menghentikan aplikasi yang telah dipindahkan ke kartu SD. "Umount" mungkin akan tetap gagal saat aplikasi di kartu SD masih aktif.

Catatan 2: Rupanya ada perintah "setprop" yang dapat mengaktifkan / menonaktifkan dukungan penyimpanan massal USB SAMPAI reboot berikutnya. Sekali lagi, pendekatan ini semua atau tidak sama sekali bukan yang saya cari tetapi kemampuan untuk mengaktifkan dan menonaktifkan penyimpanan massal USB selama satu sesi, seperti yang dapat dilakukan oleh antarmuka sentuh.

adb shell setprop sys.usb.config mass_storage
Howard anonim
sumber
Sebuah pertanyaan yang diteliti dengan sangat baik, seandainya saya bisa memperbaikinya dua kali! Terima kasih atas upaya Anda dan membagikan perintah yang bermanfaat dan sudah berfungsi itu! Teladan :) Menyilangkan jari seseorang dapat menghasilkan bagian yang hilang, karena itu akan sangat berguna!
Izzy

Jawaban:

9

Sayangnya, UsbStorageActivitytidak menggunakan maksud untuk mengaktifkan dan menonaktifkan penyimpanan massal USB, jadi tidak ada cara untuk mencapai ini menggunakan am. Alih-alih memanggil fungsi StorageManager.enableUsbMassStoragedan `StorageManager.disableUsbMassStoragemelakukan tugasnya. Karena fungsi-fungsi ini disembunyikan dalam kerangka kerja, tidak mungkin untuk menulis aplikasi untuk melakukan hal ini. Sejauh yang saya tahu, tidak ada perintah yang ada untuk melakukan ini.

Mungkin saja untuk menulis aplikasi yang menawarkan antarmuka baris perintah dan menggunakan layanan sistem terikat MountServiceuntuk memanggil setUsbMassStorageEnabledfungsinya, tetapi itu akan jauh di luar topik untuk situs ini.

Dan Hulme
sumber
1
Tetapi apa yang sebenarnya terjadi ketika saya mengetuk tombol "Nyalakan penyimpanan USB"? Mengapa tidak mungkin untuk mencapai efek penekanan tombol ini bahkan ketika Anda sangat ingin menulis aplikasi baru? Bukankah varian utilitas "monyet" yang lebih cerdas akan berhasil?
Anonim Howard
Saya telah menjelaskan bahwa dalam jawaban saya: ini memanggil fungsi yang saya sebutkan, yang pada gilirannya memanggil layanan sistem, dan layanan sistem melakukan semua pekerjaan. Untuk detail lebih lanjut Anda harus membaca sumbernya. Anda bahkan tidak dapat menggunakan monkeyuntuk mengklik tombol, karena kode memiliki pemeriksaan eksplisit untuk itu, untuk menghentikan tes unmount penyimpanan secara tidak sengaja.
Dan Hulme
Anda dapat mencoba servicealat CLI yang dapat memanggil metode layanan sistem.
Léo Lam
5


Saya mencoba "StorageManager.enableUsbMassStorage" dan "StorageManager.disableUsbMassStorage" untuk mengaktifkan dan menonaktifkan penyimpanan massal dan kerjanya.
Terima kasih.

Metode itu adalah metode pribadi. Jadi, Jika Anda ingin menggunakannya, Anda harus melakukannya dengan refleksi. Untuk mendapatkan Storage Manager itu, Anda mungkin menggunakan metode getSystemService (java.lang.String) yang termasuk dalam aktivitas:

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

Dan untuk menonaktifkan penyimpanan massal:

StorageManager storage = (StorageManager) getApplicationContext().getSystemService(STORAGE_SERVICE);
Method method = storage.getClass().getDeclaredMethod("disbleUsbMassStorage");
method.setAccessible(true);
Object r = method.invoke(storage);
Merek Amir
sumber
Amir Brand - Saya telah mencoba menggunakan metode ini tetapi saya tidak dapat menonaktifkan penyimpanan usb saya. Apakah ini berhasil dengan Anda? jika ya, bisakah Anda membantu saya. Terima kasih
Khanna
Hai Khanna Tentu. Tidak masalah. Silakan kirim saya surat ke [email protected] dengan masalah dan saya akan mencoba mencari solusinya.
Amir Brand