尋找藍牙裝置

使用 BluetoothAdapter: 你可以透過裝置探索功能或 ,正在查詢配對裝置清單。

確認您具備適當的藍牙權限 ,然後設定應用程式的藍牙功能。 然後再嘗試尋找藍牙裝置。

裝置探索是一項掃描程序,可在當地搜尋區域 並要求每部裝置的相關資訊。這個 這有時也稱為探索、詢問或掃描。 附近的藍牙裝置只會在 現在大家能找到資訊要求且具可偵測性如果裝置 回應探索要求時,會分享一些資訊 例如裝置名稱、裝置類別和裝置專屬的 MAC 位址。使用此應用程式 執行探索程序的裝置可接著選擇 來連線到找到的裝置。

由於可開啟的裝置可能會顯示使用者位置資訊 裝置探索程序需要位置存取權。如果應用程式正在使用 在搭載 Android 8.0 (API 級別 26) 以上版本的裝置上,請考慮使用 隨附裝置管理工具 API。這個 API 會代表您的應用程式進行裝置探索,因此您的應用程式不需要 要求位置存取權

首次與遠端裝置建立連線後, 自動向使用者顯示要求裝置配對後, 該裝置的基本資訊,例如裝置的名稱、類別和 MAC 的位址—) 是儲存的,並且可使用 Bluetooth API 讀取。使用已知 MAC 也可與遠端裝置連線 但前提是裝置仍在連線範圍內。

請注意,配對和連線並不相同:

  • 「配對」是指兩部裝置知道彼此的存在。 具備可用於驗證的共用連結金鑰, 建立與彼此加密連線。
  • 「已連線」表示裝置目前共用一個 RFCOMM 頻道, 才能相互傳輸資料目前的藍牙 必須先配對裝置,API 才能執行 RFCOMM 連線 長期以來的目標啟動加密程序時自動配對 與 Bluetooth API 連線

以下各節將說明如何尋找已配對的裝置,以及 如何使用裝置探索服務發掘新裝置。

查詢配對的裝置

執行裝置搜尋之前,建議你查詢 ,看看所需的裝置是否已經知道。方法是呼叫 getBondedDevices()。 此方法會傳回一組 BluetoothDevice 物件 代表配對的裝置例如,您可以查詢所有配對的裝置,以及 取得每部裝置的名稱和 MAC 位址,如以下程式碼片段所示 示範:

Kotlin

val pairedDevices: Set<BluetoothDevice>? = bluetoothAdapter?.bondedDevices
pairedDevices?.forEach { device ->
   val deviceName = device.name
   val deviceHardwareAddress = device.address // MAC address
}

Java

Set<BluetoothDevice> pairedDevices = bluetoothAdapter.getBondedDevices();

if (pairedDevices.size() > 0) {
   // There are paired devices. Get the name and address of each paired device.
   for (BluetoothDevice device : pairedDevices) {
       String deviceName = device.getName();
       String deviceHardwareAddress = device.getAddress(); // MAC address
   }
}

如要與藍牙裝置建立連線, 相關聯的 BluetoothDevice 物件是 MAC 位址,您可以透過 撥號中 getAddress()。個人中心 想進一步瞭解如何建立連線,請參閱「連線藍牙」一文 裝置

探索裝置

如要開始探索裝置,請撥打 startDiscovery()。 此程序為非同步作業,並會傳回一個布林值,指出 已成功開始探索。探索過程通常涉及 然後查詢掃描,掃描大約 12 秒,然後掃描找到的每部裝置 擷取藍牙名稱。

如要接收所找到每部裝置的相關資訊,您的應用程式必須註冊 BroadcastReceiver敬上 的 ACTION_FOUND。 意圖。系統會為每部裝置廣播這項意圖。意圖中包含 這些額外欄位 EXTRA_DEVICEEXTRA_CLASS, 其中包含 BluetoothDeviceBluetoothClass。 下列程式碼片段顯示如何註冊以處理廣播 發現裝置時:

Kotlin

override fun onCreate(savedInstanceState: Bundle?) {
   ...

   // Register for broadcasts when a device is discovered.
   val filter = IntentFilter(BluetoothDevice.ACTION_FOUND)
   registerReceiver(receiver, filter)
}

