ब्लूटूथ की अनुमतियां

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

अनुमतियों की जानकारी देना

आपके ऐप्लिकेशन में एलान की गई अनुमतियों का सेट, आपके ऐप्लिकेशन के टारगेट एसडीके वर्शन पर निर्भर करता है.

Android 12 या इसके बाद के वर्शन को टारगेट करना

ध्यान दें: Android 8.0 (एपीआई लेवल 26) और इसके बाद के वर्शन पर, कंपैनियन डिवाइस मैनेजर (सीडीएम), कंपैनियन डिवाइसों से कनेक्ट करने का ज़्यादा आसान तरीका उपलब्ध कराता है. यह तरीका, इस सेक्शन में बताई गई अनुमतियों की तुलना में ज़्यादा आसान है. सीडीएम सिस्टम, आपके ऐप्लिकेशन के लिए डिवाइसों को जोड़ने वाला यूज़र इंटरफ़ेस (यूआई) उपलब्ध कराता है. इसके लिए, जगह की जानकारी की अनुमतियों की ज़रूरत नहीं होती.

अगर आपको डिवाइसों को जोड़ने और कनेक्ट करने के अनुभव पर ज़्यादा कंट्रोल चाहिए, तो इस सेक्शन में बताई गई अनुमतियों का इस्तेमाल करें.

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

अगर आपका ऐप्लिकेशन Android 12 (एपीआई लेवल 31) या इसके बाद के वर्शन को टारगेट करता है, तो अपने ऐप्लिकेशन की मेनिफ़ेस्ट फ़ाइल में इन अनुमतियों के बारे में बताएं:

  1. अगर आपका ऐप्लिकेशन ब्लूटूथ डिवाइसों को ढूंढता है, जैसे कि बीएलई पेरिफ़ेरल, तो BLUETOOTH_SCAN अनुमति का एलान करें.
  2. अगर आपका ऐप्लिकेशन मौजूदा डिवाइस को अन्य ब्लूटूथ डिवाइसों के लिए खोजे जाने लायक बनाता है, तो BLUETOOTH_ADVERTISE अनुमति का एलान करें.
  3. अगर आपका ऐप्लिकेशन पहले से जोड़े गए ब्लूटूथ डिवाइसों के साथ कम्यूनिकेट करता है, तो BLUETOOTH_CONNECT अनुमति का एलान करें.
  4. ब्लूटूथ से जुड़ी लेगसी अनुमति के एलान के लिए, android:maxSdkVersion को 30 पर सेट करें. ऐप्लिकेशन के साथ काम करने की सुविधा से जुड़े इस चरण की मदद से, सिस्टम आपके ऐप्लिकेशन को सिर्फ़ ब्लूटूथ से जुड़ी वे अनुमतियां देता है जिनकी ज़रूरत Android 12 या इसके बाद के वर्शन वाले डिवाइसों पर इंस्टॉल किए जाने पर होती है.
  5. अगर आपका ऐप्लिकेशन, जगह की जानकारी का पता लगाने के लिए ब्लूटूथ स्कैन के नतीजों का इस्तेमाल करता है, तो ACCESS_FINE_LOCATION अनुमति का एलान करें. इसके अलावा, आपके पास यह दावा करने का विकल्प है कि आपका ऐप्लिकेशन, डिवाइस की जगह की जानकारी का इस्तेमाल नहीं करता. इसके लिए, ACCESS_FINE_LOCATION अनुमति के लिए android:maxSdkVersion को 30 पर सेट करें.

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

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

<manifest>
    <!-- Request legacy Bluetooth permissions on older devices. -->
    <uses-permission android:name="android.permission.BLUETOOTH"
                     android:maxSdkVersion="30" />
    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN"
                     android:maxSdkVersion="30" />

    <!-- Needed only if your app looks for Bluetooth devices.
         If your app doesn't use Bluetooth scan results to derive physical
         location information, you can
         <a href="#assert-never-for-location">strongly assert that your app
         doesn't derive physical location</a>. -->
    <uses-permission android:name="android.permission.BLUETOOTH_SCAN" />

    <!-- Needed only if your app makes the device discoverable to Bluetooth
         devices. -->
    <uses-permission android:name="android.permission.BLUETOOTH_ADVERTISE" />

    <!-- Needed only if your app communicates with already-paired Bluetooth
         devices. -->
    <uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />

    <!-- Needed only if your app uses Bluetooth scan results to derive
         physical location. -->
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    ...
</manifest>

यह साफ़ तौर पर बताएं कि आपका ऐप्लिकेशन, जगह की सटीक जानकारी का इस्तेमाल नहीं करता

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

  1. BLUETOOTH_SCAN अनुमति के एलान में android:usesPermissionFlags एट्रिब्यूट जोड़ें. साथ ही, इस एट्रिब्यूट की वैल्यू को neverForLocation पर सेट करें.

  2. अगर आपके ऐप्लिकेशन को जगह की जानकारी की ज़रूरत नहीं है, तो अपने ऐप्लिकेशन के मेनिफ़ेस्ट से ACCESS_FINE_LOCATION की अनुमति हटा दें.

यहां दिए गए कोड स्निपेट से, अपने ऐप्लिकेशन की मेनिफ़ेस्ट फ़ाइल को अपडेट करने का तरीका पता चलता है:

