لاستخدام ميزات البلوتوث في تطبيقك، عليك تحديد عدة أذونات. عليك أيضًا تحديد ما إذا كان تطبيقك يتطلّب إتاحة استخدام البلوتوث العادي أو البلوتوث المنخفض الطاقة (BLE). إذا كان تطبيقك لا يتطلّب استخدام بلوتوث الكلاسيكي أو BLE ولكن يمكنه الاستفادة من هاتين التقنيتين، يمكنك التحقّق من مدى توفّرهما في وقت التشغيل.
تضمين الأذونات في نماذج البيان
تعتمد مجموعة الأذونات التي تفصح عنها في تطبيقك على إصدار حزمة SDK المستهدَف في تطبيقك.
استهداف الإصدار 12 من نظام التشغيل Android أو الإصدارات الأحدث
ملاحظة: في نظام التشغيل Android 8.0 (المستوى 26 من واجهة برمجة التطبيقات) والإصدارات الأحدث، يوفّر مدير الأجهزة المرافقة (CDM) طريقة أكثر سلاسة للاتصال بالأجهزة المرافقة مقارنةً بالأذونات الموضّحة في هذا القسم. يوفّر نظام CDM واجهة مستخدم للإقران نيابةً عن تطبيقك ولا يتطلّب أذونات تحديد الموقع الجغرافي.
إذا أردت التحكّم بشكل أكبر في تجربة الإقران والربط، استخدِم الأذونات الموضّحة في هذا القسم.
إذا كان تطبيقك يستهدف الإصدار 12 من نظام التشغيل Android (المستوى 31 لواجهة برمجة التطبيقات) أو الإصدارات الأحدث، عليك تقديم بيان عن الأذونات التالية في ملف البيان الخاص بتطبيقك:
- إذا كان تطبيقك يبحث عن أجهزة بلوتوث، مثل أجهزة BLE الطرفية، يجب الإفصاح عن إذن
BLUETOOTH_SCAN
. - إذا كان تطبيقك يجعل الجهاز الحالي قابلاً للاكتشاف من قِبل أجهزة بلوتوث أخرى،
عليك الإفصاح عن إذن
BLUETOOTH_ADVERTISE
. - إذا كان تطبيقك يتواصل مع أجهزة بلوتوث سبق إقرانها، عليك الإفصاح عن إذن
BLUETOOTH_CONNECT
. - بالنسبة إلى بيانات الإذن القديمة المتعلقة بالبلوتوث، اضبط قيمة
android:maxSdkVersion
على 30. تساعد خطوة توافق التطبيق هذه النظام على منح تطبيقك أذونات البلوتوث التي يحتاجها فقط عند تثبيته على الأجهزة التي تعمل بالإصدار 12 من نظام التشغيل Android أو الإصدارات الأحدث. - إذا كان تطبيقك يستخدم نتائج البحث عن أجهزة البلوتوث لتحديد الموقع الجغرافي، عليك تضمين إذن
ACCESS_FINE_LOCATION
في بيان التطبيق. بخلاف ذلك، يمكنك التأكيد بشدة على أنّ تطبيقك لا يستمد الموقع الجغرافي الفعلي وضبط قيمةandroid:maxSdkVersion
على 30 لإذنACCESS_FINE_LOCATION
.
الأذونات BLUETOOTH_ADVERTISE
وBLUETOOTH_CONNECT
وBLUETOOTH_SCAN
هي أذونات وقت التشغيل.
لذلك، يجب طلب موافقة المستخدم بشكل صريح في تطبيقك قبل أن تتمكّن من البحث عن أجهزة بلوتوث أو جعل جهاز ما قابلاً للاكتشاف من قِبل الأجهزة الأخرى أو التواصل مع أجهزة بلوتوث سبق إقرانها. عندما يطلب تطبيقك إذنًا واحدًا على الأقل من هذه الأذونات، يطلب النظام من المستخدم السماح لتطبيقك بالوصول إلى الأجهزة المجاورة، كما هو موضّح في الشكل 1.
يوضّح مقتطف الرمز التالي كيفية تعريف الأذونات ذات الصلة بتقنية Bluetooth في تطبيقك إذا كان يستهدف الإصدار 12 من نظام التشغيل Android أو الإصدارات الأحدث:
<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>
التأكيد بشدة على أنّ تطبيقك لا يستند إلى الموقع الجغرافي الفعلي
إذا كان تطبيقك لا يستخدم نتائج البحث عن أجهزة البلوتوث لتحديد الموقع الجغرافي الفعلي، يمكنك تقديم تأكيد قوي بأنّ تطبيقك لا يستخدم أبدًا أذونات البلوتوث لتحديد الموقع الجغرافي الفعلي. لإجراء ذلك، يُرجى إكمال الخطوات التالية:
أضِف السمة
android:usesPermissionFlags
إلىBLUETOOTH_SCAN
بيان الإذن، واضبط قيمة هذه السمة على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>
استهداف الإصدار 11 من نظام التشغيل Android أو الإصدارات الأقدم
إذا كان تطبيقك يستهدف الإصدار 11 من نظام التشغيل Android (المستوى 30 لواجهة برمجة التطبيقات) أو إصدارًا أقدم، عليك تقديم بيان عن الأذونات التالية في ملف البيان الخاص بتطبيقك:
BLUETOOTH
ضروري لإجراء أي عملية اتصال عبر البلوتوث الكلاسيكي أو البلوتوث المنخفض الطاقة، مثل طلب اتصال وقبول اتصال ونقل البيانات.ACCESS_FINE_LOCATION
ضروري لأنّه على نظام التشغيل Android 11 والإصدارات الأقدم، يمكن استخدام عملية البحث عن أجهزة البلوتوث لجمع معلومات عن الموقع الجغرافي للمستخدم.
بما أنّ أذونات تحديد الموقع الجغرافي هي أذونات وقت التشغيل، عليك طلب هذه الأذونات في وقت التشغيل بالإضافة إلى تعريفها في ملف البيان.
اكتشاف أجهزة بلوتوث محلية
إذا كنت تريد أن يبدأ تطبيقك في البحث عن الأجهزة أو تعديل إعدادات البلوتوث، عليك الإفصاح عن إذن BLUETOOTH_ADMIN
. تحتاج معظم التطبيقات إلى هذا الإذن فقط لتتمكّن من اكتشاف أجهزة البلوتوث المحلية. يجب عدم استخدام الإمكانات الأخرى التي يمنحها هذا الإذن إلا إذا كان التطبيق "مدير طاقة" يعدّل إعدادات البلوتوث بناءً على طلب المستخدم. يجب تضمين الإذن في ملف بيان التطبيق. على سبيل المثال:
<manifest>
...
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
...
</manifest>
إذا كان تطبيقك يتيح خدمة ويمكن تشغيله على الإصدار 10 (المستوى 29 من واجهة برمجة التطبيقات) أو الإصدار 11 من نظام التشغيل Android، عليك أيضًا تقديم بيان 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 تطبيقك عن المستخدمين الذين لا تتوفّر لديهم هذه الميزات على أجهزتهم. لهذا السبب، يجب ضبط السمة required على 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);