android 蓝牙模块遇到的问题,关闭蓝牙以后下次不能正常连接
2013-08-27 09:43
351 查看
我做的是一个蓝牙连接单片机的移动终端,这个项目里我们有这个需求,就是这次连接的设备,下次再启动程序能够记住 上次连接的,然后自动连接,这个比较简单主要是用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,那么系统已经有一个保护蓝牙适配器被关闭的问题—比如该适配器已经被关闭了。
需要
返回值
如果蓝牙适配器的停止进程已经开启则返回true,如果产生错误则返回false。
public boolean enable ()
打开本地蓝牙适配器—不能在没有明确打开蓝牙的用户动作中使用。
该方法将为基础的蓝牙硬件供电,并且启动所有的蓝牙系统服务。
没有用户的直接同意,蓝牙永远不能被禁止。如果用户为了创建无线连接而打开了蓝牙模块,则其需要ACTION_REQUEST_ENABLE值,该值将提出 一个请求用户允许以打开蓝牙模块的会话。这个enable()值只提供了一个应用,该应用包含了一个改变系统设置的用户界面(例如“电源控制”应用)。
这是一个异步调用方法:该方法将马上获得返回值,用户要通过监听ACTION_STATE_CHANGED值来获取随后的适配器状态改变的通知。如果该调用 返回true值,则该适配器状态会立刻从STATE_OFF转向STATE_TURNING_ON,稍后则会转为STATE_OFF或者 STATE_ON。如果该调用返回false,那么说明系统已经有一个保护蓝牙适配器被打开的问题—比如飞行模式,或者该适配器已经被打开。
需要
返回值
如果蓝牙适配器的打开进程已经开启则返回true,如果产生错误则返回false。
通过观看api 可以知道 ,关闭和开启是一个异步的方法,什么是异步?就跟线程差不多,为什么用线程,因为他执行需要时间。哦,这样我们就明白了,应该是我们上次关闭了蓝牙,这次进入蓝牙正在打开过程中,所以连接设备报错。知道问题所在,解决问题就好办了,方法千千万,这个是我的解决方法。
还是先给万能的api 截图一下
public int getState ()
获取本地蓝牙适配器的当前状态
可能值有 STATE_OFF, STATE_TURNING_ON, STATE_ON, STATE_TURNING_OFF.
需要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分钟。
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分钟。
相关文章推荐
- Android蓝牙4.0 关闭蓝牙重开无法根据地址连接问题
- Android中连接蓝牙设备时遇到createRfcommSocketToServiceRecord的UUID问题和BluetoothSocket的connect失败
- Android解决4.2的listview setadapter以后不能添加头布局的问题
- 解决导入android工程后main.xml Graphical Layout不能正常显示的问题
- Android 6.0 解决recyclerview 在 scrollview 中不能全部显示,高度不正常的问题
- 修复LinuxMint18.3, Ubuntu 16.04不能连接蓝牙鼠标的问题
- BluetoothAdapter在Android6.0/7.0+以上startDiscovery不能发现蓝牙设备问题
- 客户端putty xshell连接linux中vim不能正常使用小键盘的问题
- 移植 android, touch screen 不能正常工作的问题
- android上实现蓝牙透传时遇到点问题
- Android/iOS/Unity与BLE蓝牙设备连接失败问题指南
- android真机调试问题 Adb connection Error:远程主机强迫关闭了一个现有的连接
- android 开发中遇到的错误及解决方式(更新R.java文件不能自动更新问题)
- oracle安装中遇到的问题 修改计算机名后不能连接
- Android手机靠近蓝牙模块自动连接蓝牙模块,断后自动重连。也可以手机靠近手机自动连接。连接成功率百分之百,可后台运行
- Android 6.0 解决recyclerview 在 scrollview 中不能全部显示,高度不正常的问题
- Android webview 加载三方连接的不能下载文件问题
- Android WebView加载https页面不能正常显示资源问题
- android 部署环境的时候遇到不能创建页面的问题
- HTTP连接不能及时关闭导致连接堆积的问题