अपने ऐप्लिकेशन में ब्लूटूथ की सुविधाओं का इस्तेमाल करने के लिए, आपको कई अनुमतियों का एलान करना होगा. आपको यह भी बताना होगा कि आपके ऐप्लिकेशन को ब्लूटूथ क्लासिक या ब्लूटूथ स्मार्ट (बीएलई) के साथ काम करने की ज़रूरत है या नहीं. अगर आपके ऐप्लिकेशन को ब्लूटूथ क्लासिक या बीएलई की ज़रूरत नहीं है, लेकिन फिर भी इन टेक्नोलॉजी का फ़ायदा मिल सकता है, तो रनटाइम के दौरान उपलब्धता की जांच की जा सकती है.
अनुमतियों का एलान करना
आपके ऐप्लिकेशन में जिन अनुमतियों का एलान किया जाता है वे आपके ऐप्लिकेशन के टारगेट SDK टूल के वर्शन पर निर्भर करती हैं.
Android 12 या उसके बाद के वर्शन को टारगेट करना
ध्यान दें: Android 8.0 (एपीआई लेवल 26) और इसके बाद के वर्शन पर, Companion Device Manager (CDM), इस सेक्शन में बताई गई अनुमतियों की तुलना में, साथ काम करने वाले डिवाइसों से कनेक्ट करने का बेहतर तरीका उपलब्ध कराता है. सीडीएम सिस्टम, आपके ऐप्लिकेशन की ओर से, जोड़ने का यूज़र इंटरफ़ेस (यूआई) उपलब्ध कराता है. इसके लिए, जगह की जानकारी की अनुमतियों की ज़रूरत नहीं होती.
अगर आपको डिवाइसों को जोड़ने और कनेक्ट करने के अनुभव पर ज़्यादा कंट्रोल चाहिए, तो इस सेक्शन में बताई गई अनुमतियों का इस्तेमाल करें.
अगर आपका ऐप्लिकेशन Android 12 (एपीआई लेवल 31) या उसके बाद के वर्शन को टारगेट करता है, तो अपने ऐप्लिकेशन की मेनिफ़ेस्ट फ़ाइल में इन अनुमतियों के बारे में बताएं:
- अगर आपका ऐप्लिकेशन ब्लूटूथ डिवाइसों को खोजता है, जैसे कि बीएलई डिवाइस, तो
BLUETOOTH_SCAN
की अनुमति का एलान करें. - अगर आपका ऐप्लिकेशन मौजूदा डिवाइस को अन्य ब्लूटूथ डिवाइसों के लिए खोजने लायक बनाता है, तो
BLUETOOTH_ADVERTISE
अनुमति का एलान करें. - अगर आपका ऐप्लिकेशन पहले से जोड़े गए ब्लूटूथ डिवाइसों से संपर्क करता है, तो
BLUETOOTH_CONNECT
अनुमति का एलान करें. - ब्लूटूथ से जुड़ी अनुमतियों के लेगसी एलान के लिए,
android:maxSdkVersion
को 30 पर सेट करें. ऐप्लिकेशन के साथ काम करने की सुविधा से, सिस्टम को आपके ऐप्लिकेशन को सिर्फ़ वही ब्लूटूथ अनुमतियां देने में मदद मिलती है जिनकी ज़रूरत Android 12 या उसके बाद के वर्शन वाले डिवाइसों पर इंस्टॉल करने के लिए होती है. - अगर आपका ऐप्लिकेशन, जगह की जानकारी पाने के लिए ब्लूटूथ स्कैन के नतीजों का इस्तेमाल करता है, तो
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:maxSdkVers>ion=&<quot;30" /
uses-permission android:name="android.permission.BLUETOOTH_ADMIN"
> andr<oid: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 t<ha>t yo>ur ap<p
doesn't derive physical location/a. --
uses-per>missio<n android:name="android.permission.BLUETOOTH_SCAN" /
!-- Needed only if your> app <makes the device discoverable to Bluetooth
devices. --
use>s-perm<ission android:name="android.permission.BLUETOOTH_ADVERTISE" /
!-- Needed on>ly if< your app communicates with already-paired Bluetooth
devices>. --
< uses-permission android:name="android.permission.BLUETOOTH_CONNECT" /
!-- Need>ed on<ly if your app uses Bluetooth scan results to derive
physical l>ocation. <--
us>e
s-permission android:name="android.permission.ACCESS_FINE_LOCATION" /
...
/manifest
साफ़ तौर पर बताएं कि आपका ऐप्लिकेशन, जगह की जानकारी का इस्तेमाल नहीं करता
अगर आपका ऐप्लिकेशन, जगह की जानकारी पाने के लिए ब्लूटूथ स्कैन के नतीजों का इस्तेमाल नहीं करता है, तो आपके पास यह दावा करने का विकल्प है कि आपका ऐप्लिकेशन, जगह की जानकारी पाने के लिए ब्लूटूथ की अनुमतियों का कभी इस्तेमाल नहीं करता. ऐसा करने के लिए, यह तरीका अपनाएं:
BLUETOOTH_SCAN
अनुमति के एलान मेंandroid:usesPermissionFlags
एट्रिब्यूट जोड़ें और इस एट्रिब्यूट की वैल्यू कोneverForLocation
पर सेट करें.अगर आपके ऐप्लिकेशन के लिए जगह की जानकारी की ज़रूरत नहीं है, तो अपने ऐप्लिकेशन के मेनिफ़ेस्ट से
ACCESS_FINE_LOCATION
अनुमति हटा दें.
नीचे दिया गया कोड स्निपेट, आपके ऐप्लिकेशन की मेनिफ़ेस्ट फ़ाइल को अपडेट करने का तरीका दिखाता है:
<manifest>
<!-- Include "neverForLocation" only if you can strongly assert that
your app never derives physical location from Bluetooth scan r>esult<s. --
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 a<ny other
purpose. --
uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"
> < >span>and
roid:maxSdkVersion="30" /
...
/manifest
Android 11 या उससे पहले के वर्शन को टारगेट करना
अगर आपका ऐप्लिकेशन Android 11 (एपीआई लेवल 30) या उससे पहले के वर्शन को टारगेट करता है, तो अपने ऐप्लिकेशन की मेनिफ़ेस्ट फ़ाइल में ये अनुमतियां दें:
- ब्लूटूथ क्लासिक या बीएलई से जुड़ी कोई भी कार्रवाइयां करने के लिए,
BLUETOOTH
ज़रूरी है. जैसे, कनेक्शन का अनुरोध करना, कनेक्शन स्वीकार करना, और डेटा ट्रांसफ़र करना. ACCESS_FINE_LOCATION
का इस्तेमाल करना ज़रूरी है, क्योंकि Android 11 और उससे पहले के वर्शन पर, ब्लूटूथ स्कैन का इस्तेमाल करके उपयोगकर्ता की जगह की जानकारी इकट्ठा की जा सकती है.
जगह की जानकारी की अनुमतियां रनटाइम की अनुमतियां होती हैं. इसलिए, आपको अपने मेनिफ़ेस्ट में इन अनुमतियों के बारे में बताने के साथ-साथ, रनटाइम के दौरान इन अनुमतियों का अनुरोध करना होगा.
आस-पास मौजूद ब्लूटूथ डिवाइसों को ढूंढना
अगर आपको अपने ऐप्लिकेशन से डिवाइस डिस्कवरी शुरू करनी है या ब्लूटूथ सेटिंग में बदलाव करना है, तो आपको BLUETOOTH_ADMIN
अनुमति का एलान करना होगा. ज़्यादातर ऐप्लिकेशन को सिर्फ़ आस-पास मौजूद ब्लूटूथ डिवाइसों को खोजने के लिए, इस अनुमति की ज़रूरत होती है. इस अनुमति से मिलने वाली अन्य सुविधाओं का इस्तेमाल तब तक न करें, जब तक कि ऐप्लिकेशन "पावर मैनेजर" न हो. यह ऐप्लिकेशन, उपयोगकर्ता के अनुरोध पर ब्लूटूथ सेटिंग में बदलाव करता है. अपनी ऐप्लिकेशन मेनिफ़ेस्ट फ़ाइल में अनुमति का एलान करें. उदाहरण के लिए:
<manifest>
...
<uses-permission android:name="android.permission.BLUETOOTH_ADM>IN&qu<ot; /
...>
/manifest
अगर आपका ऐप्लिकेशन किसी सेवा के साथ काम करता है और Android 10 (एपीआई लेवल 29) या Android 11 पर चल सकता है, तो आपको ब्लूटूथ डिवाइसों को ढूंढने के लिए, ACCESS_BACKGROUND_LOCATION
की अनुमति भी देनी होगी. इस ज़रूरी शर्त के बारे में ज़्यादा जानने के लिए, बैकग्राउंड में जगह की जानकारी ऐक्सेस करना लेख पढ़ें.
यहां दिए गए कोड स्निपेट में, ACCESS_BACKGROUND_LOCATION
अनुमति का एलान करने का तरीका बताया गया है:
<manifest>
...
<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATI>ON&qu<ot; /
...>
/manifest
ऐप्लिकेशन की अनुमतियों का एलान करने के बारे में ज़्यादा जानकारी के लिए, <uses-permission>
रेफ़रंस देखें.
ब्लूटूथ सुविधा के इस्तेमाल के बारे में बताना
अगर ब्लूटूथ आपके ऐप्लिकेशन का अहम हिस्सा है, तो अपनी मेनिफ़ेस्ट फ़ाइल में फ़्लैग जोड़कर इस ज़रूरत के बारे में बताया जा सकता है. <uses-feature>
एलिमेंट की मदद से, यह बताया जा सकता है कि आपका ऐप्लिकेशन किस तरह के हार्डवेयर का इस्तेमाल करता है और इसकी ज़रूरत है या नहीं.
इस उदाहरण में, यह बताने का तरीका बताया गया है कि आपके ऐप्लिकेशन के लिए ब्लूटूथ क्लासिक की ज़रूरत है.
<uses-feature android:name="android.hardware.bluetooth" android:requir>e
d="true"/
अगर आपका ऐप्लिकेशन, ब्लूटूथ कम ऊर्जा टेक्नोलॉजी पर निर्भर है, तो इनका इस्तेमाल किया जा सकता है:
<uses-feature android:name="android.hardware.bluetooth_le" android:requir>e
d="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);