android怎么来判断蓝牙开、关的状态?求代码

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了android怎么来判断蓝牙开、关的状态?求代码相关的知识,希望对你有一定的参考价值。

if (bluetoothAdapter!=null&&bluetoothAdapter.isEnabled()) 这里能判断蓝牙开启的状态 blue_name=bluetoothAdapter.getName(); bluetooth.setText("蓝牙名称:"+blue_name); bluetooth_switch.setChecked(true); isBluetooth=true; else if(bluetoothAdapter==null) bluetooth.setText("蓝牙名称:"); isBluetooth=false; bluetooth_switch.setChecked(false); Toast.makeText(this, "此设备不支持蓝牙", Toast.LENGTH_SHORT).show(); else if(????????????_)这里需要用什么来判断蓝牙已经关闭的状态?

android 蓝牙编程的基本步骤:

     获取蓝牙适配器BluetoothAdapter blueadapter=BluetoothAdapter.getDefaultAdapter(); 

    如果BluetoothAdapter 为null,说明android手机没有蓝牙模块。

    判断蓝牙模块是否开启,blueadapter.isEnabled() true表示已经开启,false表示蓝牙并没启用。

    启动配置蓝牙可见模式,即进入可配对模式Intent in=new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);  

    in.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 200);  

    startActivity(in);  ,200就表示200秒。

    获取蓝牙适配器中已经配对的设备Set<BluetoothDevice> device=blueadapter.getBondedDevices(); 

    还需要在androidManifest.xml中声明蓝牙的权限

 <uses-permission android:name="android.permission.BLUETOOTH" />

 <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />  


接下来就是根据自己的需求对BluetoothAdapter 的操作了。

参考技术A 可以分开判断,bluetoothAdapter!=null 代表本机有蓝牙设备,接着再去判断 isEnabled() 则可以确定是否是开启状态了。 查看原帖>>本回答被提问者采纳 参考技术B android中可以通过以下代码监听蓝牙的开关状态:

BluetoothService.java文件

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.UUID;

import com.dvb.detector.constant.Constant;
import com.dvb.detector.util.StringUtil;
import com.dvb.detector.activity.DeviceConnectActivity;

import android.app.Service;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothSocket;
import android.content.Intent;
import android.os.Binder;
import android.os.IBinder;
import android.util.Log;
import android.widget.Toast;
/**
*
*蓝牙服务
*/
public class BluetoothService extends Service
private static final String NAME_SECURE = "BluetoothSecure";

private static final UUID MY_UUID_SECURE = UUID
.fromString("00001101-0000-1000-8000-00805F9B34FB");

private BluetoothAdapter mAdapter;
/**
* 正在连接的线程,连接成功以后切至ConnectedThread
*/
private ConnectThread mConnectThread;
/**
* 用于连接后的读写操作线程
*/
private ConnectedThread mConnectedThread;
/**
* 当前连接的状态值,分别为以下三个状态值
*/
private int mState;

// 当前连接状态
/**
* 无连接
*/
public static final int STATE_NONE = 0;
/**
* 正在连接
*/
public static final int STATE_CONNECTING = 2;
/**
* 连接成功
*/
public static final int STATE_CONNECTED = 3;

private final IBinder binder = new BluetoothBinder();
/**
* 单片机mac地址
*/
private String address;
/**
* 重连次数设定
*/
private int reConnectCount;
/**
* 最大重连次数
*/
private static final int MAX_RECONNECT_TIMES = 2;

public class BluetoothBinder extends Binder
public BluetoothService getService()
return BluetoothService.this;



@Override
public IBinder onBind(Intent intent)
return binder;


@Override
public int onStartCommand(Intent intent, int flags, int startId)
mAdapter = BluetoothAdapter.getDefaultAdapter();
connectDevice(intent);
mState = STATE_NONE;
return START_REDELIVER_INTENT;


/**
* 连接机器
*
* @param data
*/
private void connectDevice(Intent data)
address = data.getStringExtra("MAC");
// 根据Mac地址获取device
BluetoothDevice device = mAdapter.getRemoteDevice(address);
// 尝试连接该机器
connect(device);

