Android 藍牙操作詳解

来源:http://www.cnblogs.com/shouce/archive/2016/02/23/5208721.html
-Advertisement-
Play Games

1.啟用藍牙並使設備處於可發現狀態 1.1 在使用BluetoothAdapter類的實例進操作之前,應啟用isEnable()方法檢查設備是否啟用了藍牙適配器。 // 使用意圖提示用戶啟用藍牙,並使設備處於可發現狀態 private void startBluetooth() { Bluetoot


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();               }           }      }
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1.通過在事件名稱後面添加以點號分隔的尾碼來為事件名稱指派命名空間 $("#button").bind("click.editMode",function(){}); $("#buttonM").bind("click.editMode",function(){}); 2.再通過unbind解除該組
  • 剛開始學習前端的時候開始整理這個文檔,現在內容已經逐漸增多。雖然現在看起來,文檔里的內容非常簡單,但是看著這些內容,好像還依稀記得這一行行代碼當時被記錄的情景。所以我想把這段回憶保存起來,為剛接觸前端的童鞋們提供一個簡單的查詢的途徑,也以此來緬懷我的前端學習之路。 此文檔,我會持續更新 jquery
  • code display :: <!DOCTYPE HTML><html> <head> <link href="bootstrap.css" rel="stylesheet"> </head> <body> <div class="table-responsive"> <table class="
  • <script type="text/javascript"> (function($){ window.addEventListener("click",function(evt){ for(var i in evt) { console.log(i + "---" + evt[i]); } },
  • 前段時間看了大神的博客文章【使用Flexible實現手淘H5頁面的終端適配】(地址:http://www.w3cplus.com/mobile/lib-flexible-for-html5-layout.html),受益良多,寫了個小demo,記錄一下以防忘記,需要註意幾點,如下: 1. meta
  • 效果圖: 閃屏頁用到了handler和CountDownTimer類,還需配置一下Activity的主題,這裡是:android:theme="@android:style/Theme.NoTitleBar.Fullscreen" 全屏主題的意思。 實現源碼: package com.example
  • 當一個iOS應用被送到後臺,它的主線程會被暫停。你用NSThread的detachNewThreadSelector:toTar get:withObject:類方法創建的線程也被掛起了。如果你想在後臺完成一個長期任務,就必須調用UIApplication的beginBackgroundTaskWi
  • 近期剛剛學習了一種多線程技術,現結合自己的理解將其羅列出來,希望能夠與大家交流一下,多線程是一種能夠節省程式運算時間的方法,大大的提高了程式的運算效率,那麼首先我們來說一下進程和線程概念: 一個程式包含一個以上的進程,而一個進程又可以包含一個以上的線程,每一個進程都有自己獨立的記憶體空間,相應的一個進
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...