Bluetooth cihazları bulma

BluetoothAdapter kullanılırken uzak Bluetooth cihazları, cihaz bulma yoluyla veya eşlenen cihazların listesini sorgulamayı içerir.

Uygun Bluetooth izinlerine sahip olduğunuzdan emin olun ve uygulamanızı Bluetooth için ayarlayın yardımcı olabilir.

Cihaz keşfi, bir tarama prosedürüdür. Bu işlem, Bluetooth özellikli cihazlar ve her biriyle ilgili bazı bilgiler ister. Bu Süreç bazen keşfetme, sorgulama veya tarama olarak da adlandırılır. Yakındaki bir Bluetooth cihazı, keşif isteğine ancak şu anda bilgi isteklerini bulunabilir olarak kabul ediyor. Cihaz bulunabilir, keşif isteğine bazı bilgileri paylaşarak yanıt verir. Örneğin, cihazın adı, sınıfı ve benzersiz MAC adresi. Bunu kullanma Keşif işlemini gerçekleştiren cihaz, arama sonuçlarından keşfedilen cihazla bağlantı başlatma.

Bulunabilir cihazlar, kullanıcının konumuyla ilgili bilgileri açığa çıkarabileceğinden Cihazın keşif işlemi için konum erişimi gerekir. Uygulamanız kullanılıyorsa Android 8.0 (API düzeyi 26) veya sonraki bir sürümü çalıştıran bir cihaz kullanıyorsanız Companion Cihaz Yöneticisi API kullanın. Bu API sizin uygulamanız adına cihaz bulması sağladığından uygulamanızın konum izni isteme.

Uzak cihazla ilk kez bağlantı kurulduğunda, isteği otomatik olarak kullanıcıya sunulur. Bir cihaz eşlendiğinde söz konusu cihazla ilgili temel bilgiler (örneğin, cihazın adı, sınıfı ve MAC adresi) kaydedilir ve Bluetooth API'leri kullanılarak okunabilir. Bilinen MAC'yi kullanma uzak cihazın adresini kullanıyorsanız, istediğiniz zaman cihazla bağlantı cihazın kapsama alanında olduğu varsayılır.

Eşlenmiş olmakla bağlı olmak arasında bir fark olduğunu unutmayın:

  • Eşlenmiş olmak iki cihazın birbirlerinin varlığından haberdar olduğu anlamına gelir. kimlik doğrulama için kullanılabilecek ve aşağıdakileri yapabilen bir paylaşılan bağlantı anahtarına sahip olmalıdır ve birbirleriyle şifreli bir bağlantı kurarlar.
  • Bağlı olması, cihazların şu anda bir RFCOMM kanalını paylaştığı ve birbirlerine veri geçirebiliyorlar. Mevcut Bluetooth API'ler, bir RFCOMM bağlantısının kurulabilmesi için cihazların eşlenmesini gerektirir yerleşik olarak bulunur. Şifrelenmiş bir işlem başlattığınızda eşleme otomatik olarak gerçekleştirilir Bluetooth API'leriyle bağlantı.

Aşağıdaki bölümlerde, eşlenmiş ve Cihaz bulmayı kullanarak yeni cihazları keşfetme.

Eşlenen cihazları sorgula

Cihaz keşfi gerçekleştirmeden önce, eşlenmiş cihazın bilinen bir cihaz olup olmadığını kontrol edin. Bunun için şu numarayı arayın: getBondedDevices(). Bu, BluetoothDevice nesne temsil eder. Örneğin, eşlenen tüm cihazları sorgulayabilir ve aşağıdaki kod snippet'i gibi her cihazın adını ve MAC adresini al gösterir:

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
   }
}

Bir Bluetooth cihazla bağlantı başlatmak için gereken her şey ilişkilendirilmiş BluetoothDevice nesnesi, arama getAddress() Siz bağlantı oluşturma hakkında daha fazla bilgiyi Bluetooth'u Bağla cihazlar.

