【公式】React Native BLE Manager
GitHub innoveit / react-native-ble-manager
- React Native BLE Managerインストールします。
npm install react-native-ble-manager
- パーミッションを設定します。Android 12から変更になっています。
[BLUETOOTH]と[BLUETOOTH_ADMIN]は、Android 11( API レベル 30 )の場合に設定します。
[BLUETOOTH_SCAN]はusesPermissionFlags="neverForLocation"を設定して、位置情報を取得しません。
スキャンできるように[BLUETOOTH_CONNECT]を許可します。
android\app\src\main\AndroidManifest.xml
<uses-permission android:name="android.permission.BLUETOOTH" android:maxSdkVersion="30" /> <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" android:maxSdkVersion="30" /> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" android:maxSdkVersion="28"/> <uses-permission-sdk-23 android:name="android.permission.ACCESS_FINE_LOCATION" tools:targetApi="Q"/> <uses-permission android:name="android.permission.BLUETOOTH_SCAN" android:usesPermissionFlags="neverForLocation" /> <uses-permission android:name="android.permission.BLUETOOTH_CONNECT" /> <uses-permission android:name="android.permission.BLUETOOTH_ADVERTISE" />
- インポートします。
import BleManager from 'react-native-ble-manager'; import {NativeEventEmitter, NativeEventEmitter, PermissionsAndroid, Platform} from 'react-native'; const BleManagerModule = NativeModules.BleManager; const bleManagerEmitter = new NativeEventEmitter(BleManagerModule);
- Androidはユーザーの許可をチェックします。
const handleAndroidPermissionCheck = () => { if (Platform.OS === 'android') { if (Platform.Version >= 23 && Platform.Version < 31) { PermissionsAndroid.check( PermissionsAndroid.PERMISSIONS.ACCESS_FINE_LOCATION, ).then(result => { if (result) { console.log('Permission is OK'); } else { PermissionsAndroid.request( PermissionsAndroid.PERMISSIONS.ACCESS_FINE_LOCATION, ).then(result => { if (result) { console.log('User accept'); } else { console.log('User refuse'); } }); } }); } if (Platform.Version >= 31) { PermissionsAndroid.requestMultiple([ PermissionsAndroid.PERMISSIONS.BLUETOOTH_SCAN, PermissionsAndroid.PERMISSIONS.BLUETOOTH_CONNECT, ]).then(result => { if (result) { console.log('User accept'); } else { console.log('User refuse'); } }); } } };
- 初期化します。
useEffect(() => { handleAndroidPermissionCheck(); BleManager.start({showAlert: false}) .then(() => { console.log('BleManager.start'); }) .catch(error => { console.log('BleManager.start Error: ' + error); }); const discoverPeripheral = bleManagerEmitter.addListener( 'BleManagerDiscoverPeripheral', args => { console.log('Discover.'); }, ); const disconnectedPeripheral = bleManagerEmitter.addListener( 'BleManagerDisconnectPeripheral', () => { console.log('Disconnected.'); }, ); return () => { discoverPeripheral.remove(); disconnectedPeripheral.remove(); }; }, []);
- 書き込みます。
const write= async (text) => { await BleManager.connect(UUID); await BleManager.retrieveServices(UUID); await BleManager.write( UUID, SERVICE_UUID, CHARACTERRISTIC_UUID, stringToBytes(text), ); };