react-native 中的硬件调用方式集合(蓝牙 摄像头 传感器等) 安卓和ios 《前端笔记》

发布于:2025-04-07 ⋅ 阅读:(28) ⋅ 点赞:(0)

目录

1. 摄像头(Camera)

iOS:

Android:

2. 麦克风(Microphone)

iOS:

Android:

3. 加速度计(Accelerometer)

iOS:

Android:

4. 陀螺仪(Gyroscope)

iOS:

Android:

5. 磁力计(Magnetometer)

iOS:

Android:

6. 近距离传感器(Proximity Sensor)

iOS:

Android:

7. 光线传感器(Light Sensor)

iOS:

Android:

8. GPS(定位)

iOS:

Android:

9. 蓝牙(Bluetooth)

iOS:

Android:

10. NFC(近场通信)

iOS:

Android:

11. 指纹/面部识别(Biometrics)

iOS:

Android:

12. 气压计(Barometer)

iOS:

Android:

13. 温度/湿度传感器

14. 心率传感器

iOS:

Android:

15. 红外传感器(Infrared)

iOS:

Android:

16. 超声波传感器

17. 触觉反馈(Haptic Feedback)

iOS:

Android:

18. USB接口(USB Port)

iOS:

Android:

关键差异总结

通用注意事项


1. 摄像头(Camera)

iOS:
  • 原生 APIAVFoundation 框架(AVCaptureSessionAVCaptureDevice)。

  • 权限NSCameraUsageDescription(必须描述用途)。

  • 技术细节:

    • 支持多摄像头切换(广角、超广角、LiDAR)。

    • 后台使用受限(锁屏后必须释放摄像头)。

  • React Native 库react-native-vision-camera(推荐)或 react-native-camera

Android:
  • 原生 APICamera2(Android 5.0+)或 CameraX(Jetpack 组件)。

  • 权限android.permission.CAMERA

  • 技术细节:

    • 需处理动态权限请求(Android 6.0+)。

    • 屏幕旋转需手动适配(OrientationEventListener)。

  • 差异点:

    • Android 允许后台使用摄像头(需前台服务),但可能被系统限制。


2. 麦克风(Microphone)

iOS:
  • 原生 APIAVAudioSession(管理音频会话)。

  • 权限NSMicrophoneUsageDescription

  • 技术细节:

    • 后台录音需开启 Audio 后台模式(Info.plist 中配置)。

  • React Native 库react-native-audio-recordreact-native-voice

Android:
  • 原生 APIMediaRecorder 或 AudioRecord

  • 权限RECORD_AUDIO

  • 技术细节:

    • 后台录音需通过 foreground service 保持活跃。

  • 差异点:

    • Android 支持更灵活的音频格式和低延迟录音。


3. 加速度计(Accelerometer)

iOS:
  • 原生 API: Core Motion 框架(CMMotionManager)。

  • 权限: 无需显式权限。

  • 数据频率: 最高 100Hz,需手动控制采样率。

  • 代码示例:

let motionManager = CMMotionManager()
motionManager.startAccelerometerUpdates(to: .main) { data, error in
  print(data?.acceleration)
}
Android:
  • 原生 APISensorManagerSensor.TYPE_ACCELEROMETER)。

  • 权限: 无。

  • 代码示例:

SensorManager sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
Sensor accelerometer = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
sensorManager.registerListener(listener, accelerometer, SensorManager.SENSOR_DELAY_UI);
  • 差异点:

    • Android 设备传感器精度差异较大(需校准处理)。


4. 陀螺仪(Gyroscope)

iOS:
  • 原生 API: Core Motion 框架(CMMotionManager)。

  • 数据融合: 结合加速度计和陀螺仪实现姿态跟踪(如 ARKit)。

  • React Native 库react-native-sensors

Android:
  • 原生 APISensor.TYPE_GYROSCOPE

  • 校准: 需调用 SensorManager.getRotationMatrix 处理漂移。

  • 差异点:

    • iOS 自动优化传感器数据,Android 需手动处理噪声和漂移。