<manifest>
    <!-- Include "neverForLocation" only if you can strongly assert that
         your app never derives physical location from Bluetooth scan results. -->
    <uses-permission android:name="android.permission.BLUETOOTH_SCAN"
                     android:usesPermissionFlags="neverForLocation" />

    <!-- Set maxSdkVersion to 30 if you can strongly assert that, on
         Android 12 and higher, your app never derives physical location from
         Bluetooth scan results and doesn't need location access for any other
         purpose. -->
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"
                     android:maxSdkVersion="30" />
    ...
</manifest>

Android 11 या इससे पहले के वर्शन को टारगेट करना

अगर आपका ऐप्लिकेशन Android 11 (एपीआई लेवल 30) या इससे पहले के वर्शन को टारगेट करता है, तो अपने ऐप्लिकेशन की मेनिफ़ेस्ट फ़ाइल में इन अनुमतियों के बारे में बताएं:

  • ब्लूटूथ क्लासिक या बीएलई कम्यूनिकेशन के लिए, BLUETOOTH ज़रूरी है. जैसे, कनेक्शन का अनुरोध करना, कनेक्शन स्वीकार करना, और डेटा ट्रांसफ़र करना.
  • ACCESS_FINE_LOCATION ज़रूरी है, क्योंकि Android 11 और इससे पहले के वर्शन पर, ब्लूटूथ डिवाइस का पता लगाने की सुविधा का इस्तेमाल करके उपयोगकर्ता की जगह की जानकारी इकट्ठा की जा सकती है.

जगह की जानकारी की अनुमतियां, रनटाइम की अनुमतियां होती हैं. इसलिए, आपको अपने मेनिफ़ेस्ट में इनका एलान करने के साथ-साथ, रनटाइम के दौरान इन अनुमतियों का अनुरोध करना होगा.

आस-पास मौजूद ब्लूटूथ डिवाइसों का पता लगाना

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

<manifest>
...
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
...
</manifest>

अगर आपका ऐप्लिकेशन किसी सेवा के साथ काम करता है और Android 10 (एपीआई लेवल 29) या Android 11 पर चल सकता है, तो आपको ब्लूटूथ डिवाइसों को खोजने के लिए, ACCESS_BACKGROUND_LOCATION अनुमति का एलान भी करना होगा. इस ज़रूरी शर्त के बारे में ज़्यादा जानने के लिए, बैकग्राउंड में जगह की जानकारी ऐक्सेस करना लेख पढ़ें.

यहां दिए गए कोड स्निपेट में, ACCESS_BACKGROUND_LOCATION अनुमति का एलान करने का तरीका बताया गया है:

<manifest>
...
<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />
...
</manifest>

ऐप्लिकेशन की अनुमतियों का एलान करने के बारे में ज़्यादा जानने के लिए, <uses-permission> रेफ़रंस देखें.

ब्लूटूथ की सुविधा के इस्तेमाल के बारे में बताएं

अगर ब्लूटूथ आपके ऐप्लिकेशन का एक अहम हिस्सा है, तो अपनी मेनिफ़ेस्ट फ़ाइल में फ़्लैग जोड़कर इस ज़रूरी शर्त के बारे में बताया जा सकता है. <uses-feature> एलिमेंट की मदद से, यह तय किया जा सकता है कि आपका ऐप्लिकेशन किस तरह के हार्डवेयर का इस्तेमाल करता है और वह ज़रूरी है या नहीं.

इस उदाहरण में, यह बताया गया है कि आपके ऐप्लिकेशन के लिए ब्लूटूथ क्लासिक की ज़रूरत है.

<uses-feature android:name="android.hardware.bluetooth" android:required="true"/>

अगर आपका ऐप्लिकेशन ब्लूटूथ लो एनर्जी का इस्तेमाल करता है, तो इनका इस्तेमाल किया जा सकता है:

<uses-feature android:name="android.hardware.bluetooth_le" android:required="true"/>

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

रनटाइम के दौरान सुविधा की उपलब्धता देखना

अपने ऐप्लिकेशन को ब्लूटूथ क्लासिक या बीएलई के साथ काम न करने वाले डिवाइसों पर उपलब्ध कराने के लिए, आपको अब भी अपने ऐप्लिकेशन के मेनिफ़ेस्ट में <uses-feature> एलिमेंट शामिल करना चाहिए. हालांकि, इसके लिए required="false" सेट करें. इसके बाद, रन-टाइम के दौरान, PackageManager.hasSystemFeature() का इस्तेमाल करके यह तय किया जा सकता है कि सुविधा उपलब्ध है या नहीं:

Kotlin

// Check to see if the Bluetooth classic feature is available.
val bluetoothAvailable = packageManager.hasSystemFeature(PackageManager.FEATURE_BLUETOOTH)

// Check to see if the BLE feature is available.
val bluetoothLEAvailable = packageManager.hasSystemFeature(PackageManager.FEATURE_BLUETOOTH_LE)

Java

// Use this check to determine whether Bluetooth classic is supported on the device.
// Then you can selectively disable BLE-related features.
boolean bluetoothAvailable = getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH);

// Use this check to determine whether BLE is supported on the device. Then
// you can selectively disable BLE-related features.
boolean bluetoothLEAvailable = getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH_LE);