Android 蓝牙操作详解_移动开发_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > 移动开发 > Android 蓝牙操作详解

Android 蓝牙操作详解

 2014/7/2 13:22:37  幕三少  程序员俱乐部  我要评论(0)
  • 摘要:1.启用蓝牙并使设备处于可发现状态1.1在使用BluetoothAdapter类的实例进操作之前,应启用isEnable()方法检查设备是否启用了蓝牙适配器。//使用意图提示用户启用蓝牙,并使设备处于可发现状态privatevoidstartBluetooth(){BluetoothAdapterbt=BluetoothAdapter.getDefaultAdapter();//检测蓝牙是否开启if(!bt.isEnabled()){IntentenableIntent=newIntent
  • 标签:android 详解 操作

1.启用蓝牙并使设备处于可发现状态    


   1.1 在使用BluetoothAdapter类的实例进操作之前,应启用isEnable()方法检查设备是否启用了蓝牙适配器。       // 使用意图提示用户启用蓝牙,并使设备处于可发现状态      private void startBluetooth() {           BluetoothAdapter bt = BluetoothAdapter.getDefaultAdapter();            // 检测蓝牙是否开启            if (!bt.isEnabled()) {               Intent enableIntent = new Intent(                         BluetoothAdapter. ACTION_REQUEST_ENABLE);               startActivityForResult(enableIntent, REQUEST_ENABLE_BT);           }      }  1.2返回意图活动时,调用onActivityResult(),可以提取主设备名称和mac地址    protected void onActivityResult(int requestCode, int resultCode, Intent data) {            if (requestCode == REQUEST_ENABLE_BT                    && resultCode == Activity. RESULT_OK) {               BluetoothAdapter bt = BluetoothAdapter.getDefaultAdapter();               String address = bt.getAddress();               String name = bt.getName();               String toastText = name + " :" + address;               Toast. makeText(this, toastText, Toast.LENGTH_LONG).show();               discoverable();           }      } 1.3 请求用户授权,让设备可被其它临近设备发现:      // 请求用户授权,让设备在120秒内处于可发现状态      private void discoverable() {           Intent discoverableIntent = new Intent(                     BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);           startActivity(discoverableIntent);      }

 

2.连接启用蓝牙设备

   2.1对于任何蓝牙应用,都必须在AndroidManifst.xml中添加如下权限:      <uses-permission android:name"android.permission.BLUETOOTH_ADMIN" />      <uses-permission android:name"android.permission.BLUETOOTH" />    2.2 创建到其他蓝牙设备的套接字连接      我们应该在一个线程内持续监听套接字流中的数据。可以在该线程外写入连接的流。这种连接是一个阻塞调用,由于蓝牙设备发现是一个缓慢的过程,可能降低连接速率。所以,在连接其它设备之前要取消设备发现。      蓝牙套接字连接时阻塞调用,只在连接成功或者连接设备发生异常时才会返回。BluetoothConnection一经实例化,就会创建到其他设备的连接,并开始监听来自连接设备的数据。 package com.example.blueoothdemo;

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

import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothSocket;

/**
* 读写蓝牙设备
*
* @author hbbliyong
*
*/
public class BluetoothConnecion extends Thread {
     private final BluetoothSocket mSocket;
     private final InputStream mInStream;
     private final OutputStream mOutStream;
     byte[] buffer;
     private final BluetoothAdapter mAdapter;
     // 用于本应用程序唯一的UUID,
     private static final UUID MY_UUID = UUID
               .fromString("fa87c0d0-afac-11de-8a39-0800200c9a66");

