android 蓝牙模块遇到的问题,关闭蓝牙以后下次不能正常连接

   我做的是一个蓝牙连接单片机的移动终端,这个项目里我们有这个需求,就是这次连接的设备,下次再启动程序能够记住 上次连接的,然后自动连接,这个比较简单主要是用xml保存读取设备地址,  大家都知道蓝牙一直开着是很耗电的,所以我的程序在退出的时候添加了

if (btAdapter.isEnabled()) {
btAdapter.disable();
}

这句代码是如果蓝牙开启,那么就关闭它,

本来我以为这样就好了,没想到又遇到了新的问题。

那就是以前实现的功能,开机自动连接上次的设备出现了连接异常,这个异常真的很奇怪,我自己debug调试的时候就没有,直接运行就必出!  自己很苦恼,最后还是看api解决了问题,原来是这样的


public boolean disable ()

  关闭本地蓝牙适配器不能在没有明确关闭蓝牙的用户动作中使用。

  这个方法友好地停止所有的蓝牙连接,停止蓝牙系统服务,以及对所有基础蓝牙硬件进行断电。

  没有用户的直接同意,蓝牙永远不能被禁止。这个disable()方法只提供了一个应用,该应用包含了一个改变系统设置的用户界面(例如电源控制应用)。

  是一个异步调用方法:该方法将马上获得返回值,用户要通过监听ACTION_STATE_CHANGED值来获取随后的适配器状态改变的通知。如果该调用 返回true值,则该适配器状态会立刻从STATE_ON转向STATE_TURNING_OFF,稍后则会转为STATE_OFF或者 STATE_ON。如果该调用返回false,那么系统已经有一个保护蓝牙适配器被关闭的问题比如该适配器已经被关闭了。

  需要BLUETOOTH_ADMIN权限。

                 返回值

  如果蓝牙适配器的停止进程已经开启则返回true,如果产生错误则返回false

 

  public boolean enable ()

           打开本地蓝牙适配器不能在没有明确打开蓝牙的用户动作中使用。

  该方法将为基础的蓝牙硬件供电,并且启动所有的蓝牙系统服务。

  没有用户的直接同意,蓝牙永远不能被禁止。如果用户为了创建无线连接而打开了蓝牙模块,则其需要ACTION_REQUEST_ENABLE值,该值将提出 一个请求用户允许以打开蓝牙模块的会话。这个enable()值只提供了一个应用,该应用包含了一个改变系统设置的用户界面(例如电源控制应用)。

  这是一个异步调用方法:该方法将马上获得返回值,用户要通过监听ACTION_STATE_CHANGED值来获取随后的适配器状态改变的通知。如果该调用 返回true值,则该适配器状态会立刻从STATE_OFF转向STATE_TURNING_ON,稍后则会转为STATE_OFF或者 STATE_ON。如果该调用返回false,那么说明系统已经有一个保护蓝牙适配器被打开的问题比如飞行模式,或者该适配器已经被打开。

  需要BLUETOOTH_ADMIN权限。

  返回值    

  如果蓝牙适配器的打开进程已经开启则返回true,如果产生错误则返回false

 



通过观看api 可以知道 ,关闭和开启是一个异步的方法,什么是异步?就跟线程差不多,为什么用线程,因为他执行需要时间。哦,这样我们就明白了,应该是我们上次关闭了蓝牙,这次进入蓝牙正在打开过程中,所以连接设备报错。知道问题所在,解决问题就好办了,方法千千万,这个是我的解决方法。

还是先给万能的api 截图一下

 public int getState ()

  获取本地蓝牙适配器的当前状态

  可能值有 STATE_OFF, STATE_TURNING_ON, STATE_ON, STATE_TURNING_OFF. 
需要BLUETOOTH

  需要BLUETOOTH权限。

             返回值

   蓝牙适配器的当前状态



用这个方法获取蓝牙当前的状态,然后再下面进行判断

private Runnable clientRun = new Runnable() {


public void run() {


try {
int statue=btAdapter.getState();
switch (statue) {
case BluetoothAdapter.STATE_TURNING_ON:
Log.e("1", "正在打开蓝牙");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

break;


case BluetoothAdapter.STATE_ON:
Log.e("1", "蓝牙已经打开");
break;
}
initSocket();

if (btSocket != null) {
btSocket.connect();
g_bakBluetoothOK = true;
} else {
Message msg = new Message();
msg.what = 3;
mHandler.sendMessage(msg);
Log.e("1", "出现错误");
}


} catch (IOException e) {
// TODO Auto-generated catch block
// btSocket = null;
Message msg = new Message();
msg.what = 3;
mHandler.sendMessage(msg);
Log.e("1", "出现错误"+e);
e.printStackTrace();
}


// check();
if (g_bakBluetoothOK) {
Message msg = new Message();
msg.what = 2;
mHandler.sendMessage(msg);
}
// }


}
};


先获取蓝牙当前的状态如果是正在打开过程中,那么就等1秒在连接,如果是已经打开就直接连接。 OK问题就这么解决了。哎,很简单的。找到问题2小时解决问题2分钟。



  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android蓝牙模块是指在Android设备上用于支持蓝牙功能的硬件和软件组件。通过蓝牙模块Android设备可以与其他蓝牙设备进行通信和交互。 以下是关于Android蓝牙模块的介绍和演示: 1. 获取BluetoothAdapter对象: ```java BluetoothAdapter mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); ``` 这个方法返回一个BluetoothAdapter对象,用于管理设备的蓝牙功能。 2. 检查设备是否支持蓝牙: ```java if (mBluetoothAdapter == null) { showToast("没有发现蓝牙模块"); return; } ``` 通过判断BluetoothAdapter对象是否为null,可以确定设备是否支持蓝牙功能。 3. 打开或关闭蓝牙: ```java if (!mBluetoothAdapter.isEnabled()) { Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT); } ``` 可以使用isEnabled()方法检查蓝牙是否已经打开。如果蓝牙未打开,可以通过ACTION_REQUEST_ENABLE意图请求用户打开蓝牙。 4. 搜索蓝牙设备: ```java mBluetoothAdapter.startDiscovery(); ``` 使用startDiscovery()方法开始搜索附近的蓝牙设备。 5. 连接蓝牙设备: ```java BluetoothDevice device = mBluetoothAdapter.getRemoteDevice(address); BluetoothSocket socket = device.createRfcommSocketToServiceRecord(uuid); socket.connect(); ``` 可以使用getRemoteDevice()方法获取要连接蓝牙设备对象,然后使用createRfcommSocketToServiceRecord()方法创建一个BluetoothSocket对象,并使用connect()方法连接到设备。 6. 发送和接收数据: ```java OutputStream outputStream = socket.getOutputStream(); outputStream.write(data); InputStream inputStream = socket.getInputStream(); byte[] buffer = new byte[1024]; int bytesRead = inputStream.read(buffer); ``` 可以使用getOutputStream()方法获取输出流,然后使用write()方法发送数据。使用getInputStream()方法获取输入流,然后使用read()方法接收数据。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值