Cihazları keşfedin

Cihazları keşfetmeye başlamak için şu numarayı arayın: startDiscovery(). İşlem eşzamansızdır ve işlemin mevcut olup olmadığını gösteren bir boole değeri discovery başarıyla başlatıldı. Keşif süreci genellikle 12 saniyelik sorgu taraması ve ardından bulunan her cihaz için sayfa taraması dokunun.

Keşfedilen her cihazla ilgili bilgi almak için uygulamanızın BroadcastReceiver - ACTION_FOUND isteyebilirsiniz. Sistem bu amacı her cihazda yayınlar. Amaç şunu içerir: ekstra alanlar EXTRA_DEVICE ve EXTRA_CLASS, hangi bir BluetoothDevice ve bir BluetoothClass. Aşağıdaki kod snippet'i, yayını işlemek için nasıl kayıt olabileceğinizi gösterir keşfedildiğinde:

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);
}

Bir Bluetooth cihazıyla bağlantı başlatmak için getAddress() numaralı telefonu şu telefondan ararsınız: BluetoothDevice ile ilişkili MAC adresini alın.

Keşfedilebilirliği etkinleştir

Yerel cihazı diğer cihazlar tarafından bulunabilir hale getirmek için şu numarayı arayın: startActivityForResult(Intent, int) şununla: ACTION_REQUEST_DISCOVERABLE isteyebilirsiniz. Bu işlem, sistemin keşfedilebilir modunun etkinleştirilmesi için bir istek gönderir: Ayarlar uygulamasına gitmek zorunda kalıyorsunuz, bu da kendi uygulamanızı durduracak. Ölçüt Cihaz iki dakika boyunca bulunabilir hale gelir. Hedeflerinize göre bir en fazla bir saat olmak üzere farklı bir süre için EXTRA_DISCOVERABLE_DURATION ekstra

Aşağıdaki kod snippet'i, cihazı beş dakika boyunca bulunabilir olacak şekilde ayarlar:

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);


Şekil 2: Keşfedilebilirliği etkinleştirme iletişim kutusu.

Cihazı oluşturmak için kullanıcıdan izin isteyen bir iletişim kutusu görüntülenir bulunabilir. Kullanıcı "İzin ver" yanıtı verirse ardından cihaz belirtilen süre boyunca bulunabilir hale gelir. O zamanki etkinliğiniz bir çağrı geldiğinde onActivityResult() geri çağırma (sonuç kodu, cihazın bağlı olduğu süreye eşittir) bulunabilir. Kullanıcı "Reddet" yanıtını verdiyse veya bir hata oluştuysa sonuç kod RESULT_CANCELED.

Cihaz, verilen süre boyunca sessizce bulunabilir modda kalır. Şunlar: bulunabilir mod değiştiğinde bildirim almak için bir BroadcastReceiver kaydedin - ACTION_SCAN_MODE_CHANGED isteyebilirsiniz. Bu amaç ekstra alanlar içeriyor EXTRA_SCAN_MODE ve EXTRA_PREVIOUS_SCAN_MODE, Bu ayarlar sırasıyla yeni ve eski tarama modunu sağlar. Her biri için olası değerler ekstra özellikler şunlardır:

SCAN_MODE_CONNECTABLE_DISCOVERABLE
Cihaz, bulunabilir modda.
SCAN_MODE_CONNECTABLE
Cihaz bulunabilir modda değildir, ancak yine de bağlantı alabilir.
SCAN_MODE_NONE
Cihaz bulunabilir modda değildir ve bağlantı alamaz.

Uzak cihaz bağlantısı başlatıyorsanız cihaz bulunabilirliğini etkinleştirin. Keşfedilebilirliğin etkinleştirilmesi yalnızca uygulamanızın gelen aramaları kabul eden bir sunucu yuvası diğer cihazları da keşfedebilmesi gerektiğinden, uzaktaki cihazların bağlantı başlatamazsınız.