此博客长期更新,记录开发过程中遇到的一些坑,欢迎各路开发大神在评论区补充!
1.
情况描述:APP安装后部分手机扫描不到指定蓝牙设备
报错信息:无报错
出错原因:部分机型扫描蓝牙设备时需要位置信息支持(经测试,小米、一加均需要位置信息)
解决方案:添加申请位置权限
2.
项目场景:通过蓝牙芯片(HC-05)与手机APP通信,每隔5s传输一批传感器数据(不是很大)
情况描述:数据传输过程中数据不时出现丢失的情况,偶尔会丢失一部分数据
APP中接收数据代码:
@Override
public void run() {
bytes = mmInStream.read(buffer);
mHandler.obtainMessage(READ_DATA, bytes, -1, buffer).sendToTarget();
}
/*Handler中代码,Handler创建在上面,代码片段里没有截取*/
mHandler = new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
//处理消息
switch (msg.what) {
case READ_DATA:
String data = null;
if (msg.obj == null)
data = "暂无数据";
else{
byte[] readBuf = (byte[]) msg.obj;
data = new String(readBuf, 0, msg.arg1);
showAll(data); //显示数据
}
default:
break;
}
}
};
原因分析:Handler发送消息有两种方式,分别是Handler.obtainMessage()和Handler.sendMessage(),其中obtainMessage方式当数据量过大时,由于MessageQuene大小也有限,所以当message处理不及时时,会造成先传的数据被覆盖,进而导致数据丢失
解决方案:新建一个Message对象,并将读取到的数据存入Message,然后mHandler.obtainMessage(READ_DATA, bytes, -1, buffer).sendToTarget();换成mHandler.sendMessage();,代码如下:
Message msg = Message.obtain();
msg.what = READ_DATA;
msg.obj = final_data; //final_data就是从蓝牙中读取到的字符串
mHandler.sendMessage(msg);
3.
项目场景:通过蓝牙芯片(HC-05)与手机APP通信,每隔5s传输一批传感器数据(不是很大)
问题描述:单片机传送过来的一个浮点型数据,但在APP上接收时会自动将数据截断,并添加换行符
原因分析:原因目前未知(有知道的大佬烦请评论区告知下)
解决方法:由于无法从原理上确定出现问题的原因,所以这里只提供一种治标不治本的解决方案:在传送的数据前部和后部各添加一定无意义字符(这里我经过测试采用的是前后各三个字符),这样每次丢失的会是无意义字符,真正的数据可以得到保留,在接收端再将数据读取出来即可