// Create a BroadcastReceiver for ACTION_FOUND.
private val receiver = object : BroadcastReceiver() {

   override fun onReceive(context: Context, intent: Intent) {
       val action: String = intent.action
       when(action) {
           BluetoothDevice.ACTION_FOUND -> {
               // Discovery has found a device. Get the BluetoothDevice
               // object and its info from the Intent.
               val device: BluetoothDevice =
                       intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE)
               val deviceName = device.name
               val deviceHardwareAddress = device.address // MAC address
           }
       }
   }
}

override fun onDestroy() {
   super.onDestroy()
   ...

   // Don't forget to unregister the ACTION_FOUND receiver.
   unregisterReceiver(receiver)
}

Java

@Override
protected void onCreate(Bundle savedInstanceState) {
   ...

   // Register for broadcasts when a device is discovered.
   IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);
   registerReceiver(receiver, filter);
}

// Create a BroadcastReceiver for ACTION_FOUND.
private final BroadcastReceiver receiver = new BroadcastReceiver() {
   public void onReceive(Context context, Intent intent) {
       String action = intent.getAction();
       if (BluetoothDevice.ACTION_FOUND.equals(action)) {
           // Discovery has found a device. Get the BluetoothDevice
           // object and its info from the Intent.
           BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
           String deviceName = device.getName();
           String deviceHardwareAddress = device.getAddress(); // MAC address
       }
   }
};

@Override
protected void onDestroy() {
   super.onDestroy();
   ...

   // Don't forget to unregister the ACTION_FOUND receiver.
   unregisterReceiver(receiver);
}

如要與藍牙裝置建立連線,請在以下位置呼叫 getAddress(): 使用 BluetoothDevice 擷取相關聯的 MAC 位址。

啟用搜尋功能

如要讓其他裝置可以偵測到本機裝置,請呼叫 startActivityForResult(Intent, int)敬上 使用 ACTION_REQUEST_DISCOVERABLE。 意圖。這個問題會發出啟用系統可偵測模式的要求,但前提是 如要停止自己的應用程式,請前往「設定」應用程式。變更者: 預設情況下,裝置可在兩分鐘內偵測到裝置。您可以定義 將時間長度改為 EXTRA_DISCOVERABLE_DURATION敬上 外加。

下列程式碼片段會將裝置設為可偵測五分鐘:

Kotlin

val requestCode = 1;
val discoverableIntent: Intent = Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE).apply {
   putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 300)
}
startActivityForResult(discoverableIntent, requestCode)

Java

int requestCode = 1;
Intent discoverableIntent =
       new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);
discoverableIntent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 300);
startActivityForResult(discoverableIntent, requestCode);


圖 2:啟用可偵測性對話方塊。

系統會顯示對話方塊,要求使用者授予裝置的權限 如圖 2 所示。如果使用者回應「允許」那麼 在指定時間範圍內成為可偵測到的裝置。之後的活動 會收到對 onActivityResult()敬上 回呼,結果代碼等於裝置 容易找到如果使用者回應「拒絕」或發生錯誤,結果 代碼為 RESULT_CANCELED

裝置在指定的時間內不會發出通知,並處於可偵測模式。預期時間 在可探索模式變更時收到通知,請註冊 BroadcastReceiverACTION_SCAN_MODE_CHANGED 意圖。這項意圖包含額外欄位 EXTRA_SCAN_MODE敬上 和 EXTRA_PREVIOUS_SCAN_MODE, 支援新舊掃描模式每個屬性可能的值 額外項目如下:

SCAN_MODE_CONNECTABLE_DISCOVERABLE
裝置處於可偵測模式。
SCAN_MODE_CONNECTABLE
裝置並非處於可偵測模式,但仍可接收連線。
SCAN_MODE_NONE
裝置並非處於可偵測模式,無法接收連線。

如果您要啟動與遠端裝置的連線,則無需 讓使用者發掘裝置只有在下列情況才需要啟用可偵測性 請確保應用程式代管能接收傳入流量的伺服器通訊端 連線,因為遠端裝置必須能更快找到其他裝置 啟動與其他裝置的連線