Android适配安卓6.0蓝牙通讯实现过程

Android适配安卓6.0蓝牙通讯实现过程,第1张

概述事先说明:安卓蓝牙需要定位权限申请,在安卓6.0需要用户手动确认权限后才能使用,各位可以自行查询资料实现,如果嫌麻烦,可以用第三方Bmob集成好的工具类进行实现,详细可以看http://blog.csdn.net/qq_30379689/a

事先说明:
安卓蓝牙需要定位权限申请,在安卓6.0需要用户手动确认权限后才能使用,各位可以自行查询资料实现,如果嫌麻烦,可以用第三方Bmob集成好的工具类进行实现,详细可以看http://blog.csdn.net/qq_30379689/article/details/52223244

蓝牙连接过程
1、查询用户是否开启蓝牙。
2、搜索附近的可用的蓝牙。
3、进行蓝牙配对。
4、进行蓝牙连接。
5、获取输入流和输出流。
6、发送消息。

晒上我自己画的美图:


实验效果图:

实现需要的权限:由于安卓4.x以上的版本使用蓝牙,需要开启定位权限才能搜索到附近的蓝牙设备

<uses-permission androID:name="androID.permission.BLUetoOTH"/> <uses-permission androID:name="androID.permission.BLUetoOTH_admin"/>  <uses-permission androID:name="androID.permission.ACCESS_FINE_LOCATION" /> <uses-permission androID:name="androID.permission.ACCESS_COARSE_LOCATION" /> 

服务端

实现思路:
1、拿到本地蓝牙设备。
2、蓝牙之间的通讯需要一个唯一识别UUID来匹配正确的设备,使用UUID获取蓝牙的通讯Socket。
3、开启获取数据的线程