5. 磁力计(Magnetometer)

iOS:
  • 原生 API: Core Motion(CMMagnetometerData)。

  • 用途: 电子罗盘需结合加速度计数据计算方位。

  • 代码示例:

motionManager.startMagnetometerUpdates(to: .main) { data, error in
  print(data?.magneticField)
}
Android:
  • 原生 APISensor.TYPE_MAGNETIC_FIELD

  • 干扰处理: 需排除设备自身磁场干扰(如通过 Sensor.TYPE_GEOMAGNETIC_ROTATION_VECTOR)。

  • 差异点:

    • Android 提供更底层的磁场数据,但需开发者处理校准。


6. 近距离传感器(Proximity Sensor)

iOS:
  • 原生 APIUIDevice.proximityState(仅用于通话场景)。

  • 限制: 无法自定义阈值,仅返回 YES/NO

  • 代码示例:
UIDevice.current.isProximityMonitoringEnabled = true
NotificationCenter.default.addObserver(self, selector: #selector(proximityChanged), name: UIDevice.proximityStateDidChangeNotification, object: nil)
Android:
  • 原生 APISensor.TYPE_PROXIMITY

  • 灵活度: 可获取实际距离(厘米),但依赖硬件支持。

  • 差异点:

    • Android 支持更广泛的场景(如非通话应用)。


7. 光线传感器(Light Sensor)

iOS:
  • 限制: 无公开 API,仅系统自动调节亮度使用。

  • 绕过方案: 越狱设备或私有 API(可能导致 App 审核被拒)。

Android:
  • 原生 APISensor.TYPE_LIGHT

  • 代码示例:

Sensor lightSensor = sensorManager.getDefaultSensor(Sensor.TYPE_LIGHT);
sensorManager.registerListener(listener, lightSensor, SensorManager.SENSOR_DELAY_NORMAL);
  • 差异点:

    • Android 开放数据,但部分低端设备无此传感器。


8. GPS(定位)

iOS:
  • 原生 API: Core Location(CLLocationManager)。

  • 权限NSLocationWhenInUseUsageDescription 或 NSLocationAlwaysUsageDescription

  • 高精度模式desiredAccuracy = kCLLocationAccuracyBest.

Android:
  • 原生 APILocationManager 或 Fused Location Provider(Google Play Services)。

  • 权限ACCESS_FINE_LOCATION

  • 差异点:

    • Android 需处理国产手机阉割 Google Play Services 的问题(如华为设备)。


9. 蓝牙(Bluetooth)

iOS:
  • 原生 API: Core Bluetooth(CBCentralManagerCBPeripheral)。

  • 限制: 仅支持 BLE,后台模式需声明 bluetooth-central

  • 代码示例:

let centralManager = CBCentralManager()
centralManager.scanForPeripherals(withServices: nil)
Android:
  • 原生 API:

    • BLE: BluetoothLeScanner

    • 经典蓝牙: BluetoothSocket

  • 权限BLUETOOTHBLUETOOTH_ADMIN 及位置权限(Android 12+)。

  • 差异点:

    • Android 支持经典蓝牙和 BLE,但需处理碎片化问题(如小米蓝牙兼容性)。


10. NFC(近场通信)

iOS:
  • 原生 API: Core NFC(仅读取 NDEF 标签)。

  • 限制: iPhone 7 及以上,需用户主动触发扫描。

  • 代码示例:

let session = NFCNDEFReaderSession(delegate: self, queue: nil, invalidateAfterFirstRead: true)
session.begin()
Android:
  • 原生 APINfcAdapter

  • 功能: 支持读写、模拟卡片(需 API 19+)。

  • 差异点:

    • Android 提供更完整的 NFC 功能(如 HCE 模拟卡片)。


11. 指纹/面部识别(Biometrics)

iOS:
  • 原生 API: Local Authentication(LAContext)。

  • 权限: Face ID 需 NSFaceIDUsageDescription

  • 代码示例:

let context = LAContext()
context.evaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, localizedReason: "Unlock") { success, error in }
Android:
  • 原生 API: BiometricPrompt(API 28+)。

  • 权限USE_BIOMETRIC

  • 差异点:

    • Android 支持多种生物特征(指纹、面部、虹膜)。


