Android中如何编程检测USB连接类型(充电/MTP/PTP等模式)
编程检测Android设备USB连接类型的实现方案
完全可以实现,仅做模式读取不需要特殊权限,也不需要ROOT适配,适配Android 4.4及以上全版本通用。
核心逻辑说明
你之前没找到对应监听事件,是因为USB模式变更的参数包含在系统广播android.hardware.usb.action.USB_STATE的附加字段里,该广播为粘性广播,USB连接状态、当前传输模式变更时都会触发,不需要额外权限即可监听。
具体实现步骤
- 定义广播接收器处理USB状态变更
public class UsbModeReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { if (Intent.ACTION_USB_STATE.equals(intent.getAction())) { // USB是否已连接 boolean isUsbConnected = intent.getBooleanExtra("connected", false); // 是否开启MTP模式 boolean isMtpEnabled = intent.getBooleanExtra("mtp", false); // 是否开启PTP模式 boolean isPtpEnabled = intent.getBooleanExtra("ptp", false); if (isUsbConnected) { if (isMtpEnabled) { // 检测到当前为MTP模式,按需引导用户操作 } else if (isPtpEnabled) { // 检测到当前为PTP模式,按需引导用户操作 } else { // 检测到当前为仅充电模式,按需引导用户操作 } } } } }
- 动态注册广播接收器
// 仅需在需要检测的页面注册即可,不需要静态注册 IntentFilter usbFilter = new IntentFilter(Intent.ACTION_USB_STATE); registerReceiver(new UsbModeReceiver(), usbFilter);
兼容定制ROM的备选方案
如果部分国产定制ROM修改了广播的附加字段,可通过反射调用系统隐藏API直接读取当前USB模式,适配Android 6.0~Android 14均有效:
public String getCurrentUsbFunction(Context context) { UsbManager usbManager = (UsbManager) context.getSystemService(Context.USB_SERVICE); try { Method getCurrentFunctions = UsbManager.class.getMethod("getCurrentFunctions"); return (String) getCurrentFunctions.invoke(usbManager); } catch (Exception e) { e.printStackTrace(); } // 返回值说明:返回"mtp"为MTP模式,返回"ptp"为PTP模式,返回"none"为仅充电模式 return null; }
内容的提问来源于stack exchange,提问作者Mohammad Elsayed
相关产品推荐
相关产品推荐

