Android 藍芽的常用操作

來源:互聯網
上載者:User

標籤:android   style   blog   http   io   ar   color   os   sp   

最近對Android裝置的藍芽操作進行了一些研究, 下面做一些總結, 版本是4.4,列出的解決方案多來源於網路,感謝強大的網友們:

操作藍芽可以分為常規的操作,和非常規的操作。所謂常規的操作,就是介面上有提示,需要客戶許可進行的一些操作。非常規的則通常是採用反射等手段,達到不知不覺串連藍芽的目的。

 

一. 常規操作:

1. 擷取藍芽的操作介面:

BluetoothAdapter mBtAdapter = BluetoothAdapter.getDefaultAdapter();

藍芽的相關操作基本都是通過上面這個類。

 

2. 開啟原生藍牙裝置:

if (!mBtAdapter.isEnabled()) {  Intent enableIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);  startActivityForResult(enableIntent, 0);}

 

3. 開啟藍芽的可見度:


if (mBtAdapter.isEnabled()) {  Intent visibleIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);  visibleIntent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 300);  // 後面的ms最多就是300  startActivity(visibleIntent);}

 

4. 開啟了藍牙裝置,就是為了與其他裝置通訊,所以需要掃描周圍可用的裝置:

// 註冊兩個intent,並定義receiver接受藍牙裝置檢測過程中,"發現裝置"和"完成"的回調事件
IntentFilter discoveryFilter = new IntentFilter(BluetoothDevice.ACTION_FOUND);
IntentFilter discoveryFinishedFilter = new IntentFilter(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);
BroadcastReceiver discoverReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
if (BluetoothDevice.ACTION_FOUND.equals(action)) 
     {
       BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);  // 拿到別的device才能進行串連操作
     } 
else if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)) 
{
     // DO Something
}
}
};
this.registerReceiver(discoverReceiver, discoveryFilter);
this.registerReceiver(discoverReceiver, discoveryFinishedFilter);

/************************************/

mBtAdapter.startDiscovery(); // 用來開始搜尋周圍可見的藍牙裝置// 如果在發現過程中想要停止,可以調用下面的APIif(mBtAdapter.isDiscovering()) { mBtAdapter.cancelDiscovery(); return;}

 

 5. 作為server端,等待其他裝置串連:

BluetoothServerSocket mServerSocket = mBtAdapter.listenUsingRfcommWithServiceRecord(PROTOCOL_SCHEME_RFCOMM, UUID.fromString("00001101-0000-1000-8000-00805F9B34FB"));
BluetoothSocket mClientSocket = mServerSocket.accept();

// 有了socket對象,可以擷取stream了, 可以用stream的read,write方法來讀寫資料了,read可以在獨立線程的迴圈裡,以保證持續接受到資料。
InputStream inStream = mClientSocket.getInputStream();
OutputStream outStream = mClientSocket.getOutputStream();

 

6. 作為client端,可以去串連server:

BluetoothDevice mDevice = mBtAdapter.getRemoteDevice(device.getAddress());   //首先要獲得server的裝置對象,這個兌現可以在之前 discover的時候就拿到,也可以通過之前記錄的address擷取到

// connect 如果成功了,就得到socket串連了,之後和上面一樣,就可以通過stream進而收發訊息了
mClientSocket = mDevice.createRfcommSocketToServiceRecord(UUID.fromString("00001101-0000-1000-8000-00805F9B34FB"));
mClientSocket.connect();

 

 

二. 非常規操作:

 

1. 開啟原生藍牙裝置:

// 這樣是不會彈出對話方塊的
if (!mBtAdapter.isEnabled()) {  mBtAdapter.enable();}

 

2. 開啟藍芽的可見度:


  //值得一提的是,這個方法在 mBtAdapter.enable(); 之後立即調用是很有可能不生效的。可能是藍牙裝置開啟需要一些時間。所以,最好是在確認裝置確實已經開啟了之後(比如說sleep一會兒,或者有個有個迴圈不斷check mBtAdapter.isEnabled  (),來保證裝置已經準備好了。  
  public void setDiscoverableTimeout(int timeout) {

     try {
          Method setDiscoverableTimeout = BluetoothAdapter.class.getMethod("setDiscoverableTimeout", int.class);            setDiscoverableTimeout.setAccessible(true);            Method setScanMode =BluetoothAdapter.class.getMethod("setScanMode", int.class,int.class);            setScanMode.setAccessible(true);                         setDiscoverableTimeout.invoke(mBtAdapter, timeout);            setScanMode.invoke(mBtAdapter, BluetoothAdapter.SCAN_MODE_CONNECTABLE_DISCOVERABLE,timeout);        } catch (Exception e) {            e.printStackTrace();        }    }

 

3. 不配對就進行藍芽通訊:

// 通過這兩個API, 可以很神奇的, 不配對藍牙裝置就進行通訊
mServerSocket = mBtAdapter.listenUsingInsecureRfcommWithServiceRecord(PROTOCOL_SCHEME_RFCOMM, UUID.fromString("00001101-0000-1000-8000-00805F9B34FB"));
mClientSocket = mDevice.createInsecureRfcommSocketToServiceRecord(UUID.fromString("00001101-0000-1000-8000-00805F9B34FB"));

 

三. 最後列一下需要的許可權:

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

 

藍芽參考網頁: 

http://stackoverflow.com/questions/5308373/how-to-create-insecure-rfcomm-socket-in-android

http://stackoverflow.com/questions/5885438/bluetooth-pairing-without-user-confirmation

http://blog.csdn.net/zshq280017423/article/details/7645622

http://blog.csdn.net/menghnhhuan/article/details/7057484

http://blog.csdn.net/eric41050808/article/details/16967189

http://www.2cto.com/kf/201312/261093.html

WIFI 參考網頁:

http://blog.csdn.net/ranger1111/article/details/6777153

http://lszdb1983.blog.163.com/blog/static/20426348201209251344/

 

格式啊,怎麼也搞不好,,,

Android 藍芽的常用操作

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.