12. 气压计(Barometer)

iOS:
  • 原生 APICMAltimeter(iPhone 6 及以上)。

  • 数据格式: 返回海拔变化(相对值),非绝对气压值。

Android:
  • 原生 APISensor.TYPE_PRESSURE

  • 限制: 仅部分设备支持(如三星 Galaxy 系列)。


13. 温度/湿度传感器

  • 通用限制: 手机通常无开放 API,需通过外接蓝牙传感器(如 react-native-ble-plx)或设备厂商私有 SDK(如 Samsung 的 S Health)。


14. 心率传感器

iOS:
  • 集成方式: 通过 HealthKit 读取 Apple Watch 或第三方设备数据。

  • 代码示例:

Android:
  • 实现方式: 通过 BLE 读取蓝牙心率带,或依赖设备硬件(如 Samsung Galaxy 手机)。


15. 红外传感器(Infrared)

iOS:
  • 限制: 无公开 API,仅 MFi 认证设备可用(如遥控类 App)。

Android:
  • 原生 APIConsumerIrManager(部分设备支持,如华为)。

  • 代码示例:

ConsumerIrManager irManager = (ConsumerIrManager) getSystemService(CONSUMER_IR_SERVICE);
irManager.transmit(frequency, pattern);

16. 超声波传感器

  • 通用实现: 依赖麦克风和扬声器发射/接收声波,通过 react-native-audio 捕获信号,使用 FFT 算法计算距离。

  • 限制: 精度受环境噪音影响,需复杂信号处理。


17. 触觉反馈(Haptic Feedback)

iOS:
  • 原生 APIUIFeedbackGenerator(支持三种类型:UIImpactFeedbackStyleUINotificationFeedbackTypeUISelectionFeedback)。

  • 代码示例:

let generator = UIImpactFeedbackGenerator(style: .heavy)
generator.impactOccurred()
Android:
  • 原生 APIVibrator(支持振动强度和模式控制)。

  • 代码示例:

Vibrator vibrator = (Vibrator) getSystemService(VIBRATOR_SERVICE);
vibrator.vibrate(VibrationEffect.createOneShot(100, VibrationEffect.DEFAULT_AMPLITUDE));

18. USB接口(USB Port)

iOS:
  • 限制: 仅支持 MFi 认证外设(需私有 API,无公开方案)。

Android:
  • 原生 APIUsbManager(需 USB Host 模式支持)。

  • 代码示例:

UsbManager manager = (UsbManager) getSystemService(Context.USB_SERVICE);
HashMap<String, UsbDevice> deviceList = manager.getDeviceList();

关键差异总结

模块 iOS Android
摄像头后台使用 禁止 允许(需前台服务)
NFC 功能 仅读取 NDEF 完整读写、模拟卡片
生物识别多样性 Face ID/Touch ID 指纹、面部、虹膜
传感器开放度 限制较多(如光线传感器) 开放更多底层数据
蓝牙类型支持 仅 BLE BLE + 经典蓝牙
USB 外设支持 仅 MFi 认证设备 灵活支持 OTG 外设

通用注意事项

  1. 权限动态请求: 使用 react-native-permissions 处理 iOS 和 Android 的动态权限逻辑。

  2. 后台限制: iOS 对后台硬件使用(如 GPS、蓝牙)限制严格,需明确声明用途。

  3. 设备兼容性: 检测硬件是否支持(如通过 SensorManager.getDefaultSensor 返回 null 表示不支持)。

  4. 性能优化: 高频传感器数据需在 Native 层处理,避免跨桥接层传递导致性能瓶颈。

  5. 法律合规: 涉及用户隐私数据(如面部识别)需遵循 GDPR、CCPA 等法规。