Android开发Bug记录及解决方法(二)————物联网相关

此博客长期更新,记录开发过程中遇到的一些坑,欢迎各路开发大神在评论区补充!

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上接收时会自动将数据截断,并添加换行符
原因分析:原因目前未知(有知道的大佬烦请评论区告知下)
解决方法:由于无法从原理上确定出现问题的原因,所以这里只提供一种治标不治本的解决方案:在传送的数据前部和后部各添加一定无意义字符(这里我经过测试采用的是前后各三个字符),这样每次丢失的会是无意义字符,真正的数据可以得到保留,在接收端再将数据读取出来即可

你可能感兴趣的:(Android进阶)