Android 12 به تازگی مجوزهای BLUETOOTH_SCAN ، BLUETOOTH_ADVERTISE و BLUETOOTH_CONNECT را معرفی می کند که به برنامه شما اجازه می دهد بدون نیاز به اجازه مکان، دستگاه های اطراف را اسکن کند. برنامه شما برای بهرمندی از اعلام این مجوزها باید Android 12 باشد.
توجه: Companion Device Manager در مقایسه با مجوزهای توصیف شده در این صفحه روش ساده تری برای اتصال به دستگاه های همراه ارائه می دهد. سیستم CDM از طرف برنامه شما یک رابط کاربری جفت سازی فراهم می کند و نیازی به مجوزهای موقعیت مکانی ندارد.
مجوزهای جدید را اعلام کنید.
اگر برنامه شما با دستگاه های بلوتوث تعامل دارد، اکیداً توصیه می شود موارد زیر را انجام دهید:
-
اگر برنامه شما به دنبال دستگاه های بلوتوث مانند وسایل جانبی کم مصرف بلوتوث (BLE) است، اجازه BLUETOOTH_SCAN را به manifest برنامه خود اضافه کنید.
-
اگر برنامه شما دستگاه فعلی را برای سایر دستگاههای بلوتوث قابل شناسایی می کند، اجازه BLUETOOTH_ADVERTISE را به manifest برنامه خود اضافه کنید.
-
اگر برنامه شما با دستگاه های بلوتوث از قبل جفت شده ارتباط برقرار می کند، اجازه BLUETOOTH_CONNECT را به manifest برنامه خود اضافه کنید.
-
برای اعلامیه های مربوط به اجازه مربوط به بلوتوث قدیمی، android: maxSdkVersion را روی 30 تنظیم کنید. این مرحله سازگاری برنامه به سیستم کمک می کند تا برنامه هنگام نصب در دستگاههایی که از 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. You must add an attribute to this permission, or declare the ACCESS_FINE_LOCATION permission, depending on the results when you check location usage in your app. --> <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" /> ... </manifest>
User-facing dialog
مجوزهای BLUETOOTH_SCAN ، BLUETOOTH_ADVERTISE و BLUETOOTH_CONNECT مجوزهای زمان اجرا هستند. بنابراین، قبل از اینکه بخواهید به دنبال دستگاه های بلوتوث باشید، دستگاهی را برای سایر دستگاه ها قابل شناسایی کنید یا با دستگاه های بلوتوث جفت شده دیگر ارتباط برقرار کنید، باید صریحاً در برنامه خود تأیید کاربر را درخواست کنید.
وقتی برنامه شما حداقل یکی از مجوزهای بلوتوث جدید را درخواست می کند، سیستم از کاربر می خواهد که به برنامه شما اجازه دهد به دستگاه های نزدیک دسترسی پیدا کند، همانطور که در شکل 1 نشان داده شده است.
شکل 1. System permissions dialog، از کاربر می خواهد به یک برنامه اجازه کشف، تبلیغ و اتصال به دستگاه های اطراف را بدهد.
نحوه استفاده از نتایج اسکن را در نظر بگیرید
با دقت بررسی کنید که آیا برنامه شما از نتایج اسکن بلوتوث برای بدست آوردن مکان دستگاه استفاده می کند. بسته به پاسخ خود، مراحل را در یکی از بخشهای زیر انجام دهید.
-
App doesn’t derive physical location
اگر برنامه شما مکان فیزیکی ندارد، می توانید ادعای محکمی کنید که برنامه شما هرگز از مجوزهای بلوتوث برای بدست آوردن مکان فیزیکی استفاده نمی کند. برای انجام این کار، مراحل زیر را انجام دهید:
-
ویژگی android: usePermissionFlags را به اعلامیه اجازه BLUETOOTH_SCAN خود اضافه کنید و مقدار این ویژگی را روی neverForLocation تنظیم کنید.
توجه: اگر neverForLocation را در android خود استفاده می کنید: استفاده از PermissionFlags ، برخی از چراغ های BLE از نتایج اسکن فیلتر می شوند.
-
اگر مکان دیگری برای برنامه شما لازم نیست، اجازه ACCESS_FINE_LOCATION را از manifest برنامه خود حذف کنید.
قطعه کد زیر نحوه به روزرسانی پرونده manifest برنامه شما را نشان می دهد:
<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" /> <!-- 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" /> <uses-permission android:name="android.permission.BLUETOOTH_ADVERTISE" /> <uses-permission android:name="android.permission.BLUETOOTH_CONNECT" /> <!-- 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. --> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> ... </manifest>
- App derives physical location
اگر برنامه شما مکان فیزیکی دارد، باید همچنان ACCESS_FINE_LOCATION مجوز برنامه خود را اعلام کنید، همانطور که در قطعه کد زیر نشان داده شده است:
<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" /> <uses-permission android:name="android.permission.BLUETOOTH_SCAN" /> <uses-permission android:name="android.permission.BLUETOOTH_ADVERTISE" /> <uses-permission android:name="android.permission.BLUETOOTH_CONNECT" /> <!-- Required if your app derives physical location from Bluetooth scan results. --> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> ... </manifest>