ब्लूटूथ डिवाइस ढूंढें

BluetoothAdapter का इस्तेमाल करके, डिवाइस खोजने की सुविधा या पेयर किए गए डिवाइसों की सूची में क्वेरी करके, रिमोट ब्लूटूथ डिवाइसों को ढूंढा जा सकता है.

ब्लूटूथ डिवाइसों को ढूंढने से पहले, पक्का करें कि आपके पास ब्लूटूथ की ज़रूरी अनुमतियां हों और आपने अपने ऐप्लिकेशन को ब्लूटूथ के लिए सेट अप किया हो.

डिवाइस डिस्कवरी, स्कैन करने की एक प्रोसेस है. इसमें आस-पास मौजूद, ब्लूटूथ की सुविधा वाले डिवाइसों को खोजा जाता है और हर डिवाइस के बारे में कुछ जानकारी का अनुरोध किया जाता है. इस प्रोसेस को कभी-कभी खोजना, पूछताछ करना या स्कैन करना भी कहा जाता है. आस-पास मौजूद कोई ब्लूटूथ डिवाइस, डिस्कवरी के अनुरोध का जवाब सिर्फ़ तब देता है, जब वह डिस्कवर किए जाने की सुविधा चालू करके, जानकारी के अनुरोध स्वीकार कर रहा हो. अगर कोई डिवाइस डिस्कवर किया जा सकता है, तो वह डिस्कवरी के अनुरोध का जवाब कुछ जानकारी शेयर करके देता है. जैसे, डिवाइस का नाम, उसकी क्लास, और उसका यूनीक मैक पता. इस जानकारी का इस्तेमाल करके, डिस्कवरी की प्रोसेस कर रहा डिवाइस, डिस्कवर किए गए डिवाइस से कनेक्शन शुरू कर सकता है.

डिवाइसों को ढूंढने की सुविधा से, उपयोगकर्ता की जगह की जानकारी पता चल सकती है. इसलिए, डिवाइसों को ढूंढने की प्रोसेस के लिए, जगह की जानकारी का ऐक्सेस देना ज़रूरी है. अगर आपके ऐप्लिकेशन का इस्तेमाल, Android 8.0 (एपीआई लेवल 26) या उसके बाद के वर्शन वाले डिवाइस पर किया जा रहा है, तो इसके बजाय Companion Device Manager API का इस्तेमाल करें. यह एपीआई, आपके ऐप्लिकेशन की ओर से डिवाइस डिस्कवरी करता है. इसलिए, आपके ऐप्लिकेशन को जगह की जानकारी की अनुमतियों का अनुरोध करने की ज़रूरत नहीं है.

किसी रिमोट डिवाइस से पहली बार कनेक्ट करने के बाद, उपयोगकर्ता को अपने-आप, जोड़ने का अनुरोध दिखता है. जब किसी डिवाइस को जोड़ा जाता है, तो उस डिवाइस की बुनियादी जानकारी सेव हो जाती है. जैसे, डिवाइस का नाम, क्लास, और एमएसी पता. इस जानकारी को ब्लूटूथ एपीआई का इस्तेमाल करके पढ़ा जा सकता है. किसी रिमोट डिवाइस के लिए, पहले से मौजूद मैक पते का इस्तेमाल करके, डिवाइस की खोज किए बिना भी उससे कभी भी कनेक्ट किया जा सकता है. हालांकि, इसके लिए ज़रूरी है कि डिवाइस अब भी कनेक्टिविटी की रेंज में हो.

ध्यान दें कि डिवाइसों के पेयर होने और कनेक्ट होने में अंतर होता है:

  • पेयर होने का मतलब है कि दोनों डिवाइसों को एक-दूसरे के बारे में पता है. साथ ही, उनके पास एक लिंक-की होती है जिसका इस्तेमाल पुष्टि करने के लिए किया जा सकता है. साथ ही, वे एक-दूसरे के साथ एन्क्रिप्ट (सुरक्षित) कनेक्शन बना सकते हैं.
  • कनेक्ट होने का मतलब है कि डिवाइसों में फ़िलहाल एक RFCOMM चैनल शेयर किया जा रहा है और वे एक-दूसरे के साथ डेटा ट्रांसफ़र कर सकते हैं. मौजूदा ब्लूटूथ एपीआई के मुताबिक, आरएफ़सीओएम कनेक्शन सेट अप करने से पहले, डिवाइसों को जोड़ना ज़रूरी है. ब्लूटूथ एपीआई की मदद से एन्क्रिप्ट (सुरक्षित) किया गया कनेक्शन शुरू करने पर, डिवाइस अपने-आप जुड़ जाते हैं.

नीचे दिए गए सेक्शन में, जोड़े गए डिवाइसों को ढूंढने का तरीका बताया गया है. साथ ही, डिवाइस डिस्कवरी का इस्तेमाल करके नए डिवाइसों को ढूंढने का तरीका भी बताया गया है.

जोड़े गए डिवाइसों के बारे में क्वेरी करना

डिवाइस डिस्कवरी करने से पहले, जोड़े गए डिवाइसों के सेट से क्वेरी करना बेहतर होता है. इससे यह पता चलता है कि आपका डिवाइस पहले से मौजूद है या नहीं. ऐसा करने के लिए, getBondedDevices() को कॉल करें. यह जोड़े गए डिवाइसों की जानकारी देने वाले BluetoothDevice ऑब्जेक्ट का सेट दिखाता है. उदाहरण के लिए, जोड़े गए सभी डिवाइसों के बारे में क्वेरी की जा सकती है और हर डिवाइस का नाम और मैक पता पाया जा सकता है. इस बारे में यहां दिए गए कोड स्निपेट में बताया गया है:

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 ऑब्जेक्ट का एमएसी पता होना ज़रूरी है. इसे पाने के लिए, getAddress() को कॉल करें. ब्लूटूथ डिवाइसों को कनेक्ट करना में जाकर, कनेक्शन बनाने के बारे में ज़्यादा जानें.

