【Settings】Android 常见外设检测机制

Android平台提供了完善的外设检测机制,通过广播接收器、系统服务API和运行时权限管理,开发者可以实现对USB设备、耳机、存储设备和蓝牙设备的准确检测和状态监听。

【Settings】Android 常见外设检测机制

  • [1. 检测外接鼠标](#1. 检测外接鼠标)
  • [2. 检测外置USB存储/U盘](#2. 检测外置USB存储/U盘)
  • [3. 检测外置TF/SD卡](#3. 检测外置TF/SD卡)
  • [4. 检测SIM状态](#4. 检测SIM状态)
  • [5. 检测摄像头状态](#5. 检测摄像头状态)

1. 检测外接鼠标

java 复制代码
private boolean checkKeyboard() {
    InputManager im = (InputManager) getSystemService(Context.INPUT_SERVICE);
    int[] deviceIds = im.getInputDeviceIds();
    boolean found = false;
    for (int id : deviceIds) {
        InputDevice device = im.getInputDevice(id);
        if (device != null && !device.isVirtual() && device.isFullKeyboard()) {
            found = true;
            break;
        }
    }
    return found;
}

2. 检测外置USB存储/U盘

java 复制代码
private boolean checkUSBStorage() {
    StorageManager sm = getSystemService(StorageManager.class);
    boolean found = false;
    List<VolumeInfo> volumeInfos = sm.getVolumes();
    for (VolumeInfo vol : volumeInfos) {
        if (vol.getDisk() != null && vol.getDisk().isUsb()) {
			found = true;
		}
    }
    return found;
}

3. 检测外置TF/SD卡

java 复制代码
private boolean checkSDStorage() {
    StorageManager sm = getSystemService(StorageManager.class);
    boolean found = false;
    List<VolumeInfo> volumeInfos = sm.getVolumes();
    for (VolumeInfo vol : volumeInfos) {
        if (vol.getDisk() != null && vol.getDisk().isSd()) {
        	found = true;
		}
    }
    return found;
}

4. 检测SIM状态

java 复制代码
public boolean checkSimType() {
	SubscriptionManager mSubscriptionManager = (SubscriptionManager) getSystemService(Context.TELEPHONY_SUBSCRIPTION_SERVICE);
	TelephonyManager mTelephonyManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
    final List<SubscriptionInfo> subInfoList = mSubscriptionManager.getActiveSubscriptionInfoList();
    if (subInfoList == null) {
        return false;
    }
    for (SubscriptionInfo subInfo : subInfoList) {
        final int simState = mTelephonyManager.getSimState(subInfo.getSimSlotIndex());
        if ((simState != TelephonyManager.SIM_STATE_ABSENT)
                && (simState != TelephonyManager.SIM_STATE_UNKNOWN)
                && (simState != TelephonyManager.SIM_STATE_PERM_DISABLED)) {
            return true;
        }
    }
    return true;
}

5. 检测摄像头状态

java 复制代码
import android.hardware.camera2.CameraCharacteristics;
import android.hardware.camera2.CameraManager;

private boolean checkCamera(int lensFacing) {
    CameraManager manager = (CameraManager) getSystemService(Context.CAMERA_SERVICE);
	boolean found = false;
    try {
        String[] list = manager.getCameraIdList();
        for (String id : list) {
            CameraCharacteristics chars = manager.getCameraCharacteristics(id);
            Integer facing = chars.get(CameraCharacteristics.LENS_FACING);
            if (facing != null && facing == lensFacing) {
                found = true;
                break;
            }
        }
        return found;
    } catch (Exception e) {
        return found;
    }
}

// 检测前置摄像头
checkCamera(CameraCharacteristics.LENS_FACING_FRONT);

// 检测后置摄像头
checkCamera(CameraCharacteristics.LENS_FACING_BACK);
相关推荐
消失的旧时光-19432 小时前
从 Kotlin 到 Dart:为什么 sealed 是处理「多种返回结果」的最佳方式?
android·开发语言·flutter·架构·kotlin·sealed
Jinkxs3 小时前
Gradle - 与Groovy/Kotlin DSL对比 构建脚本语言选择指南
android·开发语言·kotlin
&有梦想的咸鱼&3 小时前
Kotlin委托机制的底层实现深度解析(74)
android·开发语言·kotlin
LDORntKQH3 小时前
基于深度强化学习的混合动力汽车能量管理策略 1.利用DQN算法控制电池和发动机发电机组的功率分配 2
android
冬奇Lab3 小时前
Android 15 ServiceManager与Binder服务注册深度解析
android·源码·源码阅读
Industio_触觉智能4 小时前
触觉智能RV1126B核心板配置USB复合设备(下)
串口·acm·开发板·usb·rv1126b·ums·usb存储
2501_916008895 小时前
深入解析iOS机审4.3原理与混淆实战方法
android·java·开发语言·ios·小程序·uni-app·iphone
独行soc6 小时前
2026年渗透测试面试题总结-20(题目+回答)
android·网络·安全·web安全·渗透测试·安全狮
常利兵6 小时前
2026年,Android开发已死?不,它正迎来黄金时代!
android
Risehuxyc7 小时前
备份三个PHP程序
android·开发语言·php