public class MainActivity extends AppCompatActivity implements VIEw.OnClickListener {   BluetoothSocket BTSocket;  BluetoothAdapter BTAdapter;  button bt_start;  TextVIEw tv_msg;  StringBuilder sb;   @OverrIDe  protected voID onCreate(Bundle savedInstanceState) {  super.onCreate(savedInstanceState);  setContentVIEw(R.layout.activity_main);  bt_start = (button) findVIEwByID(R.ID.bt_start);  tv_msg = (TextVIEw) findVIEwByID(R.ID.tv_msg);  bt_start.setonClickListener(this);  sb = new StringBuilder();  //拿到本地蓝牙设备  BTAdapter = BluetoothAdapter.getDefaultAdapter();  }   /**  * UI文本输出  *  * @param msg  */  public voID show(String msg) {  sb.append(msg + "\n");  runOnUiThread(new Runnable() {  @OverrIDe  public voID run() {  tv_msg.setText(sb.toString());  }  });  }   @OverrIDe  public voID onClick(VIEw v) {  //开启服务器  ServerThread startServerThread = new ServerThread();  startServerThread.start();  }   /**  * 开启服务器  */  private class ServerThread extends Thread {  public voID run() {  try {  BluetoothServerSocket mserverSocket = BTAdapter.ListenUsingRfcommWithServiceRecord("btspp",UUID.fromString("00001101-0000-1000-8000-00805F9B34FB"));  show("服务端:等待连接");   BTSocket = mserverSocket.accept();  show("服务端:连接成功");   readThread mreadThread = new readThread();  mreadThread.start();  show("服务端:启动接受数据");  } catch (IOException e) {  e.printstacktrace();  }  }  }   /**  * 读取数据  */  private class readThread extends Thread {  public voID run() {  byte[] buffer = new byte[1024];  int bytes;  inputStream mmInStream = null;  try {  mmInStream = BTSocket.getinputStream();  show("服务端:获得输入流");  } catch (IOException e1) {  e1.printstacktrace();  }  while (true) {  try {   if ((bytes = mmInStream.read(buffer)) > 0) {   byte[] buf_data = new byte[bytes];   for (int i = 0; i < bytes; i++) {   buf_data[i] = buffer[i];   }   String s = new String(buf_data);   show("服务端:读取数据了~~" + s);   }  } catch (IOException e) {   try {   mmInStream.close();   } catch (IOException e1) {   e1.printstacktrace();   }   break;  }  }  }  }  } 

客户端

实现思路:
1、检查是否开启蓝牙。
2、注册一系列蓝牙的广播。
3、由于蓝牙每经过一个阶段都会发送一个广播,根据广播来实现对应的方法。
4、蓝牙配对->蓝牙连接->发送消息(UUID必须相同)

public class MainActivity extends AppCompatActivity implements VIEw.OnClickListener {   private TextVIEw tv_msg;  private button bt_search,bt_send;  private BluetoothSocket BTSocket;  private BluetoothAdapter BTAdapter;  private BluetoothDevice device;  private StringBuilder sb;   @OverrIDe  protected voID onCreate(Bundle savedInstanceState) {  super.onCreate(savedInstanceState);  setContentVIEw(R.layout.activity_main);   bt_search = (button) findVIEwByID(R.ID.bt_search);  bt_send = (button) findVIEwByID(R.ID.bt_send);  tv_msg = (TextVIEw) findVIEwByID(R.ID.tv_msg);  bt_search.setonClickListener(this);  bt_send.setonClickListener(this);  sb = new StringBuilder();   show("客户端:检查BT");  checkBT(this);  show("客户端:注册接收者");  registerBTReceiver();  }   /**  * UI文本输出  *  * @param msg  */  public voID show(String msg) {  sb.append(msg + "\n");  runOnUiThread(new Runnable() {  @OverrIDe  public voID run() {  tv_msg.setText(sb.toString());  }  });  }   @OverrIDe  public voID onClick(VIEw v) {  switch (v.getID()) {  case R.ID.bt_search:  show("客户端:开始寻找设备");  BTAdapter.startdiscovery();  break;  case R.ID.bt_send:  sendMessage();  break;  }  }   /**  * 检查蓝牙  */  public voID checkBT(Context context) {  BTAdapter = BluetoothAdapter.getDefaultAdapter();  if (BTAdapter != null) {  if (!BTAdapter.isEnabled()) {  Intent intent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);  // 设置蓝牙可见性,最多300秒  intent.putExtra(BluetoothAdapter.EXTRA_disCOVERABLE_DURATION,300);  context.startActivity(intent);  }  } else {  System.out.println("本地设备驱动异常!");  }  }   /**  * 开启客户端  */  private class clIEntThread extends Thread {  public voID run() {  try {  //创建一个Socket连接:只需要服务器在注册时的UUID号  BTSocket = device.createRfcommSocketToServiceRecord(UUID.fromString("00001101-0000-1000-8000-00805F9B34FB"));  //连接  show("客户端:开始连接...");  BTSocket.connect();  show("客户端:连接成功");  //启动接受数据  show("客户端:启动接受数据");  readThread mreadThread = new readThread();  mreadThread.start();  } catch (IOException e) {  show("客户端:连接服务端异常!断开连接重新试一试");  e.printstacktrace();  }  }  }   /**  * 读取数据  */  private class readThread extends Thread {  public voID run() {  byte[] buffer = new byte[1024];  int bytes;  inputStream is = null;  try {  is = BTSocket.getinputStream();  show("客户端:获得输入流");  } catch (IOException e1) {  e1.printstacktrace();  }  while (true) {  try {   if ((bytes = is.read(buffer)) > 0) {   byte[] buf_data = new byte[bytes];   for (int i = 0; i < bytes; i++) {   buf_data[i] = buffer[i];   }   String s = new String(buf_data);   show("客户端:读取数据了" + s);   }  } catch (IOException e) {   try {   is.close();   } catch (IOException e1) {   e1.printstacktrace();   }   break;  }  }  }  }   /**  * 发送数据  */  public voID sendMessage() {  if (BTSocket == null) {  Toast.makeText(this,"没有连接",Toast.LENGTH_SHORT).show();  return;  }  try {  OutputStream os = BTSocket.getoutputStream();  os.write("我爱你dahsID132456@#%¥*".getBytes());  os.flush();  show("客户端:发送信息成功");  } catch (IOException e) {  e.printstacktrace();  }  }   /**  * 注册广播  */  public voID registerBTReceiver() {  // 设置广播信息过滤  IntentFilter intentFilter = new IntentFilter();  intentFilter.addAction(BluetoothDevice.ACTION_FOUND);  intentFilter.addAction(BluetoothAdapter.ACTION_disCOVERY_STARTED);  intentFilter.addAction(BluetoothAdapter.ACTION_disCOVERY_FINISHED);  intentFilter.addAction(BluetoothAdapter.ACTION_STATE_CHANGED);  intentFilter.addAction(BluetoothDevice.ACTION_BOND_STATE_CHANGED);  // 注册广播接收器,接收并处理搜索结果  registerReceiver(BTReceive,intentFilter);  }   /**  * 注销广播  */  public voID unregisterBTReceiver() {  unregisterReceiver(BTReceive);  }   @OverrIDe  protected voID onDestroy() {  super.onDestroy();  unregisterBTReceiver();  }   /**  * 广播接收者  */  private broadcastReceiver BTReceive = new broadcastReceiver() {  @OverrIDe  public voID onReceive(Context context,Intent intent) {  String action = intent.getAction();  if (BluetoothDevice.ACTION_FOUND.equals(action)) {  device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);  show("客户端:找到的BT名:" + device.getname());  // 如果查找到的设备符合要连接的设备,处理  if (device.getname().equalsIgnoreCase("xu")) {   show("客户端:配对xu蓝牙:");   // 搜索蓝牙设备的过程占用资源比较多,一旦找到需要连接的设备后需要及时关闭搜索   BTAdapter.canceldiscovery();   // 获取蓝牙设备的连接状态   int connectState = device.getBondState();   switch (connectState) {   // 未配对   case BluetoothDevice.BOND_NONE:   show("客户端:开始配对:");   try {   Method createBondMethod = BluetoothDevice.class.getmethod("createBond");   createBondMethod.invoke(device);   } catch (Exception e) {   e.printstacktrace();   }   break;   // 已配对   case BluetoothDevice.BOND_BONDED:   try {   show("客户端:开始连接:");   clIEntThread clIEntConnectThread = new clIEntThread();   clIEntConnectThread.start();   } catch (Exception e) {   e.printstacktrace();   }   break;   }  }  } else if (BluetoothDevice.ACTION_BOND_STATE_CHANGED.equals(action)) {  // 获取蓝牙设备的连接状态  int connectState = device.getBondState();  // 已配对  if (connectState == BluetoothDevice.BOND_BONDED) {   try {   show("客户端:开始连接:");   clIEntThread clIEntConnectThread = new clIEntThread();   clIEntConnectThread.start();   } catch (Exception e) {   e.printstacktrace();   }  }  }  show(action);  }  }; } 

蓝牙广播内容:

ACTION_STATE_CHANGED   当你蓝牙开启或者关闭的时候发送
ACTION_FOUND  当你匹配到附近蓝牙设备时发送
ACTION_disCOVERY_STARTED  当你开始搜索附近蓝牙设备时发送
ACTION_disCOVERY_FINISHED  当你结束搜索附近蓝牙设备时发送
ACTION_BOND_STATE_CHANGED  当你蓝牙设备匹配状态发生变化时发送

源码下载:http://xiazai.jb51.net/201609/yuanma/Androidrobot(jb51.net).rar

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程小技巧。

总结

以上是内存溢出为你收集整理的Android适配安卓6.0蓝牙通讯实现过程全部内容,希望文章能够帮你解决Android适配安卓6.0蓝牙通讯实现过程所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1148045.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-31
下一篇 2022-05-31

发表评论

登录后才能评论

评论列表(0条)

保存