डिवाइसों को खोजना

डिवाइसों को ढूंढने की सुविधा शुरू करने के लिए, startDiscovery() को कॉल करें. यह प्रोसेस असाइनोक्रोनस होती है और यह एक बूलियन वैल्यू दिखाती है. इससे पता चलता है कि डिस्कवरी की प्रोसेस शुरू हो गई है या नहीं. डिवाइस ढूंढने की प्रोसेस में, आम तौर पर करीब 12 सेकंड का इन्क्वायरी स्कैन शामिल होता है. इसके बाद, ब्लूटूथ का नाम पाने के लिए, ढूंढे गए हर डिवाइस का पेज स्कैन किया जाता है.

ढूंढे गए हर डिवाइस के बारे में जानकारी पाने के लिए, आपके ऐप्लिकेशन को ACTION_FOUND इंटेंट के लिए BroadcastReceiver रजिस्टर करना होगा. सिस्टम, हर डिवाइस के लिए यह इंटेंट ब्रॉडकास्ट करता है. इंटेंट में, EXTRA_DEVICE और EXTRA_CLASS जैसे अतिरिक्त फ़ील्ड होते हैं. इनमें क्रमशः BluetoothDevice और BluetoothClass होते हैं. नीचे दिए गए कोड स्निपेट में, डिवाइसों का पता चलने पर ब्रॉडकास्ट मैनेज करने के लिए रजिस्टर करने का तरीका बताया गया है:

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

किसी ब्लूटूथ डिवाइस से कनेक्ट करने के लिए, BluetoothDevice पर getAddress() को कॉल करें. इससे, उस डिवाइस का मैक पता पता चलता है.

खोजे जाने लायक सुविधा चालू करें

स्थानीय डिवाइस को दूसरे डिवाइसों के लिए खोजे जाने लायक बनाने के लिए, ACTION_REQUEST_DISCOVERABLE के साथ startActivityForResult(Intent, int) को कॉल करें. इससे, सेटिंग ऐप्लिकेशन पर जाने के बिना, डिवाइस को डिस्कवर किए जा सकने वाले मोड में चालू करने का अनुरोध किया जाता है. ऐसा करने से, आपका ऐप्लिकेशन बंद हो जाएगा. डिफ़ॉल्ट रूप से, डिवाइस दो मिनट के लिए डिस्कवर किए जा सकने वाले मोड में चालू हो जाता है. 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: 'खोजने लायक बनाना' सेटिंग चालू करने वाला डायलॉग.

इसके बाद, एक डायलॉग दिखेगा. इसमें, डिवाइस को डिस्कवर किया जा सकने लायक बनाने के लिए, उपयोगकर्ता से अनुमति मांगी जाएगी. जैसा कि दूसरी इमेज में दिखाया गया है. अगर उपयोगकर्ता "अनुमति दें" का जवाब देता है, तो डिवाइस तय समय के लिए डिस्कवर किया जा सकता है. इसके बाद, आपकी गतिविधि को onActivityResult() कॉलबैक के लिए कॉल मिलता है. इसमें, डिवाइस के डिस्कवर किए जाने की अवधि के बराबर का रिज़ल्ट कोड होता है. अगर उपयोगकर्ता ने "अस्वीकार करें" का जवाब दिया है या कोई गड़बड़ी हुई है, तो नतीजा कोड RESULT_CANCELED होगा.

डिवाइस, तय किए गए समय के लिए डिस्कवर किए जा सकने वाले मोड में चुपचाप रहता है. डिस्कवर किए जा सकने वाले मोड में बदलाव होने पर सूचना पाने के लिए, ACTION_SCAN_MODE_CHANGED इंटेंट के लिए BroadcastReceiver रजिस्टर करें. इस इंटेंट में अतिरिक्त फ़ील्ड EXTRA_SCAN_MODE और EXTRA_PREVIOUS_SCAN_MODE शामिल हैं. ये फ़ील्ड, नए और पुराने स्कैन मोड की जानकारी देते हैं. हर एक्सट्रा के लिए ये वैल्यू हो सकती हैं:

SCAN_MODE_CONNECTABLE_DISCOVERABLE
डिवाइस, डिस्कवर किए जाने लायक मोड में हो.
SCAN_MODE_CONNECTABLE
डिवाइस, डिस्कवर किए जा सकने वाले मोड में नहीं है, लेकिन उसे अब भी कनेक्ट किया जा सकता है.
SCAN_MODE_NONE
डिवाइस, डिस्कवर किए जा सकने वाले मोड में नहीं है और उससे कनेक्ट नहीं किया जा सकता.

अगर किसी दूसरे डिवाइस से कनेक्ट किया जा रहा है, तो आपको डिवाइस को डिस्कवर किया जा सकने की सुविधा चालू करने की ज़रूरत नहीं है. डिवाइसों को ढूंढने की सुविधा को सिर्फ़ तब चालू करना ज़रूरी है, जब आपको अपने ऐप्लिकेशन में ऐसा सर्वर सॉकेट होस्ट करना हो जो इनकमिंग कनेक्शन स्वीकार करता हो. ऐसा इसलिए, क्योंकि रिमोट डिवाइसों को उन दूसरे डिवाइसों से कनेक्शन शुरू करने से पहले, उन डिवाइसों को ढूंढना होगा.