USB yığın depolamayı adb komutlarıyla açma (veya kapatma)


17

Arka plan: Çoğunlukla "başsız" modda çalıştırdığım bir USB stick Android cihazım var (örneğin RikoMagic). Diğer şeylerin yanı sıra, bir adb ve dahili "am" komutu kombinasyonu ile nasıl kapatılacağını zaten anladım:

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

Şimdi USB yığın depolama desteğini nasıl açıp kapatacağımı anlamaya çalışıyorum. USB depolama etkinliği penceresinin aşağıdaki komutla açılmasını sağladım:

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

Ne yazık ki, eşdeğer "amacı", paylaşılan birimi "ayırmak" veya "çıkarmak" için nasıl gönderemedim (veya bu konu için "bağla" veya "paylaş"). Aşağıdaki komut hiçbir şey yapmaz:

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

Neyi yanlış yapıyorum? Bir Android cihazın dahili depolamasını monte etmek / bağlantısını kesmek için sihirli büyü nedir?

Not 1: Bilinen Linux "mount" / "umount" komutunun olduğunu biliyorum. Ancak, birimin bağlanması veya çıkarılması, örneğin SD karta taşınan uygulamaları yeniden başlatmak veya durdurmak için hayati önem taşıyan sistem işlevlerini tetiklemez. Bir "umount", SD karttaki bir uygulama hala etkin olduğunda yine de başarısız olur.

Not 2: Görünüşe göre bir sonraki yeniden başlatmaya kadar USB yığın depolama desteğini etkinleştirebilen / devre dışı bırakabilen bir "setprop" komutu var. Yine, bu ya hep ya hiç yaklaşımı aradığım şey değil, dokunmatik arayüz tarafından yapılabileceği gibi, tek bir oturum sırasında USB yığın depolama alanını açıp kapatabilme yeteneği.

adb shell setprop sys.usb.config mass_storage

Çok iyi araştırılmış bir soru, iki kez değerlendirebilseydim! Çabalarınız ve bu yararlı ve zaten çalışan komutları paylaştığınız için teşekkürler! Örnek :) Birisi eksik bir parça ile gelip parmakları geçebilir, bu gerçekten yararlı olacaktır!
Izzy

Yanıtlar:


9

Ne yazık ki, UsbStorageActivityUSB yığın depolamayı etkinleştirmek ve devre dışı bırakmak için bir amaç kullanmaz, bu yüzden bunu kullanarak elde etmenin bir yolu yoktur am. Bunun yerine işlevleri çağırır StorageManager.enableUsbMassStorageve `StorageManager.disableUsbMassStorageişini yapar. Bu işlevler çerçevede gizlendiğinden, bunu yapmak için bir uygulama yazmak da mümkün değildir. Bildiğim kadarıyla bunu yapacak mevcut bir komut yok.

Komut satırı arabirimi sunan MountServiceve setUsbMassStorageEnabledişlevini çağırmak için ilişkili sistem hizmetini kullanan bir uygulama yazmak mümkün olabilir , ancak bu site için konu dışı bir yol olacaktır.


1
Ancak "USB belleği aç" düğmesine dokunduğumda tam olarak ne olur? Yepyeni bir uygulama yazmanın en uç noktalarına gitseniz bile bu düğmeye basmanın etkisini elde etmek neden mümkün değil? "Maymun" yardımcı programının daha akıllı bir varyasyonu hile olmaz mı?
İsimsiz Howard

Cevabımda açıkladım: bahsettiğim işlevleri çağırıyor, bu da bir sistem hizmetini çağırıyor ve sistem hizmeti tüm işleri yapıyor. Daha fazla ayrıntı için kaynağı okumalısınız. monkeyKodun bunun için açık bir denetimi olduğundan, depolamayı yanlışlıkla söken testleri durdurmak için düğmeyi tıklatmak için bile kullanamazsınız .
Dan Hulme

serviceSistem hizmeti yöntemlerini çağırabilen CLI aracını deneyebilirsiniz .
Léo Lam

5


Toplu depolama ve çalışmalarını etkinleştirmek ve devre dışı bırakmak için "StorageManager.enableUsbMassStorage" ve "StorageManager.disableUsbMassStorage" komutlarını denedim.
Teşekkürler.

Bu yöntemler özel yöntemdir. Yani, eğer onları kullanmak istiyorsanız, bunu yansıtarak yapmalısınız. Bu Depolama Yöneticisi'ni edinmek için, etkinliklerde bulunan getSystemService (java.lang.String) yöntemini kullanabilirsiniz:

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

Ve yığın depolamayı bozmak için:

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

Amir Brand- Bu yöntemi kullanmaya çalıştım ama usb belleğimi devre dışı bırakamıyorum. Seninle mi çalışıyor? evet ise, lütfen bana yardım edebilir misin. teşekkürler
Khanna

Merhaba Khanna Tabii. Sorun değil. Lütfen bana netmir2002@gmail.com adresine sorunla birlikte mail gönderin ve çözümü bulmaya çalışacağım.
Amir Brand
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.