/**
* 发起重连
*/
private void reConnectDevice()
/**
* 最大重连次数之内直接重连,否则跳回至设备选择界面
*/
if (reConnectCount <= MAX_RECONNECT_TIMES)
// Toast.makeText(this, "正在进行蓝牙重连", Toast.LENGTH_LONG).show();
// 根据Mac地址获取device
BluetoothDevice device = mAdapter.getRemoteDevice(address);
// 尝试连接该机器
connect(device);
reConnectCount++;
else
Intent intent = new Intent(this, DeviceConnectActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.putExtra("flag", 1);
/* startActivity(intent);*/



/**
* 和机器连接
*/
public synchronized void connect(BluetoothDevice device)
if (mState == STATE_CONNECTING)
if (mConnectThread != null)
mConnectThread.cancel();
mConnectThread = null;



if (mConnectedThread != null)
mConnectedThread.cancel();
mConnectedThread = null;

mConnectThread = new ConnectThread(device);
mConnectThread.start();
setState(STATE_CONNECTING);


/**
* 连接上机器,开启连接对话管理线程
*/
public synchronized void connected(BluetoothSocket socket, BluetoothDevice device)
if (mConnectThread != null)
mConnectThread.cancel();
mConnectThread = null;


if (mConnectedThread != null)
mConnectedThread.cancel();
mConnectedThread = null;

// 开启连接对话管理线程
mConnectedThread = new ConnectedThread(socket);
mConnectedThread.start();
reConnectCount = 0;
setState(STATE_CONNECTED);


/**
* 停止所有线程
*/
public synchronized void stop()
if (mConnectThread != null)
mConnectThread.cancel();
mConnectThread = null;


if (mConnectedThread != null)
mConnectedThread.cancel();
mConnectedThread = null;


setState(STATE_NONE);


/**
* 异步发送数据
*/
public void write(byte[] out)
ConnectedThread r;
synchronized (this)
if (mState != STATE_CONNECTED)
return;
r = mConnectedThread;

r.write(out);


/**
* 连接失败
*/
private void connectionFailed()
BluetoothService.this.reConnectDevice();
Toast.makeText(this,"蓝牙断开正在重新连接", Toast.LENGTH_LONG).show();


/**
* 连接丢失
*/
private void connectionLost()
BluetoothService.this.reConnectDevice();


private synchronized void setState(int state)
Log.i("xth", "state = " + state);
mState = state;


public synchronized int getState()
return mState;


/**
* 连接线程
*/
private class ConnectThread extends Thread
private final BluetoothSocket mmSocket;

private final BluetoothDevice mmDevice;

public ConnectThread(BluetoothDevice device)
mmDevice = device;
BluetoothSocket tmp = null;
try
tmp = device.createRfcommSocketToServiceRecord(MY_UUID_SECURE);
catch (IOException e)

mmSocket = tmp;


public void run()
// 连接前把耗费资源的搜索功能关闭
mAdapter.cancelDiscovery();

try
mmSocket.connect();
catch (IOException e)
try
mmSocket.close();
catch (IOException e2)

connectionFailed();
return;


// 完成连接,重置连接线程
synchronized (BluetoothService.this)
mConnectThread = null;


connected(mmSocket, mmDevice);


public void cancel()
try
mmSocket.close();
catch (IOException e)




/**
* 已完成配对,处理所有读写消息
*/
private class ConnectedThread extends Thread
private final BluetoothSocket mmSocket;

private final InputStream mmInStream;

private final OutputStream mmOutStream;

public ConnectedThread(BluetoothSocket socket)
mmSocket = socket;
InputStream tmpIn = null;
OutputStream tmpOut = null;

try
tmpIn = socket.getInputStream();
tmpOut = socket.getOutputStream();
catch (IOException e)


mmInStream = tmpIn;
mmOutStream = tmpOut;


public void run()
byte[] buffer = new byte[Constant.BYTES];
int bytes;

byte[] result = new byte[Constant.BYTES];
int resultLenth = 0;
// 持续监听是否收到消息
while (true)
try
//每次接收到20个字节则转换成本地数据结构FPItem存储
bytes = mmInStream.read(buffer);
if (resultLenth < Constant.BYTES && bytes + resultLenth <= Constant.BYTES)
System.arraycopy(buffer, 0, result, resultLenth, bytes);
resultLenth += bytes;


if (resultLenth >= Constant.BYTES)
resultLenth = 0;
StringUtil.list.add(result);

catch (Exception e)
connectionLost();
break;




/**
* 写数据,向单片机输出数据
*/
public void write(byte[] buffer)
try
mmOutStream.write(buffer);
catch (IOException e)



public void cancel()
try
mmSocket.close();
catch (IOException e)




DeviceConnectThread.java文件

import android.app.Activity;
import android.os.Handler;
import android.os.Message;
import android.util.Log;

import com.dvb.detector.constant.Constant;
import com.dvb.detector.service.BluetoothService;
import com.dvb.detector.util.StringUtil;
/**
* 设备连接线程,向单片机发起连接请求
* 我方发送474消息,当接收到单片机返回的“lock=3”消息,表明连接成功
*
*/
public class DeviceConnectThread extends Thread

private Handler handler;

private BluetoothService bluetoothService;

private int readCount;

private boolean stop;

public DeviceConnectThread(Activity activity, Handler handler, BluetoothService bluetoothService)
this.handler = handler;
this.bluetoothService = bluetoothService;


@Override
public void run()
for (int i = 0; i < Constant.DEVICE_ACTIVITY_LIMIT; i++)
bluetoothService.write(StringUtil.getSendData("474"));
readCount = 0;
Log.i("xth","Wait write ");
while (readCount <= Constant.DEVICE_ACTIVITY_EACH_LIMIT)
while (!StringUtil.list.isEmpty())
Log.i("xth","notEmpty");
Message msg = handler.obtainMessage();
msg.obj = StringUtil.list.poll();
msg.what = Constant.CONNECT;
handler.sendMessage(msg);
readCount = Constant.DEVICE_ACTIVITY_EACH_LIMIT + 1;

try
sleep(Constant.DEVICE_ACTIVITY_SLEEP_TIME);
catch (InterruptedException e)
e.printStackTrace();

if (readCount++ > Constant.DEVICE_ACTIVITY_EACH_LIMIT)
return;




if (!stop)
Message msg1 = handler.obtainMessage();
msg1.what = Constant.CONNECT_FAIL;
handler.sendMessage(msg1);



public void cancel()
stop = true;

微信小程序--蓝牙连接开发总结

这个模块做了2周,找了很多资料文档,看示例看别人的demo,最后发现其实还是得靠自己,不吐槽了,开正文。我实现的小程序模块自动连接(根据需要,可改手动),是在小程序初始化完成时开始自动调用执行。

大致流程:

1、 开启蓝牙适配
2、 获取蓝牙适配器状态,判断设备蓝牙是否可用。
3、 判断蓝牙适配器可用时开启扫描蓝牙设备和开启获取已连接的蓝牙设备
4、 如果开启扫描蓝牙设备失败5s后自动再次开启扫描
5、 开启扫描蓝牙设备成功后开启监听已扫描的设备
6、 如果已扫描到的新设备含FeiZhi名(个人产品需要)的设备则开始连接该设备
7、 开启获取已连接蓝牙设备开启获取设备成功后判断以获取的设备名包含FeiZhi(个人产品需要)字符串的设备则开始连接该设备
8、 开始获取已连接蓝牙设备没有成功获取到已连接的蓝牙设备5s后自动重新开启获取。
9、 开始连接某设备时停止扫描设备,停止循环获取已连接设备。
10、连接成功后停止扫描设备,停止循环获取已连接设备。

点击查看:蓝牙模块连接流程图

1、app.js的onLaunch() 方法里中调用开启连接 this.startConnect();弹出提示框,开启适配,如果失败提示设备蓝牙不可用,同时开启蓝牙适配器状态监听

startConnect: function () {

 var that = this;

 wx.showLoading({

 title: ‘开启蓝牙适配‘

 });

 wx.openBluetoothAdapter({

 success: function (res) {

 console.log("初始化蓝牙适配器");

 console.log(res);

 that.getBluetoothAdapterState();

 },

 fail: function (err) {

 console.log(err);

 wx.showToast({

 title: ‘蓝牙初始化失败‘,

 icon: ‘success‘,

 duration: 2000

 })

 setTimeout(function () {

 wx.hideToast()

 }, 2000)

 }

 });

 wx.onBluetoothAdapterStateChange(function (res) {

 var available = res.available;

 if (available) {

 that.getBluetoothAdapterState();

 }

 })

 }

2、初始化蓝牙适配器成功,调用this.getBluetoothAdapterState() 获取本机蓝牙适配器状态,判断是否可用,available为false则因为用户没有开启系统蓝牙。同时判断程序还没有开始搜索蓝牙设备,调用this.startBluetoothDevicesDiscovery();开始扫描附近的蓝牙设备,同时调用this.getConnectedBluetoothDevices() 开启获取本机已配对的蓝牙设备。

getBluetoothAdapterState: function () {

 var that = this;

 wx.getBluetoothAdapterState({

 success: function (res) {

 var available = res.available,

 discovering = res.discovering;

 if (!available) {

 wx.showToast({

 title: ‘设备无法开启蓝牙连接‘,

 icon: ‘success‘,

 duration: 2000

 })

 setTimeout(function () {

 wx.hideToast()

 }, 2000)

 } else {

 if (!discovering) {

 that.startBluetoothDevicesDiscovery();

 that.getConnectedBluetoothDevices();

 }

 }

 }

 })

 }

3、开始搜索蓝牙设备startBluetoothDevicesDiscovery() , 提示蓝牙搜索。

startBluetoothDevicesDiscovery: function () {

 var that = this;

 wx.showLoading({

 title: ‘蓝牙搜索‘

 });

 wx.startBluetoothDevicesDiscovery({

 services: [],

 allowDuplicatesKey: false,

 success: function (res) {

 if (!res.isDiscovering) {

 that.getBluetoothAdapterState();

 } else {

 that.onBluetoothDeviceFound();

 }

 },

 fail: function (err) {

 console.log(err);

 }

 });

 }

4、获取已配对的蓝牙设备。此方法特别说明参数services(Array)是必填的,但是官方示例中以及各种坑爹demo里从没见过有谁填写,但是不填写这个属性此方法无法获取到任何已配对设备。如果要调用此方法则是需要连接特定设备,并且知道该设备的一个主服务serviceId。如果未知可以先手动连接一次想要连接的设备,然后获取service列表,记录属性primary为true的值至少一个。

getConnectedBluetoothDevices: function () {

 var that = this;

 wx.getConnectedBluetoothDevices({

 services: [that.serviceId],

 success: function (res) {

 console.log("获取处于连接状态的设备", res);

 var devices = res[‘devices‘], flag = false, index = 0, conDevList = [];

 devices.forEach(function (value, index, array) {

 if (value[‘name‘].indexOf(‘FeiZhi‘) != -1) {

 // 如果存在包含FeiZhi字段的设备

 flag = true;

 index += 1;

 conDevList.push(value[‘deviceId‘]);

 that.deviceId = value[‘deviceId‘];

 return;

 }

 });

 if (flag) {

 this.connectDeviceIndex = 0;

 that.loopConnect(conDevList);

 } else {

 if (!this.getConnectedTimer) {

 that.getConnectedTimer = setTimeout(function () {

 that.getConnectedBluetoothDevices();

 }, 5000);

 }

 }

 },

 fail: function (err) {

 if (!this.getConnectedTimer) {

 that.getConnectedTimer = setTimeout(function () {

 that.getConnectedBluetoothDevices();

 }, 5000);

 }

 }

 });

 }

5、开启蓝牙搜索功能失败,则回到第2步重新检查蓝牙是适配器是否可用,开启蓝牙搜索功能成功后开启发现附近蓝牙设备事件监听。this.onBluetoothDeviceFound()

onBluetoothDeviceFound: function () {

 var that = this;

 console.log(‘onBluetoothDeviceFound‘);

 wx.onBluetoothDeviceFound(function (res) {

 console.log(‘new device list has founded‘)

 console.log(res);

 if (res.devices[0]) {

 var name = res.devices[0][‘name‘];

 if (name != ‘‘) {

 if (name.indexOf(‘FeiZhi‘) != -1) {

 var deviceId = res.devices[0][‘deviceId‘];

 that.deviceId = deviceId;

 console.log(that.deviceId);

 that.startConnectDevices();

 }

 }

 }

 })

 }

此方法可自定义过滤一些无效的蓝牙设备比如name为空的,个人产品开发中需要过滤devices name 不含有FeiZhi字符串的设备。

6、在第5步中发现了某个想配对的设备,则获取到该设备的deviceId,然后开始配对该设备 this.startConnectDevices()。

startConnectDevices: function (ltype, array) {

 var that = this;

 clearTimeout(that.getConnectedTimer);

 that.getConnectedTimer = null;

 clearTimeout(that.discoveryDevicesTimer);

 that.stopBluetoothDevicesDiscovery();

 this.isConnectting = true;

 wx.createBLEConnection({

 deviceId: that.deviceId,

 success: function (res) {

 if (res.errCode == 0) {

 setTimeout(function () {

 that.getService(that.deviceId);

 }, 5000)

 }

 },

 fail: function (err) {

 console.log(‘连接失败:‘, err);

 if (ltype == ‘loop‘) {

 that.connectDeviceIndex += 1;

 that.loopConnect(array);

 } else {

 that.startBluetoothDevicesDiscovery();

 that.getConnectedBluetoothDevices();

 }

 },

 complete: function () {

 console.log(‘complete connect devices‘);

 this.isConnectting = false;

 }

 });

 }

开启连接后为了避免出现冲突,一旦开启连接则终止扫描附近蓝牙设备,终止读取本机已配对设备。

7、连接成功后根据deiviceId获取设备的所有服务。this.getService(deviceId);
getService: function (deviceId) {

 var that = this;

 // 监听蓝牙连接

 wx.onBLEConnectionStateChange(function (res) {

 console.log(res);

 });

 // 获取蓝牙设备service值

 wx.getBLEDeviceServices({

 deviceId: deviceId,

 success: function (res) {

 that.getCharacter(deviceId, res.services);

 }

 })

 }

8、读取服务的特征值。

getCharacter: function (deviceId, services) {

 var that = this;

 services.forEach(function (value, index, array) {

 if (value == that.serviceId) {

 that.serviceId = array[index];

 }

 });

 wx.getBLEDeviceCharacteristics({

 deviceId: deviceId,

 serviceId: that.serviceId,

 success: function (res) {

 that.writeBLECharacteristicValue(deviceId, that.serviceId, that.characterId_write);

 that.openNotifyService(deviceId, that.serviceId, that.characterId_read);

 },

 fail: function (err) {

 console.log(err);

 },

 complete: function () {

 console.log(‘complete‘);

 }

 })

 }

9、如果扫描到的设备中没有想要连接的设备,可以尝试使用系统蓝牙手动配对,然后再小程序中调用getConnectedBluetoothDevices() 获取本机已配对的蓝牙设备,然后过滤设备(可能获取多个已配对的蓝牙设备)。将以获取的蓝牙设备deviceId放入到一个数组中调用自定义方法this.loopConnect(); 思路:通过递归调用获取已配对蓝牙设备的deviceId,如果获取到了就去连接,devicesId[x] 为空说明上传调用getConnectedBluetoothDevices()时获取到的已配对设备全部连接失败了。则开启重新获取已配对蓝牙设备,并开启扫描附近蓝牙设备。

loopConnect: function (devicesId) {

 var that = this;

 var listLen = devicesId.length;

 if (devicesId[this.connectDeviceIndex]) {

 this.deviceId = devicesId[this.connectDeviceIndex];

 this.startConnectDevices(‘loop‘, devicesId);

 } else {

 console.log(‘已配对的设备小程序蓝牙连接失败‘);

 that.startBluetoothDevicesDiscovery();

 that.getConnectedBluetoothDevices();

 }

 }

10、**startConnectDevices(‘loop‘, array)方法,是当获取已配对蓝牙设备进行连接时这样调用。其中的处理逻辑上文已经贴出,意思就是在连接失败后fail方法里累加一个全局变量,然后回调loopConnect(array)方法。

**11、手动连接,上文介绍的方法是为了直接自动连接,如果不需要自动连接,可在使用方法getBluetoothDevices() 将会获取到已扫描到的蓝牙设备的列表,可以做个页面显示出设备名,点击该设备开始连接。

注意:

1、that.serviceId 是在初始化时设置的,由于对需要连接设备的主服务serivceId和各种特征值都是已知的因此可以这样做。如果不可知可以做一个扫描方法自己检查特征值的用途。

2、 连接成功后的writeBLECharacteristicValue和openNotifyService操作需要注意,如果同时开启这两项操作要先调用wirte再开启notify(原因未知,个人心得)。

3、经人提醒还可以再完善一下在onBlueToothAdapterStateChange()**可以监听蓝牙适配器状态,以此判断连接过程中或连接后用户开关了设备蓝牙,如果判断到关了蓝牙提示请开启,如果监听到开启了,就重新回到第1步。

最后本文属于个人开发者的一点总结,欢迎留言指导讨论,也可以加入微信小程序联盟群一起探讨学习。

以上是关于android怎么来判断蓝牙开、关的状态?求代码的主要内容,如果未能解决你的问题,请参考以下文章

Android 蓝牙开发-打开蓝牙后能不能立即连接固定地址的蓝牙设备??还是需要进行判断啥的?

哪位清楚android判断蓝牙是不是连接

Android蓝牙开发(二)经典蓝牙消息传输实现

android 怎么判断连接了那个蓝牙耳机

Android怎么检测蓝牙的连接状态?如果一段断开,我这边怎么检测得到?

android 怎么查看蓝牙设备