Bluetooth cihazları bulma

BluetoothAdapter sayesinde uzak Bluetooth cihazları, cihaz keşfi üzerinden veya eşlenen cihazların listesini sorgulayarak bulabilirsiniz.

Bluetooth cihazları bulmaya çalışmadan önce uygun Bluetooth izinlerine sahip olduğunuzdan emin olun ve uygulamanızı Bluetooth için ayarlayın.

Cihaz keşfi, yerel bölgede Bluetooth özellikli cihazları arayan ve her biriyle ilgili bazı bilgiler isteyen bir tarama prosedürüdür. Bu süreç bazen keşfetme, araştırma veya tarama olarak da adlandırılır. Yakındaki bir Bluetooth cihazı, yalnızca bulunabilir olarak bilgi isteklerini kabul ediyorsa keşif isteğine yanıt verir. Bir cihaz bulunabilir durumdaysa cihazın adı, sınıfı ve benzersiz MAC adresi gibi bazı bilgileri paylaşarak keşif isteğine yanıt verir. Keşif işlemini gerçekleştiren cihaz, bu bilgileri kullanarak, bulunan cihazla bağlantı başlatmayı seçebilir.

Bulunabilir cihazlar kullanıcının konumuyla ilgili bilgileri açığa çıkarabileceğinden, cihaz bulma işlemi için konum erişimi gerekir. Uygulamanız Android 8.0 (API düzeyi 26) veya sonraki sürümleri çalıştıran bir cihazda kullanılıyorsa bunun yerine Companion Device Manager API'sini kullanmayı düşünün. Bu API, uygulamanız adına cihaz keşfi gerçekleştirdiğinden uygulamanızın konum izinleri istemesine gerek yoktur.

Uzak bir cihazla ilk kez bağlantı kurulduğunda kullanıcıya otomatik olarak bir eşleme isteği sunulur. Bir cihaz eşlendiğinde cihazın adı, sınıfı ve MAC adresi gibi söz konusu cihazla ilgili temel bilgiler kaydedilir ve Bluetooth API'leri kullanılarak okunabilir. Uzak bir cihaz için bilinen MAC adresi kullanılarak, cihazın hâlâ kapsama alanında olduğu varsayılarak keşif yapılmadan bu cihazla istediğiniz zaman bağlantı başlatılabilir.

Eşlenme ve bağlanma arasında bir fark olduğunu unutmayın:

  • Eşlenmek iki cihazın birbirinin varlığından haberdar olması, kimlik doğrulama için kullanılabilecek paylaşılan bir bağlantı anahtarına sahip olması ve birbiriyle şifreli bir bağlantı kurabilmesi anlamına gelir.
  • Cihazların bağlı olması, şu anda bir RFCOMM kanalını paylaştığı ve birbirleriyle veri iletebildiği anlamına gelir. Mevcut Bluetooth API'leri, RFCOMM bağlantısının oluşturulabilmesi için cihazların eşlenmesini gerektirir. Bluetooth API'leriyle şifrelenmiş bir bağlantı başlattığınızda eşleme otomatik olarak gerçekleştirilir.

Aşağıdaki bölümlerde, eşlenmiş cihazların nasıl bulunacağı ve cihaz keşfi özelliğini kullanarak yeni cihazların nasıl keşfedileceği açıklanmaktadır.

Eşlenen cihazları sorgula

Cihaz keşfi yapmadan önce, istenen cihazın zaten bilinip bilinmediğini görmek için eşlenen cihaz grubunu sorgulamak faydalı olacaktır. Bunun için getBondedDevices() numaralı telefonu arayın. Bu işlem, eşlenen cihazları temsil eden bir BluetoothDevice nesne kümesi döndürür. Örneğin, aşağıdaki kod snippet'inde gösterildiği gibi, eşlenen tüm cihazları sorgulayabilir ve her cihazın adını ve MAC adresini alabilirsiniz:

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 cihazıyla bağlantı başlatmak için ilişkilendirilen BluetoothDevice nesnesinden yalnızca MAC adresi gerekir. Bu adresi getAddress() araması yaparak alırsınız. Bluetooth cihazları bağlama bölümünde bağlantı oluşturma hakkında daha fazla bilgi edinebilirsiniz.

