2011-09-13 78 views
13

在许多Android设备上,当设备插入计算机的USB端口或甚至在某些USB充电设备上时,手机会进入USB存储模式。当设备处于此模式时,android应用程序无法访问sdcard。有什么办法(1)检测设备何时处于此模式,以及(2)以编程方式关闭USB存储器,至少暂时关闭,以便我的android应用程序可以访问sdcard?以编程方式关闭Android设备上的USB存储器

我看过其他的SO问题,答案不够真实 (例如,Android: Detecting USB)。

+0

+1好问题 –

+0

这可以工作,如果电话是根植的,并且当前的操作系统已经获得了所需的API权限访问 – Prateek

+0

像尼古拉说的,除非你只支持pre - 蜂窝设备,这是不值得努力,使UMS切换功能。 MTP虽然很多人可能不喜欢它(包括我自己),但确实有其优点。例如,通过MTP,您可以通过计算机或设备同时从手机中删除文件,并查看计算机和设备中立即反映的更改。使用UMS,每次需要在设备和计算机之间切换使用情况时,您必须安装/卸除该设备。所以MTP为您提供更多的灵活性。 – ChuongPham

回答

3

您可以检测到它(您有链接),但是AFAIK不能通过公共SDK API来挂载/卸载USB存储。在Honeycomb(3.0及以上版本)中,USB海量存储不再用于访问设备的外部存储,因此您的应用和计算机可以同时访问它。

+1

正确,您无法安装或卸载USB,除非您的应用程序是固件的一部分。 – CommonsWare

5

A1:如果SD卡当前状态为SHARED这意味着它已经连接到MSC模式PC,你可以检查此情况如下:

String state = Environment.getExternalStorageState(); 
if (Environment.MEDIA_SHARED.equals(state)) { 
    // Sd card has connected to PC in MSC mode 
} 

A2:您可以强制关闭USB通过调用海量存储连接:

MountService.setUsbMassStorageEnabled(false); 

StorageManager.disableUsbMassStorage(); 

但不幸的是,这两个API是不是公众可以访问?!

+6

那么如何访问这些apis? – 2012-10-04 21:14:09

0

它通过在storageManger api上使用反射来阻止大容量存储。 Storage Manager API可从sdk级别-9获得。

我无法反映可以锁定较低操作系统级别的Mountservice api。如果任何人已经做到了,请给点建议

+0

欢迎来到Stack Exchange。你不应该添加评论或问题作为答案,他们很可能会被删除。 如果您有问题,请提问,但请务必先阅读[如何提问](http://stackoverflow.com/questions/how-to-ask)。 要批评或要求作者澄清,一旦你有足够的[声誉](http://stackoverflow.com/help/whats-reputation),在他们的帖子下留下评论。 删除的帖子可能会导致不良后果[我们不再接受此帐户的问题/答案](http://meta.stackexchange.com/q/86997/201151) – bummi

相关问题