通过adb命令打开或关闭USB大容量存储


17

背景:我有一个USB记忆棒Android设备(例如RikoMagic),我通常以“无头”模式运行。除其他外,我已经弄清楚了如何通过adb和内部“ am”命令的组合来关闭它:

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

我现在正试图弄清楚如何打开和关闭USB大容量存储支持。我已经通过以下命令弹出了USB存储活动窗口:

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

不幸的是,我无法弄清楚如何发送等效的“意图”以实际“卸载”或“取消共享”共享卷(或就此而言“加载”或“共享”)。以下命令不执行任何操作:

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

我究竟做错了什么?挂载/卸载Android设备内部存储的神奇魔咒是什么?

注意1:我知道有明显的Linux“ mount” /“ umount”命令。但是,简单地安装或卸载卷并不会触发系统功能,例如重新启动或停止已移至SD卡的应用程序至关重要。当SD卡中的应用仍处于活动状态时,“ umount”可能仍然会失败。

注意2:显然有一个“ setprop”命令可以启用/禁用USB大容量存储支持,直到下次重启。同样,这种全有或全无的方法不是我要寻找的,而是能够在单个会话中打开和关闭USB大容量存储的功能,这可以通过触摸界面完成。

adb shell setprop sys.usb.config mass_storage

一个经过充分研究的问题,希望我能两次投票赞成!感谢您的努力,并分享了那些有用的和已经有效的命令!范例:)交叉手指的人可以拿出丢失的那一块,因为这确实有用!
伊齐

Answers:


9

las,它们UsbStorageActivity不会使用意图来启用和禁用USB大容量存储,因此无法使用来实现此目的am。而是调用函数StorageManager.enableUsbMassStorage`StorageManager.disableUsbMassStorage完成其工作。由于这些功能隐藏在框架中,因此也无法编写应用程序来执行此操作。据我所知,尚无执行此操作的命令。

可能有可能编写一个提供命令行界面并使用绑定的系统服务MountService来调用其setUsbMassStorageEnabled功能的应用程序,但这对于本网站而言可能是遥不可及的。


1
但是,当我点击“打开USB存储设备”按钮时,会发生什么?为什么即使编写极端的新应用程序也无法实现按此按钮的效果?“ monkey”实用程序的更智能的变体不会成功吗?
匿名霍华德

我在回答中对此进行了解释:它调用了我提到的函数,这些函数又调用了系统服务,而系统服务完成了所有工作。有关更多详细信息,您必须阅读源代码。您甚至不能使用monkey单击按钮,因为代码对此进行了明确的检查,以停止意外卸载存储的测试。
Dan Hulme

您可以尝试使用serviceCLI工具来调用系统服务方法。
Lao Lam

5


我尝试了“ StorageManager.enableUsbMassStorage”和“ StorageManager.disableUsbMassStorage”来启用和禁用大容量存储及其工作。
谢谢。

该方法是私有方法。因此,如果您想使用它们,则应通过反思来做到。要获取该存储管理器,可以使用活动中包含的getSystemService(java.lang.String)方法:

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

并消除大容量存储:

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

阿米尔·布兰德(Amir Brand)-我尝试使用此方法,但无法禁用USB存储。与您合作吗?如果是的话,请您帮帮我。谢谢
Khanna

嗨,Khanna当然。没问题。请将有问题的邮件发送给我netmir2002@gmail.com,我将尝试找到解决方法。
阿米尔·布兰德
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.