对于我的项目,我试图使用react-native应用程序扫描HM-10 BLE。 我正在使用此示例Scanning for Bluetooth devices with React Native。看来我已成功安装了该库,因为在运行代码时我没有收到任何错误。我做了以下步骤。
react-native init reactnativeBLE
npm i --save react-native-ble-manager
npm install
react-native link react-native-ble-manager
react-native run-ios
但是,当我运行示例代码时,找不到任何设备。在我的App.js
文件中,我复制了示例代码:
import React, { Component } from 'react';
import {
AppRegistry,
ListView,
NativeAppEventEmitter,
View,
Text,
Button } from 'react-native';
import BleManager from 'react-native-ble-manager';
// I changed this to export default App
class BluetoothScanner extends Component {
constructor(props){
super(props);
const dataSource = new ListView.DataSource({rowHasChanged: (r1, r2) => r1 !== r2});
this.devices = [];
this.state = {
dataSource: dataSource.cloneWithRows(this.devices)
};
}
componentDidMount() {
console.log('bluetooth scanner mounted');
NativeAppEventEmitter.addListener('BleManagerDiscoverPeripheral',(data) =>
{
let device = 'device found: ' + data.name + '(' + data.id + ')';
if(this.devices.indexOf(device) == -1) {
this.devices.push(device);
}
let newState = this.state;
newState.dataSource = newState.dataSource.cloneWithRows(this.devices);
this.setState(newState);
});
BleManager.start({showAlert: false})
.then(() => {
// Success code
console.log('Module initialized');
});
}
startScanning() {
console.log('start scanning');
BleManager.scan([], 120);
}
render() {
return (
<View style={{padding: 50 }}>
<Text>Bluetooth scanner</Text>
<Button onPress={() => this.startScanning()} title="Start scanning"/>
<ListView
dataSource={this.state.dataSource}
renderRow={(rowData) => <Text>{rowData}</Text>}
/>
</View>
);
}
}
我的问题
为什么单击start scanning
时不能扫描BLE设备?
我需要额外的设置吗?
任何评论或建议将不胜感激!在此先感谢:)
答案 0 :(得分:1)
问题可能是因为见:
(安卓) 将这些行添加到您的 android 清单文件中 在路径下:
<块引用>android/app/src/main/AndroidManifest.xml
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.BLUETOOTH"/>
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />
当你第一次运行你的应用程序时,如果没有尝试运行时权限,设备必须请求权限。 如下图:
if (Platform.OS === 'android' && Platform.Version >= 23) {
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");
}
});
}
});
}
注意事项
在 Android API 29 >= 中,您需要使用“ACCESS_FINE_LOCATION”而不是“ACCESS_COARSE_LOCATION”。
在尝试了很多更改 sdk 版本后,对我来说效果很好。我将 sdk 版本 29 -> 28 降级,问题解决了! 一切看起来都不错,但仍然不起作用尝试降级 sdk 版本。 转到 build.gradle 文件
<块引用>android/build.gradle
buildscript {
ext {
buildToolsVersion = "28.0.3"
minSdkVersion = 18
compileSdkVersion = 28
targetSdkVersion = 28
}
答案 1 :(得分:0)
也许您需要同时打开位置和蓝牙。
答案 2 :(得分:0)
在 Android API 29 >= 中,您需要使用“ACCESS_FINE_LOCATION”而不是“ACCESS_COARSE_LOCATION”。