আপনার অ্যাপে ব্লুটুথ ফিচার ব্যবহার করার জন্য, আপনাকে বেশ কিছু পারমিশন ঘোষণা করতে হবে। আপনার অ্যাপের জন্য ব্লুটুথ ক্লাসিক নাকি ব্লুটুথ লো এনার্জি (BLE) সাপোর্টের প্রয়োজন আছে, তাও আপনাকে উল্লেখ করতে হবে। যদি আপনার অ্যাপের ব্লুটুথ ক্লাসিক বা BLE-এর প্রয়োজন না হয়, কিন্তু এই প্রযুক্তিগুলো থেকে সুবিধা পেতে পারে, তাহলে আপনি রানটাইমে এগুলোর প্রাপ্যতা যাচাই করতে পারেন।
অনুমতি ঘোষণা করুন
আপনার অ্যাপে আপনি যে অনুমতিগুলো ঘোষণা করেন, তা আপনার অ্যাপের টার্গেট SDK ভার্সনের উপর নির্ভর করে।
অ্যান্ড্রয়েড ১২ বা তার উচ্চতর সংস্করণ
দ্রষ্টব্য: অ্যান্ড্রয়েড ৮.০ (এপিআই লেভেল ২৬) এবং এর পরবর্তী সংস্করণগুলোতে, এই বিভাগে বর্ণিত অনুমতিগুলোর তুলনায় কম্প্যানিয়ন ডিভাইস ম্যানেজার (সিডিএম) কম্প্যানিয়ন ডিভাইসগুলোর সাথে সংযোগ স্থাপনের একটি আরও সুবিন্যস্ত পদ্ধতি প্রদান করে। সিডিএম সিস্টেমটি আপনার অ্যাপের পক্ষ থেকে একটি পেয়ারিং ইউআই প্রদান করে এবং এর জন্য লোকেশন অনুমতির প্রয়োজন হয় না।
পেয়ারিং এবং কানেক্টিং অভিজ্ঞতার উপর আরও বেশি নিয়ন্ত্রণ চাইলে, এই বিভাগে বর্ণিত অনুমতিগুলো ব্যবহার করুন।
আপনার অ্যাপটি যদি অ্যান্ড্রয়েড ১২ (এপিআই লেভেল ৩১) বা তার উচ্চতর সংস্করণকে টার্গেট করে, তাহলে আপনার অ্যাপের ম্যানিফেস্ট ফাইলে নিম্নলিখিত পারমিশনগুলো ঘোষণা করুন:
- আপনার অ্যাপ যদি BLE পেরিফেরালের মতো ব্লুটুথ ডিভাইস খোঁজে , তাহলে
BLUETOOTH_SCANপারমিশনটি ঘোষণা করুন। - আপনার অ্যাপ যদি বর্তমান ডিভাইসটিকে অন্যান্য ব্লুটুথ ডিভাইসের কাছে আবিষ্কারযোগ্য করে তোলে , তাহলে
BLUETOOTH_ADVERTISEপারমিশনটি ঘোষণা করুন। - আপনার অ্যাপ যদি আগে থেকে পেয়ার করা ব্লুটুথ ডিভাইসের সাথে যোগাযোগ করে , তাহলে
BLUETOOTH_CONNECTপারমিশনটি ঘোষণা করুন। - আপনার পুরোনো ব্লুটুথ-সম্পর্কিত অনুমতি ঘোষণার জন্য,
android:maxSdkVersionকে 30-তে সেট করুন। অ্যাপ সামঞ্জস্যতার এই পদক্ষেপটি সিস্টেমকে সাহায্য করে যাতে অ্যান্ড্রয়েড ১২ বা তার উচ্চতর সংস্করণে চালিত ডিভাইসে ইনস্টল করার সময় আপনার অ্যাপটি কেবল প্রয়োজনীয় ব্লুটুথ অনুমতিগুলোই পায়। - যদি আপনার অ্যাপ ভৌতিক অবস্থান নির্ণয়ের জন্য ব্লুটুথ স্ক্যানের ফলাফল ব্যবহার করে, তাহলে
ACCESS_FINE_LOCATIONপারমিশনটি ঘোষণা করুন। অন্যথায়, আপনি দৃঢ়ভাবে নিশ্চিত করতে পারেন যে আপনার অ্যাপ ভৌতিক অবস্থান নির্ণয় করে না এবংACCESS_FINE_LOCATIONপারমিশনের জন্যandroid:maxSdkVersionকে 30-তে সেট করতে পারেন।
BLUETOOTH_ADVERTISE , BLUETOOTH_CONNECT , এবং BLUETOOTH_SCAN পারমিশনগুলো হলো রানটাইম পারমিশন । তাই, ব্লুটুথ ডিভাইস খোঁজা, কোনো ডিভাইসকে অন্য ডিভাইসের কাছে ডিসকভারেবল করা, বা আগে থেকে পেয়ার করা ব্লুটুথ ডিভাইসের সাথে যোগাযোগ করার আগে, আপনাকে অবশ্যই আপনার অ্যাপে ব্যবহারকারীর কাছ থেকে সুস্পষ্টভাবে অনুমতি চাইতে হবে । যখন আপনার অ্যাপ এই পারমিশনগুলোর মধ্যে অন্তত একটির জন্য অনুরোধ করে, তখন সিস্টেম ব্যবহারকারীকে কাছাকাছি থাকা ডিভাইসগুলো অ্যাক্সেস করার অনুমতি দিতে বলে, যেমনটি চিত্র ১-এ দেখানো হয়েছে।
নিম্নলিখিত কোড স্নিপেটটি দেখায় যে, আপনার অ্যাপটি যদি অ্যান্ড্রয়েড ১২ বা তার উচ্চতর সংস্করণকে টার্গেট করে, তবে তাতে ব্লুটুথ-সম্পর্কিত অনুমতিগুলি কীভাবে ঘোষণা করতে হয়:
<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>
দৃঢ়ভাবে দাবি করুন যে আপনার অ্যাপ ভৌতিক অবস্থান নির্ণয় করে না।
যদি আপনার অ্যাপ ভৌতিক অবস্থান নির্ণয়ের জন্য ব্লুটুথ স্ক্যানের ফলাফল ব্যবহার না করে, তাহলে আপনি একটি জোরালো দাবি করতে পারেন যে আপনার অ্যাপ ভৌতিক অবস্থান নির্ণয়ের জন্য কখনোই ব্লুটুথ অনুমতি ব্যবহার করে না। এটি করার জন্য, নিম্নলিখিত ধাপগুলো সম্পন্ন করুন:
আপনার
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 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>
অ্যান্ড্রয়েড ১১ বা তার নিম্নস্তরের টার্গেট
আপনার অ্যাপটি যদি অ্যান্ড্রয়েড ১১ (এপিআই লেভেল ৩০) বা তার নিচের সংস্করণকে টার্গেট করে, তাহলে আপনার অ্যাপের ম্যানিফেস্ট ফাইলে নিম্নলিখিত পারমিশনগুলো ঘোষণা করুন:
- যেকোনো ক্লাসিক ব্লুটুথ বা বিএলই (BLE) যোগাযোগ, যেমন সংযোগের অনুরোধ করা, সংযোগ গ্রহণ করা এবং ডেটা স্থানান্তর করার জন্য
BLUETOOTHআবশ্যক। -
ACCESS_FINE_LOCATIONপ্রয়োজনীয়, কারণ Android 11 এবং এর পূর্ববর্তী সংস্করণগুলোতে ব্যবহারকারীর অবস্থান সম্পর্কে তথ্য সংগ্রহের জন্য ব্লুটুথ স্ক্যান ব্যবহার করা হতে পারে।
যেহেতু লোকেশন পারমিশনগুলো রানটাইম পারমিশন , তাই আপনাকে অবশ্যই রানটাইমে এই পারমিশনগুলোর জন্য অনুরোধ করতে হবে এবং একই সাথে আপনার ম্যানিফেস্টে এগুলো ঘোষণা করতে হবে।
স্থানীয় ব্লুটুথ ডিভাইসগুলি আবিষ্কার করুন
যদি আপনি চান আপনার অ্যাপ ডিভাইস ডিসকভারি শুরু করুক বা ব্লুটুথ সেটিংস পরিবর্তন করুক, তাহলে আপনাকে অবশ্যই BLUETOOTH_ADMIN পারমিশনটি ডিক্লেয়ার করতে হবে। বেশিরভাগ অ্যাপের এই পারমিশনটি শুধুমাত্র লোকাল ব্লুটুথ ডিভাইস ডিসকভার করার ক্ষমতার জন্য প্রয়োজন হয়। এই পারমিশন দ্বারা প্রদত্ত অন্যান্য ক্ষমতা ব্যবহার করবেন না, যদি না অ্যাপটি একটি "পাওয়ার ম্যানেজার" হয় যা ব্যবহারকারীর অনুরোধে ব্লুটুথ সেটিংস পরিবর্তন করে। আপনার অ্যাপ ম্যানিফেস্ট ফাইলে পারমিশনটি ডিক্লেয়ার করুন। উদাহরণস্বরূপ:
<manifest>
...
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
...
</manifest>
যদি আপনার অ্যাপ কোনো সার্ভিস সাপোর্ট করে এবং অ্যান্ড্রয়েড ১০ (এপিআই লেভেল ২৯) বা অ্যান্ড্রয়েড ১১-এ চলতে পারে, তাহলে ব্লুটুথ ডিভাইস খুঁজে বের করার জন্য আপনাকে অবশ্যই 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"/>
যদি আপনি বলেন যে আপনার অ্যাপের জন্য কোনো ফিচার আবশ্যক, তাহলে গুগল প্লে স্টোর সেইসব ডিভাইসের ব্যবহারকারীদের কাছ থেকে আপনার অ্যাপটি লুকিয়ে ফেলবে যেগুলোতে সেই ফিচারটি নেই। এই কারণে, আপনার অ্যাপটি যদি সেই ফিচারটি ছাড়া কাজ করতে না পারে, তবেই কেবল required অ্যাট্রিবিউটটিকে true সেট করা উচিত।
রানটাইমে ফিচারের প্রাপ্যতা যাচাই করুন
যেসব ডিভাইস ব্লুটুথ ক্লাসিক বা BLE সাপোর্ট করে না, সেগুলোতে আপনার অ্যাপটি উপলব্ধ করতে, আপনার অ্যাপের ম্যানিফেস্টে <uses-feature> এলিমেন্টটি অন্তর্ভুক্ত করা উচিত, তবে required="false" সেট করতে হবে। তারপর, রান-টাইমে, আপনি PackageManager.hasSystemFeature() ব্যবহার করে ফিচারটির প্রাপ্যতা নির্ধারণ করতে পারবেন।
কোটলিন
// 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);