java - 我正在做一个项目,它不断地给我以前配对的设备的 RSSI。我没有得到连续的结果
问题描述
该项目应该不断地给我一个已知 MAC 地址的设备的 RSSI。我得到了大约 2-3 次 RSSI,然后什么也没有。即使我在安卓手机上测试这个设备,我也可以绕过谷歌向我抛出的电池限制等。该项目的目标设备将是一个根植的 Android M 设备。
这是我的代码:
private final BroadcastReceiver broadcastReceiver=new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String action=intent.getAction();
if(BluetoothDevice.ACTION_FOUND.equals(action)){
BluetoothDevice device=intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
String deviceName=device.getName();
String deviceHardwareAddress=device.getAddress();
int rssi=intent.getShortExtra(BluetoothDevice.EXTRA_RSSI,Short.MIN_VALUE);
if(deviceHardwareAddress.equals(MAC)){
deviceFound=true;
bluetoothAdapter.cancelDiscovery();
Log.i("broadcastReceiver" , "device " + deviceName);
Log.i("broadcastReceiver" , "hard" + deviceHardwareAddress);
Log.i("broadcastReceiver","Rssi "+rssi);
Log.i("broadcastReceiver","Paired Id "+MAC );
tv.setText(deviceName+" "+rssi);
stringArrayList.add(String.valueOf(rssi));
arrayAdapter.notifyDataSetChanged();
deviceFound=false;
bluetoothAdapter.startDiscovery();
}
if(BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)){
if(deviceFound==false){
bluetoothAdapter.startDiscovery();
}
}
}
}
};
解决方案
解决了!
只需将 BroadcastReceiver 分成两部分即可。请不要在不了解会发生什么的情况下复制此答案。此代码将消耗大量电池。我的项目允许这样做。它会有类似连续电源的东西。它只在某些条件下运行。干杯!
private final BroadcastReceiver broadcastReceiver1=new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String action=intent.getAction();
if(BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)){
if(deviceFound==false) {
bluetoothAdapter.cancelDiscovery();
bluetoothAdapter.startDiscovery();
}
};
}
};
private final BroadcastReceiver broadcastReceiver=new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String action=intent.getAction();
if(BluetoothDevice.ACTION_FOUND.equals(action)){
BluetoothDevice device=intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
String deviceName=device.getName();
String deviceHardwareAddress=device.getAddress();
int rssi=intent.getShortExtra(BluetoothDevice.EXTRA_RSSI,Short.MIN_VALUE);
if(deviceHardwareAddress.equals(MAC)){
deviceFound=true;
bluetoothAdapter.cancelDiscovery();
Log.i("broadcastReceiver" , "device " + deviceName);
Log.i("broadcastReceiver" , "hard" + deviceHardwareAddress);
Log.i("broadcastReceiver","Rssi "+rssi);
Log.i("broadcastReceiver","Paired Id "+MAC );
tv.setText(deviceName+" "+rssi);
deviceFound=false;
bluetoothAdapter.startDiscovery();
}
}
}
};
推荐阅读
- c++ - 如何在 B 类的构造函数中实例化 C++ 类 A,使其对象可用于成员函数
- nanoframework - 我想在 .net NanoFramework 上使用 c++ 代码,我该怎么做?
- typescript - TypeScript:从可区分的联合推断类型以创建地图?
- java - 使用 Schedulers.boundedElastic() 时如何正确登录 webflux?
- java - Sedgewick 的 Shell Sort 是最优的吗?
- javascript - Axios getPosts 错误:意外的令牌,预期的“,”(25:4)
- powershell - 如何使命令在同一个脚本中多次运行
- python - Pyspark:爆炸阵列慢
- python - PyPI 包在所述包中找不到函数
- javascript - 场变化触发功能