如何在Android 10+(API 29+)中以编程方式检测USB大容量存储是否启用?
在Android API 29+中检测USB大容量存储状态
问题原因
你之前使用的Settings.Global#USB_MASS_STORAGE_ENABLED在API 29+已经不再准确——Android 10及以后的USB存储管理逻辑发生了变化,这个常量的状态不再随实际USB模式更新,因此会始终返回"1"。
正确检测方案
API 29+需通过UsbManager提供的API获取当前USB功能状态,具体步骤如下:
- 添加权限
在AndroidManifest.xml中声明USB状态访问权限(普通权限,无需动态申请):
<uses-permission android:name="android.permission.ACCESS_USB_STATE" />
- 编写检测代码
通过UsbManager获取当前启用的USB功能集合,判断是否包含大容量存储功能:
import android.content.Context; import android.hardware.usb.UsbManager; // 获取UsbManager实例 UsbManager usbManager = (UsbManager) getSystemService(Context.USB_SERVICE); // 获取当前启用的USB功能标识 int currentUsbFunctions = usbManager.getCurrentUsbFunctions(); // 判断是否启用了USB大容量存储 boolean isMassStorageEnabled = (currentUsbFunctions & UsbManager.FUNCTION_MASS_STORAGE) != 0;
关键说明
UsbManager.FUNCTION_MASS_STORAGE对应传统的USB大容量存储(UMS)模式。- 当设备未连接USB、连接后设置为“无数据传输”模式时,
currentUsbFunctions会返回0或不包含该功能标识,此时isMassStorageEnabled为false。 - 部分现代Android设备已移除传统UMS模式,转而默认使用MTP(文件传输),这类设备可能永远不会触发
FUNCTION_MASS_STORAGE,需结合设备实际支持情况测试。
测试方法
- 将设备连接到电脑,在系统下拉菜单中切换USB模式为“大容量存储”(若设备支持),此时检测结果应为
true。 - 切换为“无数据传输”模式,或断开USB连接,检测结果应为
false。 - 若设备默认USB模式设为“无数据传输”,即使连接USB,检测结果也会是
false。
内容的提问来源于stack exchange,提问作者AlanArBras
相关产品推荐
相关产品推荐

