能否在Android平台React Native应用中运行Java蓝牙适配器功能?如何实现?
React Native Android集成Java蓝牙适配器功能方案
可行性说明
完全可行。React Native(RN)原生支持通过原生模块桥接机制调用Android平台的Java代码,蓝牙适配器属于Android系统核心API,直接通过自定义原生模块即可实现调用。
实现步骤(含环境搭建)
1. 创建Android原生蓝牙模块
打开RN项目的android/app/src/main/java/[你的项目包名]/目录,新建BluetoothModule.java文件,实现蓝牙基础功能:
package com.yourappname; // 替换为你的项目包名 import com.facebook.react.bridge.ReactApplicationContext; import com.facebook.react.bridge.ReactContextBaseJavaModule; import com.facebook.react.bridge.ReactMethod; import com.facebook.react.bridge.Promise; import android.bluetooth.BluetoothAdapter; import android.content.Intent; import android.app.Activity; public class BluetoothModule extends ReactContextBaseJavaModule { private BluetoothAdapter bluetoothAdapter; public BluetoothModule(ReactApplicationContext reactContext) { super(reactContext); bluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); } @Override public String getName() { return "BluetoothModule"; // JS端调用的模块标识名 } // 检查设备是否支持蓝牙 @ReactMethod public void isBluetoothSupported(Promise promise) { promise.resolve(bluetoothAdapter != null); } // 请求开启蓝牙 @ReactMethod public void enableBluetooth(Promise promise) { if (bluetoothAdapter == null) { promise.reject("UNSUPPORTED", "设备不支持蓝牙"); return; } if (!bluetoothAdapter.isEnabled()) { Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); Activity currentActivity = getCurrentActivity(); if (currentActivity != null) { currentActivity.startActivityForResult(enableBtIntent, 1); promise.resolve(true); } else { promise.reject("NO_ACTIVITY", "未找到当前Activity"); } } else { promise.resolve(true); } } }
2. 注册原生模块
同目录下新建BluetoothPackage.java,用于向RN注册上述模块:
package com.yourappname; import com.facebook.react.ReactPackage; import com.facebook.react.bridge.NativeModule; import com.facebook.react.bridge.ReactApplicationContext; import com.facebook.react.uimanager.ViewManager; import java.util.ArrayList; import java.util.Collections; import java.util.List; public class BluetoothPackage implements ReactPackage { @Override public List<NativeModule> createNativeModules(ReactApplicationContext reactContext) { List<NativeModule> modules = new ArrayList<>(); modules.add(new BluetoothModule(reactContext)); return modules; } @Override public List<ViewManager> createViewManagers(ReactApplicationContext reactContext) { return Collections.emptyList(); } }
3. 在RN应用中注册Package
修改android/app/src/main/java/[你的项目包名]/MainApplication.java的getPackages方法:
@Override protected List<ReactPackage> getPackages() { List<ReactPackage> packages = new PackageList(this).getPackages(); // 添加自定义蓝牙Package packages.add(new BluetoothPackage()); return packages; }
4. 配置蓝牙权限
在android/app/src/main/AndroidManifest.xml中添加权限声明:
<!-- 基础蓝牙权限 --> <uses-permission android:name="android.permission.BLUETOOTH" /> <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" /> <!-- Android 12+ 新增权限 --> <uses-permission android:name="android.permission.BLUETOOTH_SCAN" /> <uses-permission android:name="android.permission.BLUETOOTH_CONNECT" /> <!-- 声明设备蓝牙硬件支持 --> <uses-feature android:name="android.hardware.bluetooth" android:required="false" />
5. JS端调用原生模块
在RN的JS组件中引入并调用蓝牙模块:
import { NativeModules, Alert, PermissionsAndroid } from 'react-native'; const { BluetoothModule } = NativeModules; // 动态申请蓝牙权限(Android 6+ 必需) const requestBluetoothPermissions = async () => { const permissions = [ PermissionsAndroid.PERMISSIONS.BLUETOOTH_SCAN, PermissionsAndroid.PERMISSIONS.BLUETOOTH_CONNECT, ]; const granted = await PermissionsAndroid.requestMultiple(permissions); return granted[PermissionsAndroid.PERMISSIONS.BLUETOOTH_SCAN] === PermissionsAndroid.RESULTS.GRANTED && granted[PermissionsAndroid.PERMISSIONS.BLUETOOTH_CONNECT] === PermissionsAndroid.RESULTS.GRANTED; }; // 检查蓝牙支持状态 const checkBluetoothSupport = async () => { try { const isSupported = await BluetoothModule.isBluetoothSupported(); Alert.alert(isSupported ? '设备支持蓝牙' : '设备不支持蓝牙'); } catch (error) { console.error(error); } }; // 请求开启蓝牙 const enableBluetooth = async () => { const hasPermission = await requestBluetoothPermissions(); if (!hasPermission) { Alert.alert('权限不足', '请授予蓝牙相关权限'); return; } try { await BluetoothModule.enableBluetooth(); Alert.alert('蓝牙开启请求已发送'); } catch (error) { Alert.alert('错误', error.message); } };
常见问题排查
- 环境搭建失败:确保Android Studio已安装,
ANDROID_HOME环境变量配置正确,RN版本与gradle版本兼容(可参考RN官方文档的版本对应表)。 - 模块无响应:检查Java文件的包名是否与项目包名一致,
MainApplication是否正确添加了BluetoothPackage,JS端调用的模块名是否与getName()返回值一致。 - 权限失效:Android 12+必须动态申请
BLUETOOTH_SCAN和BLUETOOTH_CONNECT权限,仅静态声明无效。
内容的提问来源于stack exchange,提问作者Atharva Solaskar
相关产品推荐
相关产品推荐

