Android端如何检测游戏控制器连接状态?(React Native/Expo场景)
Android游戏控制器连接/断开事件的替代实现方案
用BroadcastReceiver监听系统广播
Android系统会在USB或蓝牙设备连接、断开时发送对应广播,你可以注册BroadcastReceiver来捕获:- USB设备:监听
android.hardware.usb.action.USB_DEVICE_ATTACHED和android.hardware.usb.action.USB_DEVICE_DETACHED,需要在AndroidManifest里声明权限和设备过滤规则(针对特定USB控制器)。 - 蓝牙设备:监听
android.bluetooth.device.action.ACL_CONNECTED和android.bluetooth.device.action.ACL_DISCONNECTED,注意要申请BLUETOOTH和BLUETOOTH_ADMIN权限(Android 12+权限有调整,需适配)。
收到广播后,调用getSources()或InputManager.getInputDevice()拿到设备信息,判断是不是游戏控制器即可。
- USB设备:监听
注册InputManager的设备监听回调(Android 4.1+)
从API 16开始,InputManager提供了registerInputDeviceListener方法,能监听输入设备的添加、移除和配置变化,不用手动轮询:
InputManager inputManager = (InputManager) getSystemService(Context.INPUT_SERVICE); inputManager.registerInputDeviceListener(new InputManager.InputDeviceListener() { @Override public void onInputDeviceAdded(int deviceId) { InputDevice device = inputManager.getInputDevice(deviceId); if (isGameController(device)) { // 把连接事件发送到JS层 } } @Override public void onInputDeviceRemoved(int deviceId) { // 把断开事件发送到JS层 } @Override public void onInputDeviceChanged(int deviceId) { // 可选处理设备配置变更 } }, null);
这是系统主动触发的回调,比定时轮询高效很多,完美对齐iOS的通知逻辑。
- 适配Expo Modules生命周期
在Expo模块的onCreate或onAttach方法里注册监听,onDestroy或onDetach时注销,防止内存泄漏。然后通过Expo的EventEmitter把原生事件传递到React Native端,让JS层能像监听iOS事件一样处理控制器连接/断开。
内容的提问来源于stack exchange,提问作者Mehrdad Moradi
相关产品推荐
相关产品推荐

