Android 12 (API level 31) بر اساس تغییرات اخیر پلت فرم در مدل مجوزهای مکان، از جمله مکان پس زمینه و مجوزهای یکبار مصرف، ایجاد شده است. هنگامی که برنامه ای اندروید 12 را هدف قرار می دهد، کاربران می توانند درخواست کنند که فقط اطلاعات تقریبی موقعیت مکانی را بدست آورند، حتی وقتی درخواست مجوز اجرای ACCESS_FINE_LOCATION را کرده باشند.
اگر برنامه شما ACCESS_COARSE_LOCATION را درخواست کند اما ACCESS_FINE_LOCATION را درخواست نکرده باشد، تغییر توصیف شده در این صفحه تاثیری ندارد. همانطور که در شکل 1 نشان داده شده است وقتی برنامه شما Android 12 را هدف قرار می دهد و فقط ACCESS_COARSE_LOCATION ظاهر می شود.
برای احترام بیشتر به حریم خصوصی کاربر، توصیه می شود که فقط ACCESS_COARSE_LOCATION را درخواست کنید. با این کار حتی اگر فقط به اطلاعات تقریبی مکان دسترسی داشته باشید.بیشتر موارد کارایی لوکیشن را خواهید داشت.
شکل 1. گفتگوی مجوزهای سیستم که هنگامی که برنامه شما فقط ACCESS_COARSE_LOCATION درخواست می کند ظاهر می شود.
اگر برنامه شما Android 12 را هدف قرار داده است و شما درخواست اجازه ACCESS_FINE_LOCATION را دارید، شما باید همچنین مجوز ACCESS_COARSE_LOCATION را نیز درخواست کنید. شما باید هر دو مجوز را در یک بازه زمانی درخواست و مورد اجرا قرار دهید. اگر می خواهید فقط ACCESS_FINE_LOCATION درخواست کنید، سیستم این درخواست را نادیده می گیرد و پیام خطای زیر را در Logcat ثبت می کند:
ACCESS_FINE_LOCATION must be requested with ACCESS_COARSE_LOCATION
انتخاب کاربر بین مکان تقریبی و مکان دقیق
وقتی برنامه شما هم ACCESS_FINE_LOCATION و هم ACCESS_COARSE_LOCATION را درخواست می کند، کادر مجوزهای سیستم شامل گزینه های جدید زیر برای کاربر ظاهرمی شود:
- دقیق: فراهم کردن دقت مکانی را که اجازه ACCESS_FINE_LOCATION ارائه می دهد.
- تقریبی: دقت مکانی را ارائه می دهد که اجازه ACCESS_COARSE_LOCATION را ارائه می دهد.
شکل 2 نشان می دهد که محتوای کادر بصری را که برای هر دو گزینه جدید می باشد به کاربر در انتخاب گزینه کمک کند. پس از اینکه کاربر در مورد دقت مکان تصمیم گرفت، برای انتخاب مدت زمان اجرای مجوز، روی یکی از سه دکمه ضربه می زند. این دکمه ها همان دکمه هایی هستند که در کادرهای مجوز مکان در دستگاه های دارای Android 11 (سطح API 30) ظاهر می شوند.
در اندروید 12، کاربران می توانند بدون در نظر گرفتن نسخه SDK هدف آن برنامه، به تنظیمات سیستم مراجعه کرده و دقت مکان دلخواه را برای هر برنامه ای تنظیم کنند. این مطلب حتی در زمان هایی که برنامه شما روی دستگاهی با Android نسخه 11 یا پایینتر نصب شده باشد سپس آن را به Android12 ارتقا می دهید نیز صادق است و روند برنامه شما را مجدداً راه اندازی می کند. به همین دلایل، بسیار مهم است که بهترین روشهای درخواست مجوزهای زمان را اجرا و دنبال کنید.
شکل 2. کادر مجوزهای سیستم وقتی برنامه شما Android 12 را هدف قرار می دهد و ACCESS_FINE_LOCATION و ACCESS_COARSE_LOCATION را در یک درخواست زمان اجرا درخواست می کند، ظاهر می شود.
انتخاب کاربر بر اعطای مجوز تأثیر می گذارد
جدول زیر، مجوزهایی را که سیستم به برنامه شما اعطا می کند را نشان می دهد، بر اساس آن کاربر می تواند گزینه هایی که اجازه انتخاب مجوز ها را می دهد را انتخاب کنید:
Approximate | Precise | |
ACCESS_COARSE_LOCATION | ACCESS_FINE_LOCATION and
ACCESS_COARSE_LOCATION |
While using the app |
ACCESS_COARSE_LOCATION | ACCESS_FINE_LOCATION and
ACCESS_COARSE_LOCATION |
Only this time |
No location permissions | No location permissions | Deny |
برای تعیین اینکه سیستم کدام یک از اجازه ها را برای برنامه شما گارانتی کرده است، مقدار برگشتی درخواست مجوزهای خود را بررسی کنید. شما می توانید از کتابخانه های Jetpack از کدهایی استفاده کنید که مشابه کد زیر است، یا می توانید از کتابخانه های پلت فرم استفاده کنید، جایی که خودتان کد درخواست مجوز را مدیریت می کنید.
val locationPermissionRequest = registerForActivityResult( ActivityResultContracts.RequestMultiplePermissions() ) { permissions -> when { permissions.getOrDefault(Manifest.permission.ACCESS_FINE_LOCATION, false) -> { // Precise location access granted. } permissions.getOrDefault(Manifest.permission.ACCESS_COARSE_LOCATION, false) -> { // Only approximate location access granted. } else -> { // No location access granted. } } } // ... // Before you perform the actual permission request, check whether your app // already has the permissions, and whether your app needs to show a permission // rationale dialog. For more details, see Request permissions. locationPermissionRequest.launch(arrayOf( Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION))
ActivityResultLauncher<String[]> locationPermissionRequest = registerForActivityResult(new ActivityResultContracts .RequestMultiplePermissions(), result -> { Boolean fineLocationGranted = result.getOrDefault( Manifest.permission.ACCESS_FINE_LOCATION, false); Boolean coarseLocationGranted = result.getOrDefault( Manifest.permission.ACCESS_COARSE_LOCATION,false); if (fineLocationGranted != null && fineLocationGranted) { // Precise location access granted. } else if (coarseLocationGranted != null && coarseLocationGranted) { // Only approximate location access granted. } else { // No location access granted. } } ); // ... // Before you perform the actual permission request, check whether your app // already has the permissions, and whether your app needs to show a permission // rationale dialog. For more details, see Request permissions. locationPermissionRequest.launch(new String[] { Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION });
انتخاب کاربر روی موقعیت پس زمینه تأثیر می گذارد
اگر سیستم اجازه ACCESS_BACKGROUND_LOCATION را به برنامه شما بدهد، گزینه های انتخاب برای کاربر در کادر گفتگوی مجوزهای موقعیت پس زمینه نیز اعمال می شود.
به عنوان مثال، اگر کاربر به برنامه شما اجازه ACCESS_BACKGROUND_LOCATION را بدهد اما فقط دسترسی تقریبی موقعیت مکانی را در پیش زمینه فعال کند، برنامه شما در پس زمینه نیز دسترسی تقریبی موقعیت را دارد.
بروز رسانی لوکیشن به دقیقترین مکان
اگر در حال حاضر برنامه شما به دسترسی دقیق به مکان با استفاده از اجازه ACCESS_FINE_LOCATION اعتماد کند، ممکن است موقعیت تقریبی داشته باشد.
قبل از اینکه از کاربر بخواهید دسترسی برنامه شما را به مکان دقیق ارتقا دهد، بررسی کنید که آیا دقت مورد نیاز در برنامه شما جهت دست یابی به سطح دقیق را دارد. اگر برنامه شما نیاز به جفت سازی دستگاه با دستگاه های اطراف از طریق بلوتوث یا Wi-Fi دارد، به جای درخواست اجازه ACCESS_FINE_LOCATION ، استفاده از جفت شدن دستگاه همراه یا مجوزهای بلوتوث جدید را در نظر بگیرید.
برای درخواست از کاربر برای دسترسی به موقعیت مکانی برنامه شما از تقریبی به دقیق، موارد زیر را انجام دهید:
- در صورت لزوم ، توضیح دهید که چرا برنامه شما به مجوز نیاز دارد.
- دوباره مجوزهای ACCESS_FINE_LOCATION و ACCESS_COARSE_LOCATION را با هم درخواست کنید. از آنجا که کاربر قبلاً به سیستم اجازه داده است مکان تقریبی را به برنامه شما اعطا کند، کادر طاهر شده در سیستم این بار متفاوت است همانطور که در شکل 3 و شکل 4 نشان داده شده است:
شکل 3
شکل 4
تست نحوه اجازه دادن به برنامه جهت مشخص کردن دقیق لوکیشن
برای ارزیابی اینکه آیا برای پشتیبانی از توانایی کاربر جهت مشخص کردن مکان دقیق برنامه، تست شرح داده شده در این بخش را به کار گیرید.
- از ACCESS_FINE_LOCATION و ACCESS_COARSE_LOCATION درخواست کنید.
- در گفتگویی که ظاهر می شود (شکل 2) ، Approximate near the top را انتخاب کنید و یا هنگام استفاده از برنامه یاOnly this time near the bottom.
- بررسی کنید که آیا موارد استفاده از برنامه شما همچنان مطابق انتظار کار می کنند، حتی اگر برنامه شما تقریباً به موقعیت مکانی تقریبی دسترسی داشته باشد.
چگونه دقت مکان مشخص شده را از تنظیمات سیستم کاهش دهیم.
برای بررسی اینکه چگونه برنامه شما درخواست کاربر را برای تغییر دسترسی به موقعیت مکانی برنامه از دقیق به تقریبی در تنظیمات سیستم کنترل کند، موارد زیر را انجام دهید:
- هر دو گزینه ACCESS_FINE_LOCATION و ACCESS_COARSE_LOCATION را درخواست کنید.
- در کادر دیالوگی که ظاهر می شود (شکل 2)، دقیقاً در بالا و در حین استفاده از برنامه یا فقط این بار در قسمت پایین، گزینه Precise را انتخاب کنید.
- در تنظیمات سیستم به صفحه مجوزهای برنامه خود بروید.
- در صفحه اجازه مکان، استفاده از مکان دقیق را خاموش کنید. این گزینه در شکل 5 نشان داده شده است.
مانند هر نوع اعمال مجاز، سیستم روند برنامه شما را مجدداً راه اندازی می کند.
- بررسی کنید که آیا موارد استفاده از برنامه شما همچنان مطابق انتظار کار می کنند، حتی اگر برنامه شما تقریباً به موقعیت مکانی تقریبی دسترسی داشته باشد.
از تنظیمات سیستم، به روزرسانی دقیق مکان را انجام دهید
برای بررسی اینکه چگونه برنامه شما درخواست کاربر را برای تغییر دسترسی موقعیت مکانی برنامه شما از تقریبی به دقیق در تنظیمات سیستم کنترل می کند، موارد زیر را انجام دهید:
- از ACCESS_FINE_LOCATION و ACCESS_COARSE_LOCATION درخواست کنید.
- در گفتگویی که ظاهر می شود (شکل 2) ، تقریبی نزدیک به بالا را انتخاب کنید و یا هنگام استفاده از برنامه یا فقط این بار نزدیک به پایین.
- در تنظیمات سیستم به صفحه مجوزهای برنامه خود بروید.
- همانطور که در شکل 5 نشان داده شده است، در صفحه مجوز موقعیت مکانی را روشن کنید. از آنجا که این تغییر مجوز یک بروزرسانی است، سیستم برنامه شما را مجدداً راه اندازی نمی کند.
- بررسی کنید آیا برنامه شما در موارد استفاده مبتنی بر موقعیت مکانی، داده موقعیت مکانی دقیق تری دریافت می کند یا خیر.
شکل 5. صفحه اجازه موقعیت مکانی یک برنامه در تنظیمات سیستم شامل استفاده از مکان دقیق.