     public BluetoothConnecion(BluetoothDevice device) {
          BluetoothSocket tmp = null;
          mAdapter = BluetoothAdapter.getDefaultAdapter();
          // 获得用于指定蓝牙连接的BluetoothSocket
          try {
               tmp = device.createRfcommSocketToServiceRecord(MY_UUID);
          } catch (Exception e) {
               e.printStackTrace();
          }
          mSocket = tmp;

          // 在新线程中建立套接字连接,避免FC
          Thread connectionThread = new Thread(new Runnable() {
               @Override
               public void run() {
                    // TODO Auto-generated method stub
                    // 始终取消发现,因为它会降低连接的速度
                    mAdapter.cancelDiscovery();

                    // 建立到BluetoothSocket的连接
                    try {
                         // 这是一个阻塞调用,只在成功连接或者异常时返回
                         mSocket.connect();
                    } catch (Exception e) {
                         e.printStackTrace();
                         // 设备连接失败,关闭套接字
                         try {
                              mSocket.close();
                         } catch (Exception e2) {
                              // TODO: handle exception
                              e2.printStackTrace();
                         }
                    }
               }
          });

          connectionThread.start();

          InputStream tmpIn = null;
          OutputStream tmpOut = null;

          // 获得BluetoothSoket输入输出流
          try {
               tmpIn = mSocket.getInputStream();
               tmpOut = mSocket.getOutputStream();
               buffer = new byte[1024];
          } catch (Exception e) {
               e.printStackTrace();
          }
          mInStream = tmpIn;
          mOutStream = tmpOut;
     }

     public void run() {
          // 连接时保持监听InputStream
          while (true) {
               try {
                    // 从套接字流读取数据
                    mInStream.read(buffer);
                    // 向UI Activity发送获取的数据
               } catch (Exception e) {
                    // TODO: handle exception
                    // 这里的异常标志着连接的丢失
                    // 向UI Activity发送获取的数据
                    break;
               }
          }
     }
    
     public void write(byte[] buffer)
     {
          try {
               mOutStream.write(buffer);
          } catch (Exception e) {
               e.printStackTrace();
          }
     }
    
     public void cancel()
     {
          try {
               mSocket.close();
          } catch (Exception e) {
               // TODO: handle exception
               e.printStackTrace();
          }
     }
}  

3.监听和接收蓝牙连接请求

       在两个蓝牙设备交互之前,其中一个通信设备必须起服务器的作用。它获取一个BluetoothServerSocket实例并监听入站请求。这个实例通过调用蓝牙适配器上的listenUsingRfcommWithServiceRecord()方法获得。有了这个实例我们可以通过start()方法开始监听来自远程设备的入站请求。     //使主设备处于可发现状态   Intent disCoverableIntent = new Intent(                       BluetoothAdapter. ACTION_REQUEST_DISCOVERABLE);   startActivityForResult(disCoverableIntent,DISCOVERY_REQUEST_BLUETOOTH );     //创建一个蓝牙服务器并接受连接 protected void onActivityResult(int requestCode, int resultCode, Intent data) {              if (requestCode == DISCOVERY_REQUEST_BLUETOOTH ) {                boolean isDiscoverable = resultCode > 0;                if (isDiscoverable) {                     // UUID                     // uuid=UUID.fromString("a60f35f0-b93a-11de-8a39-08002009c666");                     final UUID uuid = UUID.randomUUID();                     final String serverName = "BTServer" ;                     final BluetoothAdapter bt = BluetoothAdapter.getDefaultAdapter();                       final BluetoothServerSocket bluetoothServer;                      Thread listenThread = new Thread(new Runnable() {                            @Override                          public void run() {                               // TODO Auto-generated method stub                               try {                                   bluetoothServer = bt.listenUsingRfcommWithServiceRecord(serverName, uuid);                     BluetoothSocket serverSocket = bluetoothServer.accept();                     myHandleConnectionWiht(serverSocket);                                } catch (Exception e) {                                   e.printStackTrace();                                                                 }                         }                            private void myHandleConnectionWiht(                                   BluetoothSocket serverSocket) {                               // TODO Auto-generated method stub                                                       }                      });                    listenThread.start();               }           }      }

  • 相关文章
发表评论
用户名: 匿名