ব্লুটুথ অ্যাক্সেস করার অনুমতি

আপনার অ্যাপে ব্লুটুথ ফিচার ব্যবহার করতে, আপনাকে অবশ্যই একাধিক অনুমতি ঘোষণা করতে হবে। এছাড়াও, আপনার অ্যাপের জন্য ব্লুটুথ ক্লাসিক বা ব্লুটুথ লো এনার্জি (BLE)-এর সহায়তা প্রয়োজন কিনা তা উল্লেখ করতে হবে। আপনার অ্যাপের জন্য ব্লুটুথ ক্লাসিক বা BLE-এর প্রয়োজন না হলেও, এই প্রযুক্তি থেকে সুবিধা পেতে পারে, আপনি রানটাইমে উপলভ্যতা চেক করতে পারেন।

অনুমতি ঘোষণা করা

আপনার অ্যাপে আপনি যে অনুমতির সেট ঘোষণা করেন তা আপনার অ্যাপের টার্গেট SDK ভার্সনের উপর নির্ভর করে।

Android 12 বা তার পরবর্তী যেকোনও ভার্সন টার্গেট করুন

মনে রাখবেন: Android 8.0 (API লেভেল ২৬) এবং তার পরবর্তী ভার্সনে, কম্প্যানিয়ন ডিভাইস ম্যানেজার (CDM) কম্প্যানিয়ন ডিভাইসের সাথে কানেক্ট করার আরও স্ট্রিমলাইন করা পদ্ধতি প্রদান করে, যা এই বিভাগে বর্ণিত অনুমতির তুলনায় অনেক সহজ। CDM সিস্টেম আপনার অ্যাপের হয়ে পেয়ারিং UI প্রদান করে এবং এর জন্য লোকেশন সংক্রান্ত অনুমতির প্রয়োজন হয় না।

পেয়ারিং ও কানেক্ট করার অভিজ্ঞতার উপর আরও নিয়ন্ত্রণ চাইলে, এই বিভাগে উল্লেখ করা অনুমতি ব্যবহার করুন।

ব্লুটুথ অ্যাক্সেস করার অনুমতি সংক্রান্ত ডায়ালগ
সিস্টেমের অনুমতি সংক্রান্ত ডায়ালগ, যা ব্যবহারকারীকে আশেপাশের ডিভাইস খুঁজতে, বিজ্ঞাপন দিতে এবং কানেক্ট করতে অ্যাপকে অনুমতি দিতে বলে।

আপনার অ্যাপ Android 12 (API লেভেল 31) বা তার পরবর্তী যেকোনও ভার্সনকে টার্গেট করলে, অ্যাপের ম্যানিফেস্ট ফাইলে নিম্নলিখিত অনুমতি ঘোষণা করুন:

  1. আপনার অ্যাপ BLE পেরিফেরালের মতো ব্লুটুথ ডিভাইস খুঁজলে, BLUETOOTH_SCAN অনুমতি ঘোষণা করুন।
  2. আপনার অ্যাপ বর্তমান ডিভাইসকে অন্যান্য ব্লুটুথ ডিভাইসের কাছে খুঁজে নেওয়ার যোগ্য করে তুললে, BLUETOOTH_ADVERTISE অনুমতি ঘোষণা করুন।
  3. আপনার অ্যাপ আগে থেকে পেয়ার করা ব্লুটুথ ডিভাইসের সাথে কমিউনিকেট করলে, BLUETOOTH_CONNECT অনুমতি ঘোষণা করুন।
  4. আপনার লিগ্যাসি ব্লুটুথ-সম্পর্কিত অনুমতি সংক্রান্ত ঘোষণার জন্য, android:maxSdkVersion-কে ৩০-এ সেট করুন। এই অ্যাপের কম্প্যাটিবিলিটি সংক্রান্ত ধাপটি সিস্টেমকে সাহায্য করে আপনার অ্যাপকে শুধুমাত্র ব্লুটুথ সংক্রান্ত অনুমতি দিতে যা Android 12 বা তার পরবর্তী ভার্সনে চলা ডিভাইসে ইনস্টল করার সময় প্রয়োজন হয়।
  5. আপনার অ্যাপ যদি ফিজিক্যাল লোকেশন পাওয়ার জন্য ব্লুটুথ স্ক্যান ফলাফল ব্যবহার করে, তাহলে ACCESS_FINE_LOCATION অনুমতি ঘোষণা করুন। অন্যথায়, আপনি দৃঢ়ভাবে দাবি করতে পারেন যে আপনার অ্যাপ ফিজিক্যাল লোকেশন সংগ্রহ করে না এবং ACCESS_FINE_LOCATION অনুমতির জন্য android:maxSdkVersion সেট করে ৩০ করতে পারেন।

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 (API লেভেল 30) বা তার আগের কোনও ভার্সনকে টার্গেট করলে, অ্যাপের ম্যানিফেস্ট ফাইলে নিম্নলিখিত অনুমতি ঘোষণা করুন:

  • BLUETOOTH প্রয়োজন যাতে যেকোনও ব্লুটুথ ক্লাসিক বা BLE কমিউনিকেশন করা যায়, যেমন কানেকশনের জন্য অনুরোধ করা, কানেকশন গ্রহণ করা এবং ডেটা ট্রান্সফার করা।
  • ACCESS_FINE_LOCATION প্রয়োজন কারণ Android 11 ও তার আগের যেকোনও ভার্সনে, ব্লুটুথ স্ক্যান সম্ভবত ব্যবহারকারীর লোকেশন সম্পর্কে তথ্য সংগ্রহ করতে ব্যবহার করা হতে পারে।

লোকেশন অ্যাক্সেস করার অনুমতি হল রানটাইম অনুমতি, তাই আপনাকে অবশ্যই রানটাইমে এই অনুমতিগুলির জন্য অনুরোধ করতে হবে এবং আপনার ম্যানিফেস্টে সেগুলি ঘোষণা করতে হবে।

স্থানীয় ব্লুটুথ ডিভাইস খুঁজে দেখুন

আপনার অ্যাপ যদি ডিভাইস খোঁজা শুরু করতে চায় বা ব্লুটুথ সেটিংস পরিবর্তন করতে চায়, তাহলে আপনাকে অবশ্যই BLUETOOTH_ADMIN অনুমতি ঘোষণা করতে হবে। বেশিরভাগ অ্যাপের এই অনুমতি প্রয়োজন হয় শুধুমাত্র স্থানীয় ব্লুটুথ ডিভাইস খুঁজে পাওয়ার জন্য। এই অনুমতির মাধ্যমে প্রদত্ত অন্যান্য ক্ষমতা ব্যবহার করবেন না, যদি না অ্যাপটি এমন একটি "পাওয়ার ম্যানেজার" হয় যা ব্যবহারকারীর অনুরোধে ব্লুটুথ সেটিংস পরিবর্তন করে। আপনার অ্যাপের ম্যানিফেস্ট ফাইলে অনুমতি ঘোষণা করুন। যেমন:

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

আপনার অ্যাপ কোনও পরিষেবা সাপোর্ট করলে এবং Android 10 (API লেভেল 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-এ সেট করতে হবে।

রানটাইমে ফিচার উপলভ্য কিনা চেক করুন

ব্লুটুথ ক্লাসিক বা BLE কাজ করে না এমন ডিভাইসে আপনার অ্যাপ উপলভ্য করতে, আপনাকে এখনও অ্যাপের ম্যানিফেস্টে <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)

জাভা

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