أذونات البلوتوث

لاستخدام ميزات البلوتوث في تطبيقك، يجب الإفصاح عن عدة ميزات في التطبيق. الأذونات. يجب أيضًا تحديد ما إذا كان تطبيقك يتطلّب إتاحة تقنية البلوتوث الكلاسيكية أو تقنية البلوتوث المنخفضة الطاقة (BLE). إذا كان لا يتطلّب التطبيق استخدام البلوتوث الكلاسيكي أو تقنية BLE، لكنّه لا يزال بإمكانه الاستفادة من هذه الميزات يمكنك التحقق من توفّرها في وقت التشغيل.

تضمين الأذونات في بيان الأذونات

تعتمد مجموعة الأذونات التي تُفصح عنها في تطبيقك على إصدار حزمة تطوير البرامج (SDK) المستهدَف لتطبيقك.

استهداف الإصدار 12 من نظام التشغيل Android أو الإصدارات الأحدث

ملاحظة: في نظام التشغيل Android 8.0 (المستوى 26 من واجهة برمجة التطبيقات) والإصدارات الأحدث، رفيق يوفّر مدير الجهاز (CDM) طريقة أكثر سلاسة للاتصال الأجهزة المصاحبة مقارنةً بالأذونات الموضحة في هذا القسم. يقدّم نظام إدارة الحقوق الرقمية (CDM) واجهة مستخدم لإقران الأجهزة بالنيابة عن تطبيقك ولا يتطلّب أذونات تحديد الموقع الجغرافي.

إذا أردت التحكّم بشكل أكبر في تجربة الإقران والربط، استخدِم الأذونات الموضحة في هذا القسم.

مربّع حوار أذونات البلوتوث
مربع حوار أذونات النظام يطلب من المستخدم منح تطبيق الإذن بالعثور على الأجهزة المجاورة والإعلان عنها والاتصال بها الأجهزة.

إذا كان تطبيقك يستهدف الإصدار 12 من نظام التشغيل Android (المستوى 31) أو إصدارًا أحدث، يجب توضيح ما يلي: الأذونات في ملف البيان لتطبيقك:

  1. إذا كان تطبيقك يبحث عن بلوتوث الأجهزة، مثل في أجهزة BLE الملحقة، اذكر BLUETOOTH_SCAN إذن.
  2. إذا كان تطبيقك جعل الجهاز الحالي قابلاً للاكتشاف في أجهزة البلوتوث الأخرى الأجهزة أو الإعلان عن BLUETOOTH_ADVERTISE إذن.
  3. إذا كان التطبيق يتصل بالبلوتوث الذي تم إقرانه من قبل الأجهزة، عليك الإفصاح عن BLUETOOTH_CONNECT إذن.
  4. بالنسبة إلى بيانات الأذونات القديمة المتعلقة بالبلوتوث، اضبط android:maxSdkVersion إلى 30 تساعد خطوة توافق التطبيق هذه النظام منح تطبيقك أذونات البلوتوث فقط التي يحتاج إليها عند تثبيته على الأجهزة التي تعمل بنظام التشغيل Android 12 أو الإصدارات الأحدث.
  5. إذا كان تطبيقك يستخدم نتائج البحث عن بلوتوث للحصول على الموقع الجغرافي الفعلي، يُرجى توضيح الـ ACCESS_FINE_LOCATION إذن. بخلاف ذلك، يمكنك التأكيد بقوة على أن تطبيقك لا يستند إلى موقعك الجغرافي.

الأذونات BLUETOOTH_ADVERTISE وBLUETOOTH_CONNECT وBLUETOOTH_SCAN هي أذونات تشغيل. لذلك، يجب أن تطلب من المستخدم الموافقة في تطبيقك قبل أن تتمكّن من البحث عن أجهزة بلوتوث، أو جعل الجهاز قابلاً للاكتشاف في الأجهزة الأخرى، أو الاتصال باستخدام أجهزة تتضمّن بلوتوث سبق إقرانها. عندما يطلب تطبيقك واحدة على الأقل من هذه الأذونات، يطلب النظام من المستخدم السماح للتطبيق بالوصول إلى الأجهزة المجاورة، كما هو موضَّح في الشكل 1.

يوضح مقتطف الرمز التالي كيفية الإشارة إلى المشاكل المتعلقة بالبلوتوث. الأذونات في تطبيقك إذا كان يستهدف الإصدار 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>

التأكيد بقوة على أنّ تطبيقك لا يستند إلى الموقع الجغرافي الفعلي

إذا لم يكن تطبيقك يستخدم نتائج البحث عن البلوتوث للحصول على الموقع الجغرافي الفعلي، عليك: تأكيدًا قويًا على أنّ تطبيقك لا يستخدم أبدًا أذونات البلوتوث لاستنتاج الموقع الفعلي. للقيام بذلك، أكمل الخطوات التالية:

  1. أضِف السمة android:usesPermissionFlags إلى BLUETOOTH_SCAN. بيان الأذونات وضبط قيمة هذه السمة على 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" />

    <!-- Not needed if you can strongly assert that your app never derives
         physical location from Bluetooth scan results and doesn't need location
         access for any other purpose. -->
    <strike><uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /></strike>
    ...
</manifest>

استهداف الإصدار 11 من نظام التشغيل Android أو الإصدارات الأقدم

إذا كان تطبيقك يستهدف الإصدار Android 11 (المستوى 30 من واجهة برمجة التطبيقات) أو الإصدارات الأقدم، يُرجى توضيح ما يلي: الأذونات في ملف البيان لتطبيقك:

  • BLUETOOTH ضروري لإجراء أي اتصال عبر البلوتوث الكلاسيكي أو BLE، مثل طلب والاتصال وقبول الاتصال ونقل البيانات.
  • ACCESS_FINE_LOCATION هذا الإجراء ضروري لأنّه على نظام التشغيل Android 11 والإصدارات الأقدم، يمكن استخدام ميزة البحث عبر البلوتوث لجمع معلومات عن الموقع الجغرافي للمستخدم.

بما أنّ أذونات تحديد الموقع الجغرافي هي أذونات في وقت التشغيل، عليك طلب هذه الأذونات في وقت التشغيل. إلى جانب الإعلان عنها في بيان التطبيق.

التعرّف على الأجهزة التي تتضمّن بلوتوث محلي

إذا كنت تريد أن يبدأ تطبيقك عملية اكتشاف الأجهزة أو يغيّر إعدادات البلوتوث، يجب الإفصاح عن الإذن بالوصول إلى BLUETOOTH_ADMIN . تحتاج معظم التطبيقات إلى هذا الإذن فقط لإتاحة إمكانية اكتشاف أجهزة البلوتوث المحلية. لا تستخدِم الصلاحيات الأخرى التي يمنحها هذا الإذن ما لم يكن التطبيق "مدير الطاقة" يعدِّل إعدادات البلوتوث بناءً على طلب المستخدم. يُرجى تقديم بيان الإذن في ملف بيان التطبيق. بالنسبة مثال:

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

إذا كان تطبيقك متوافقًا مع خدمة ويمكن تشغيله على الإصدار 10 من نظام التشغيل Android (المستوى 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"/>

إذا كان تطبيقك يعتمد على تقنية Bluetooth Low Energy، يمكنك استخدام ما يلي:

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

إذا ذكرت أنّ الميزة مطلوبة لتطبيقك، سيخفي "متجر Google Play" تطبيقك عن المستخدمين الذين يستخدمون الأجهزة التي لا تتضمّن هذه الميزات. لهذا السبب، يجب عليك يجب ضبط السمة المطلوبة على 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)

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