You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

MDM系统应用:Android程序化禁用所有USB端口的实现方法

嘿,既然你的MDM已经是系统应用且握有必要权限,那咱们可以用这几种程序化方案来彻底锁死Android设备的所有USB端口,不管是可移动存储还是鼠标键盘这类外设都别想生效:

方法1:用USB Manager API精准控制(Android 10+首选)

从Android 10开始,系统给了更直接的USB控制权,咱们可以借助UsbManager来拒绝所有USB设备的访问权限,还能监听新设备连接实时拦截:

  • 先拿到UsbManager实例:
UsbManager usbManager = (UsbManager) getSystemService(Context.USB_SERVICE);
  • 先处理已经连上的设备,再监听新设备:
// 先把已连接的所有USB设备权限都拒绝掉
for (UsbDevice device : usbManager.getDeviceList().values()) {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
        // Android 12+用这个更严格的方法直接禁用设备
        usbManager.setDevicePolicy(device, UsbManager.DEVICE_POLICY_DISALLOW);
    } else {
        // 低版本通过拒绝权限来阻止识别
        usbManager.grantPermission(device, null);
    }
}

// 注册广播接收器,新设备一插上就拦截
private BroadcastReceiver usbAttachReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        if (UsbManager.ACTION_USB_DEVICE_ATTACHED.equals(action)) {
            UsbDevice newDevice = intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);
            if (newDevice != null) {
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
                    usbManager.setDevicePolicy(newDevice, UsbManager.DEVICE_POLICY_DISALLOW);
                } else {
                    usbManager.grantPermission(newDevice, null);
                }
            }
        }
    }
};

// 别忘了注册接收器
IntentFilter filter = new IntentFilter(UsbManager.ACTION_USB_DEVICE_ATTACHED);
registerReceiver(usbAttachReceiver, filter);

提示:这个方法需要android.permission.MANAGE_USB权限,作为系统应用你应该已经拿到了。

方法2:修改系统属性(Root/定制ROM场景适用)

如果你的设备是Root过的,或者你能定制系统ROM,那可以直接改系统属性来全局禁用USB功能:

  • 用命令行的话是这样:
# 彻底禁用USB所有功能(部分设备仍保留充电)
setprop persist.sys.usb.config none
# 或者直接切换USB状态为禁用
setprop sys.usb.state none
  • 在代码里可以通过SystemProperties来设置(需要系统签名或Root权限):
// 注意不同版本的SystemProperties包路径
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
    SystemProperties.set("persist.sys.usb.config", "none");
} else {
    android.os.SystemProperties.set("persist.sys.usb.config", "none");
}

注意:有些设备设置none后还是能充电,要是想保留充电又禁用外设,得查厂商的定制属性,比如部分设备用charging代替none,但这个可能会漏过一些外设,得在目标设备上测试。

方法3:借助Device Policy Manager(Android Enterprise场景)

如果你的MDM是基于Android Enterprise做的,那用DevicePolicyManager来设置全局USB限制最合规:

  • 先拿到实例和你的设备管理员组件:
DevicePolicyManager dpm = (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE);
ComponentName adminComponent = new ComponentName(this, YourDeviceAdminReceiver.class);
  • 设置禁用策略:
// Android 9+可以直接禁用USB数据传输
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
    dpm.setUsbDataSignalingEnabled(adminComponent, false);
}
// 额外禁用USB存储访问,双保险
dpm.setSecureSetting(adminComponent, Settings.Secure.USB_MASS_STORAGE_ENABLED, "0");

提示:这个方法需要你的应用拥有设备管理员权限,作为MDM应用这应该是必备的配置。

踩坑提醒
  • 不同Android版本的API差异超大,一定要针对目标版本做适配,比如Android 12+的setDevicePolicy是目前最严格的拦截方式。
  • 有些厂商会定制USB逻辑,别光看通用文档,一定要在目标设备上做充分测试。
  • 要是想彻底封死所有外设,方法1+方法3结合用效果最好;方法2适合需要底层控制的场景,但门槛更高。

内容的提问来源于stack exchange,提问作者ManDev

火山引擎 最新活动