因为我将有多个应用程序使用相同的实现连接到BLE设备,我试图将该代码移动到模块内。然而,我遇到了一个奇怪的问题,当相同的代码在应用程序内的文件夹内工作时,扫描代码在模块内不起作用。
我用以下代码进行了测试:
import {
BleError,
BleManager,
Device as BlxDevice,
LogLevel,
} from 'react-native-ble-plx';
import { PermissionsAndroid } from 'react-native';
const manager = new BleManager();
manager.setLogLevel(LogLevel.Verbose);
export const tryScan = () => {
console.log('In main app');
PermissionsAndroid.request(
PermissionsAndroid.PERMISSIONS.ACCESS_FINE_LOCATION,
);
PermissionsAndroid.request(
PermissionsAndroid.PERMISSIONS.ACCESS_FINE_LOCATION,
),
manager.startDeviceScan(
null,
{ allowDuplicates: true },
(error: BleError | null, scannedDevice: BlxDevice | null) => {
console.log('Discovered device', scannedDevice);
manager.stopDeviceScan();
},
);
};
在模块内部时,根本不会发现任何设备,当在应用程序中不是作为模块时,它会按预期工作。
模块将本机库作为对等依赖项:
"peerDependencies": {
"react-native": "^0.64.x",
"react-native-ble-plx": "^2.x"
},
应用程序以这种方式包含模块
"dependencies": {
"device-control": "file:../device-control",
},
我已经验证了我在应用的node_modules中有正确的代码。
让我更困惑的是,在应用程序中,使用react-native-ble-plx可以通过manager.onStateChange
监视BLE状态。
我在logcat中没有发现错误,metro中也没有错误。谁能告诉我这个错误的原因是什么?
我也面临着同样的问题。除非您不需要编译SDK,否则我确实从33
下载到31
。还要降级目标SDK。我没有测试过不同的配置,但这个配置适用于我的原型项目。
buildToolsVersion = "29.0.3"
minSdkVersion = 23
compileSdkVersion = 31
targetSdkVersion = 30
我请求这些权限:
const _PERMISSIONS = [
PermissionsAndroid.PERMISSIONS.ACCESS_FINE_LOCATION,
PermissionsAndroid.PERMISSIONS.ACCESS_COARSE_LOCATION,
PermissionsAndroid.PERMISSIONS.BLUETOOTH_SCAN,
PermissionsAndroid.PERMISSIONS.BLUETOOTH_CONNECT
];
if (Platform.OS != "android") return;
const granted = await PermissionsAndroid.requestMultiple(_PERMISSIONS);
AndroidManifest.xml
<!-- Need ACCESS_COARSE_LOCATION or ACCESS_FINE_LOCATION permission in
Android API 23+ -->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
<uses-feature android:name="android.hardware.bluetooth" android:required="true"/>
<uses-feature android:name="android.hardware.bluetooth_le" android:required="true" />