Cihazları keşfedin

Cihazları keşfetmeye başlamak için startDiscovery() numaralı telefonu arayın. İşlem eşzamansız olup keşfin başarıyla başlatılıp başlatılmadığını belirten bir boole değeri döndürür. Keşif süreci, genellikle yaklaşık 12 saniyelik bir sorgulama taramasından oluşur. Bu taramanın ardından Bluetooth adının öğrenilmesi için bulunan her cihazın sayfa taraması yapılır.

Keşfedilen her cihaz hakkında bilgi almak için uygulamanızın ACTION_FOUND amacına yönelik bir BroadcastReceiver kaydetmesi gerekir. Sistem bu amacı her cihaz için yayınlar. Amaç sırasıyla EXTRA_DEVICE ve EXTRA_CLASS ek alanlarını içerir. Bu alanlar sırasıyla BluetoothDevice ve BluetoothClass değerlerini içerir. Aşağıdaki kod snippet'inde, cihazlar keşfedildiğinde yayını işlemek için nasıl kaydolabileceğiniz gösterilmektedir:

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 ilişkilendirilen MAC adresini almak üzere BluetoothDevice cihazında getAddress() numarasını ararsınız.

Keşfedilebilirliği etkinleştir

Yerel cihazı diğer cihazlar tarafından bulunabilir hale getirmek için ACTION_REQUEST_DISCOVERABLE amacıyla startActivityForResult(Intent, int) araması yapın. Bu işlem, Ayarlar uygulamasına gitmek zorunda kalmadan sistemin bulunabilir modunu etkinleştirme isteği gönderir. Bu işlem, kendi uygulamanızı durdurur. Varsayılan olarak cihaz iki dakika boyunca bulunabilir hale gelir. Ekstra EXTRA_DISCOVERABLE_DURATION ekleyerek bir saate kadar farklı bir süre tanımlayabilirsiniz.

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ı bulunabilir duruma getirmek için kullanıcıdan izin isteyen bir iletişim kutusu görüntülenir (Şekil 2'de gösterildiği gibi). Kullanıcı "İzin ver" yanıtı verirse cihaz belirtilen süre boyunca bulunabilir hale gelir. Ardından etkinliğiniz, cihazın keşfedilebilir olduğu süreye eşit olacak şekilde, sonuç kodu ile birlikte onActivityResult() geri çağırmasına bir çağrı alır. Kullanıcı "Reddet" yanıtı verdiyse veya bir hata oluştuysa sonuç kodu RESULT_CANCELED olur.

Cihaz, kendisine ayrılan süre boyunca sessizce bulunabilir modda kalır. Bulunabilir mod değiştiğinde bildirim almak istiyorsanız ACTION_SCAN_MODE_CHANGED amacı için bir BroadcastReceiver kaydedin. Bu amaç, sırasıyla yeni ve eski tarama modunu sağlayan EXTRA_SCAN_MODE ve EXTRA_PREVIOUS_SCAN_MODE ek alanlarını içerir. Her bir ekstra için olası değerler şöyledir:

SCAN_MODE_CONNECTABLE_DISCOVERABLE
Cihaz bulunabilir modda.
SCAN_MODE_CONNECTABLE
Cihaz bulunabilir modda olmasa da yine de bağlantı alabilir.
SCAN_MODE_NONE
Cihaz bulunabilir modda olmadığı için bağlantı alamıyor.

Uzak bir cihazla bağlantıyı başlatıyorsanız cihaz bulunabilirliğini etkinleştirmeniz gerekmez. Keşfedilebilirliği etkinleştirmek yalnızca uygulamanızın gelen bağlantıları kabul eden bir sunucu yuvası barındırmasını istediğinizde gereklidir, çünkü uzak cihazların bu diğer cihazlarla bağlantı başlatmadan önce diğer cihazları keşfedebilmesi gerekir.