Android藍芽搜尋裝置,向其傳送資料並接收
阿新 • • 發佈:2018-12-31
通過藍芽傳輸資料與Socket類似。在網路中使用Socket和ServerSocket控制客戶端和服務端的資料讀寫。而藍芽通訊也由客戶端和服務端Socket來完成。藍芽客戶端Socket是BluetoothSocket,藍芽服務端Socket是BluetoothServerSocket。這兩個類都在包中。
無論是BluetoothSocket,還是BluetoothServerSocket,都需要一個UUID(全域性唯一識別符號,UniversallyUnique Identifier).格式如下:
xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
UUID的格式被分成5段,其中中間3段的字元數相同,都是4,第1段是8個字元,最後一段是12個字元。所以UUID實際上是一個8-4-4-4-12的字串。
UUID相當於Socket的埠,而藍芽地址相當於Socket的IP。
效果圖:
搜尋裝置:
向一個裝置傳送資料
另一臺裝置收到了資訊,並顯示出來了:
——————————————————————————————————————
值得注意的是在建立連線的時候,裝置、輸出流、介面等變數需要是全域性變數,否則方法執行完,就斷開連線了。然後進行第二次傳送資料就接收不到了。
下面我們就來做這個demo吧,在測試的時候需要手動開啟藍芽,如果需要自動開啟藍芽請檢視我上一篇部落格。
首先,必不可少的就是新增兩個藍芽許可權:
- <uses-permission android:name="android.permission.BLUETOOTH"/>
- <uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
佈局檔案,由一個搜尋按鈕和一個listview組成,用於顯示搜到的裝置
activity_main.xml:
[java] view plain- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- android:orientation="vertical" >
- <Button
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:onClick="onClick_Search"
- android:text="搜尋" />
- <ListView
- android:id="@+id/lvDevices"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content" />
- </LinearLayout>
程式碼檔案
MainActivity.Java:
[java] view plain copy print?- package com.oak.learnbluetoothsocket;
- import java.io.IOException;
- import java.io.InputStream;
- import java.io.OutputStream;
- import java.util.ArrayList;
- import java.util.List;
- import java.util.Set;
- import java.util.UUID;
- import android.os.Bundle;
- import android.os.Handler;
- import android.os.Message;
- import android.app.Activity;
- import android.bluetooth.BluetoothAdapter;
- import android.bluetooth.BluetoothDevice;
- import android.bluetooth.BluetoothServerSocket;
- import android.bluetooth.BluetoothSocket;
- import android.content.BroadcastReceiver;
- import android.content.Context;
- import android.content.Intent;
- import android.content.IntentFilter;
- import android.view.View;
- import android.widget.AdapterView;
- import android.widget.AdapterView.OnItemClickListener;
- import android.widget.ArrayAdapter;
- import android.widget.ListView;
- import android.widget.Toast;
- publicclass MainActivity extends Activity implements OnItemClickListener {
- // 獲取到藍芽介面卡
- private BluetoothAdapter mBluetoothAdapter;
- // 用來儲存搜尋到的裝置資訊
- private List<String> bluetoothDevices = new ArrayList<String>();
- // ListView元件
- private ListView lvDevices;
- // ListView的字串陣列介面卡
- private ArrayAdapter<String> arrayAdapter;
- // UUID,藍芽建立連結需要的
- privatefinal UUID MY_UUID = UUID
- .fromString("db764ac8-4b08-7f25-aafe-59d03c27bae3");
- // 為其連結建立一個名稱
- privatefinal String NAME = "Bluetooth_Socket";
- // 選中傳送資料的藍芽裝置,全域性變數,否則連線在方法執行完就結束了
- private BluetoothDevice selectDevice;
- // 獲取到選中裝置的客戶端串列埠,全域性變數,否則連線在方法執行完就結束了
- private BluetoothSocket clientSocket;
- // 獲取到向裝置寫的輸出流,全域性變數,否則連線在方法執行完就結束了
- private OutputStream os;
- // 服務端利用執行緒不斷接受客戶端資訊
- private AcceptThread thread;
- @Override
- protectedvoid onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- // 獲取到藍芽預設的介面卡
- mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
- // 獲取到ListView元件
- lvDevices = (ListView) findViewById(R.id.lvDevices);
- // 為listview設定字元換陣列介面卡
- arrayAdapter = new ArrayAdapter<String>(this,
- android.R.layout.simple_list_item_1, android.R.id.text1,
- bluetoothDevices);
- // 為listView繫結介面卡
- lvDevices.setAdapter(arrayAdapter);
- // 為listView設定item點選事件偵聽
- lvDevices.setOnItemClickListener(this);
- // 用Set集合保持已繫結的裝置
- Set<BluetoothDevice> devices = mBluetoothAdapter.getBondedDevices();
- if (devices.size() > 0) {
- for (BluetoothDevice bluetoothDevice : devices) {
- // 儲存到arrayList集合中
- bluetoothDevices.add(bluetoothDevice.getName() + ":"
- + bluetoothDevice.getAddress() + "\n");
- }
- }
- // 因為藍芽搜尋到裝置和完成搜尋都是通過廣播來告訴其他應用的
- // 這裡註冊找到裝置和完成搜尋廣播
- IntentFilter filter = new IntentFilter(
- BluetoothAdapter.ACTION_DISCOVERY_FINISHED);
- registerReceiver(receiver, filter);
- filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);
- registerReceiver(receiver, filter);
- // 例項接收客戶端傳過來的資料執行緒
- thread = new AcceptThread();
- // 執行緒開始
- thread.start();
- }
- publicvoid onClick_Search(View view) {
- setTitle("正在掃描...");
- // 點選搜尋周邊裝置,如果正在搜尋,則暫停搜尋
- if (mBluetoothAdapter.isDiscovering()) {
- mBluetoothAdapter.cancelDiscovery();
- }
- mBluetoothAdapter.startDiscovery();
- }
- // 註冊廣播接收者
- private BroadcastReceiver receiver = new BroadcastReceiver() {
-