لحماية خصوصية المستخدم، على التطبيقات التي تستخدم خدمات الموقع الجغرافي طلب أذونات تحديد الموقع الجغرافي.
عند طلب أذونات الموقع الجغرافي، اتّبِع أفضل الممارسات نفسها التي تطبّقها عند طلب أي إذن تشغيل آخر. يتمثل أحد الاختلافات المهمة في ما يتعلق بأذونات الموقع الجغرافي في أنّه يتضمّن النظام أذونات متعددة ذات صلة بالموقع الجغرافي. وتعتمد الأذونات التي تطلبها وطريقة طلبها على متطلبات الموقع الجغرافي لحالة استخدام تطبيقك.
توضّح هذه الصفحة الأنواع المختلفة لمتطلبات الموقع الجغرافي وتقدّم إرشادات حول كيفية طلب أذونات تحديد الموقع الجغرافي في كل حالة.
أنواع الوصول إلى الموقع الجغرافي
لكل إذن مجموعة من السمات التالية:
- الفئة: إما الموقع الجغرافي في المقدّمة أو الموقع الجغرافي في الخلفية.
- الدقة: إما الموقع الجغرافي الدقيق أو التقريبي
الموقع الجغرافي للواجهة
إذا كان تطبيقك يتضمّن ميزة تشارك معلومات الموقع الجغرافي أو تتلقّاها مرة واحدة فقط أو لفترة زمنية محدّدة، تتطلّب هذه الميزة الوصول إلى الموقع الجغرافي في المقدّمة. في ما يلي بعض الأمثلة:
- تتيح ميزة في تطبيق التنقّل للمستخدمين الحصول على اتجاهات مفصّلة.
- تتيح ميزة في تطبيق مراسلة للمستخدمين مشاركة موقعهم الجغرافي الحالي مع مستخدم آخر.
يعتبر النظام أنّ تطبيقك يستخدم الموقع الجغرافي في المقدّمة إذا كانت إحدى ميزات تطبيقك تصل إلى الموقع الجغرافي الحالي للجهاز في إحدى الحالات التالية:
- النشاط الخاص بتطبيقك مرئي.
يشغّل تطبيقك خدمة تعمل في المقدّمة. عند تشغيل خدمة تعمل في المقدّمة، يُعلِم النظام المستخدم من خلال عرض إشعار دائم. يحتفظ تطبيقك بالوصول إلى البيانات عندما يكون في الخلفية، مثلاً عندما يضغط العميل على زر الصفحة الرئيسية على جهازه أو يطفئ شاشة جهازه.
بالإضافة إلى ذلك، ننصحك بتقديم بيان عن نوع الخدمة التي تعمل في المقدّمة
location
، كما هو موضّح في مقتطف الرمز البرمجي التالي. في الإصدار 10 من نظام التشغيل Android ( مستوى واجهة برمجة التطبيقات 29) والإصدارات الأحدث، يجب تقديم بيان عن نوع الخدمة التي تعمل في المقدّمة هذا.<!-- Recommended for Android 9 (API level 28) and lower. --> <!-- Required for Android 10 (API level 29) and higher. --> <service android:name="MyNavigationService" android:foregroundServiceType="location" ... > <!-- Any inner elements would go here. --> </service>
أنت تقرّ بالحاجة إلى الموقع الجغرافي في المقدّمة عندما يطلب تطبيقك إذن
ACCESS_COARSE_LOCATION
أو إذن
ACCESS_FINE_LOCATION
على النحو الموضّح في المقتطف التالي:
<manifest ... > <!-- Always include this permission --> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <!-- Include only if your app benefits from precise location access. --> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> </manifest>
رصد الموقع الجغرافي في الخلفية
يتطلب التطبيق الوصول إلى الموقع الجغرافي في الخلفية إذا كانت إحدى الميزات في التطبيق تشارك الموقع الجغرافي باستمرار مع مستخدمين آخرين أو تستخدم واجهة برمجة التطبيقات Geofencing. تشمل العديد من الأمثلة ما يلي:
- تتيح ميزة في تطبيق مشاركة الموقع الجغرافي مع العائلة للمستخدمين باستمرار مشاركة الموقع الجغرافي مع أفراد العائلة.
- تتيح ميزة "إنترنت الأشياء" للمستخدمين ضبط أجهزتهم المنزلية بحيث يتم إيقافها عندما يغادر المستخدم منزله وإعادة تفعيلها عند عودة المستخدم إلى المنزل.
يعتبر النظام أنّ تطبيقك يستخدم الموقع الجغرافي في الخلفية إذا كان يحصل على الموقع الجغرافي الحالي للجهاز في أيّ حالة غير تلك الموضّحة في القسم الموقع الجغرافي في المقدّمة. تكون دقة الموقع الجغرافي في الخلفية مماثلة لدقة الموقع الجغرافي في المقدّمة، والتي تعتمد بدورها على أذونات الموقع الجغرافي التي يعلن عنها تطبيقك.
في نظام التشغيل Android 10 (مستوى واجهة برمجة التطبيقات 29) والإصدارات الأحدث، يجب تضمين إذن
ACCESS_BACKGROUND_LOCATION
في ملف بيان التطبيق من أجل طلب الوصول إلى بيانات الموقع الجغرافي في الخلفية في وقت التشغيل. في الإصدارات السابقة من
Android، عندما يحصل تطبيقك على إذن الوصول إلى الموقع الجغرافي في المقدّمة، يحصل تلقائيًا
على إذن الوصول إلى الموقع الجغرافي في الخلفية أيضًا.
<manifest ... > <!-- Required only when requesting background location access on Android 10 (API level 29) and higher. --> <uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" /> </manifest>
الدقة
يتوافق Android مع المستويات التالية لدقة الموقع الجغرافي:
- تقريبي
- توفير تقدير الموقع الجغرافي للجهاز إذا كان تقدير الموقع الجغرافي هذا استنادًا إلى
LocationManagerService
أوFusedLocationProvider
، يكون هذا التقدير دقيقًا في نطاق 3 كيلومتر مربّع تقريبًا (حوالي 1.2 ميل مربّع). يمكن لتطبيقك الحصول على المواقع الجغرافية بهذا المستوى من الدقة عند الإفصاح عن إذنACCESS_COARSE_LOCATION
وليس عن إذنACCESS_FINE_LOCATION
. - دقيق
- توفّر تقديرًا لموقع الجهاز الجغرافي يكون دقيقًا قدر الإمكان. إذا كان التقدير
للموقع الجغرافي من
LocationManagerService
أوFusedLocationProvider
، يكون هذا التقدير عادةً ضمن 50 مترًا تقريبًا (160 قدمًا) ويكون أحيانًا دقيقًا بقدر بضعة أمتار (10 أقدام) أو أكثر. يمكن لتطبيقك أن يتلقّى مواقع جغرافية بهذا المستوى من الدقة عند الإفصاح عن الحصول على إذنACCESS_FINE_LOCATION
.
إذا منح المستخدم إذن تحديد الموقع الجغرافي التقريبي، لن يتمكّن تطبيقك من الوصول إلى الموقع الجغرافي التقريبي إلا، بغض النظر عن أذونات الموقع الجغرافي التي يفصح عنها تطبيقك.
من المفترض أن يظل تطبيقك يعمل عندما يمنح المستخدم إذن الوصول إلى الموقع الجغرافي التقريبي فقط. إذا كانت إحدى الميزات في تطبيقك تتطلّب الوصول إلى الموقع الجغرافي الدقيق
باستخدام إذن ACCESS_FINE_LOCATION
، يمكنك أن تطلب من المستخدم السماح لتطبيقك
بالوصول إلى الموقع الجغرافي الدقيق.
طلب الوصول إلى الموقع الجغرافي في وقت التشغيل
عندما تحتاج إحدى الميزات في تطبيقك إلى الوصول إلى الموقع الجغرافي، انتظِر إلى أن يتفاعل المستخدم مع الميزة قبل تقديم طلب الإذن. يتّبع سير العمل هذا أفضل الممارسات لطلب أذونات التشغيل في السياق، كما هو موضّح في الدليل الذي يشرح كيفية طلب أذونات التطبيق.
يوضح الشكل 1 مثالاً على كيفية إجراء هذه العملية. يحتوي التطبيق على ميزة "مشاركة الموقع الجغرافي" التي تتطلّب الوصول إلى الموقع الجغرافي في المقدّمة. ومع ذلك، لا يطلب التطبيق إذن تحديد الموقع الجغرافي إلى أن ينقر المستخدم على زر مشاركة الموقع الجغرافي.
يمكن للمستخدم منح إذن الوصول إلى الموقع الجغرافي التقريبي فقط.
في الإصدار Android 12 (المستوى 31 من واجهة برمجة التطبيقات) أو الإصدارات الأحدث، يمكن للمستخدمين طلب أن يسترجع تطبيقك
معلومات الموقع الجغرافي التقريبية فقط، حتى إذا كان تطبيقك يطلب
ACCESS_FINE_LOCATION
إذن التشغيل.
للتعامل مع هذا السلوك المحتمَل للمستخدم، لا تطلب إذن ACCESS_FINE_LOCATION
بحد ذاته. بدلاً من ذلك، يمكنك طلب إذن ACCESS_FINE_LOCATION
وإذن
ACCESS_COARSE_LOCATION
في طلب بيئة تشغيل واحد. إذا حاولت طلب ACCESS_FINE_LOCATION
فقط، سيتجاهل النظام الطلب على بعض إصدارات Android 12. إذا كان تطبيقك يستهدف الإصدار 12 من نظام التشغيل Android أو إصدارًا أحدث، يسجِّل النظام رسالة الخطأ التالية في
Logcat:
ACCESS_FINE_LOCATION must be requested with ACCESS_COARSE_LOCATION.
عندما يطلب تطبيقك كلاً من ACCESS_FINE_LOCATION
وACCESS_COARSE_LOCATION
،
سيتضمّن مربّع حوار أذونات النظام الخيارات التالية للمستخدم:
- دقيق: يسمح للتطبيق بالحصول على معلومات عن الموقع الجغرافي الدقيق.
- تقريبي: يسمح للتطبيق بالحصول على معلومات الموقع التقريبي فقط.
يوضّح الشكل 3 أنّ مربّع الحوار يحتوي على إشارة مرئية لكلا الخيارين لمساعدة المستخدم على الاختيار. بعد أن يحدّد المستخدم دقة تحديد الموقع الجغرافي، ينقر على أحد الأزرار الثلاثة لاختيار مدة منح الإذن.
في نظام التشغيل Android 12 والإصدارات الأحدث، يمكن للمستخدمين الانتقال إلى إعدادات النظام لتحديد دقة الموقع الجغرافي المفضّلة لأي تطبيق، بغض النظر عن إصدار حزمة تطوير البرامج (SDK) المستهدَف لذلك التطبيق. وينطبق ذلك حتى إذا كان تطبيقك مثبّتًا على جهاز يعمل بنظام التشغيل Android 11 أو إصدار أقدم، وبعد ذلك يجري المستخدم ترقية الجهاز إلى Android 12 أو إصدار أحدث.
يؤثر اختيار المستخدم في منح الأذونات
يعرض الجدول التالي الأذونات التي يمنحها النظام لتطبيقك استنادًا إلى الخيارات التي يختارها المستخدم في مربّع حوار وقت تشغيل الأذونات:
دقيق | تقريبي | |
---|---|---|
أثناء استخدام التطبيق | ACCESS_FINE_LOCATION وACCESS_COARSE_LOCATION |
ACCESS_COARSE_LOCATION |
هذه المرّة فقط | ACCESS_FINE_LOCATION وACCESS_COARSE_LOCATION |
ACCESS_COARSE_LOCATION |
رفض | عدم منح أذونات تحديد الموقع الجغرافي | أذونات تحديد الموقع الجغرافي غير متوفّرة |
لتحديد الأذونات التي منحها النظام لتطبيقك، يمكنك التحقّق من القيمة المعروضة لطلب الأذونات. يمكنك استخدام مكتبات Jetpack في رمز برمجي مشابه لما يلي، أو يمكنك استخدام مكتبات المنصة التي يمكنك فيها إدارة رمز طلب الإذن بنفسك.
Kotlin
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))
Java
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 });
طلب ترقية إلى الموقع الجغرافي الدقيق
يمكنك أن تطلب من المستخدم ترقية إذن وصول تطبيقك من الموقع الجغرافي التقريبي إلى
الموقع الجغرافي الدقيق. قبل أن تطلب من المستخدم ترقية إذن وصول التطبيق إلى الموقع الجغرافي الدقيق، ضَع في اعتبارك ما إذا كانت حالة استخدام التطبيق تتطلّب هذا المستوى من الدقة بالتأكيد. إذا كان تطبيقك يحتاج إلى إقران جهاز مع
أجهزة مجاورة عبر البلوتوث أو Wi-Fi، ننصحك باستخدام إذن
إقران الجهاز المصاحب أو إذن
البلوتوث بدلاً من
طلب إذن ACCESS_FINE_LOCATION
.
لطلب ترقية إذن وصول تطبيقك إلى الموقع الجغرافي من "تقريبي" إلى "دقيق"، اتّبِع الخطوات التالية:
- إذا لزم الأمر، يُرجى توضيح سبب احتياج تطبيقك إلى الإذن.
- اطلب الإذنَين
ACCESS_FINE_LOCATION
وACCESS_COARSE_LOCATION
معًا مرة أخرى. بما أنّ المستخدم سبق أن سمح للنظام بمنح الموقع الجغرافي التقريبي لتطبيقك، سيكون مربّع حوار النظام مختلفًا هذه المرة، كما هو موضح في الشكل 4 والشكل 5:
طلب الموقع الجغرافي في المقدّمة فقط في البداية
حتى إذا كانت عدة ميزات في تطبيقك تتطلّب الوصول إلى الموقع الجغرافي، من المرجّح أن يحتاج بعضها فقط إلى الوصول إلى الموقع الجغرافي في الخلفية. لذا، ننصح بأن ينفّذ تطبيقك طلبات متزايدة للحصول على أذونات تحديد الموقع الجغرافي، ويطلب الوصول إلى الموقع الجغرافي في المقدّمة، ثم الوصول إلى الموقع الجغرافي في الخلفية. ومن خلال تنفيذ طلبات متزايدة، ستمنح المستخدمين مزيدًا من التحكّم والشفافية لأنّهم يستطيعون التعرّف بشكل أفضل على الميزات في تطبيقك التي تحتاج إلى الوصول إلى بيانات الموقع الجغرافي في الخلفية.
يعرض الشكل 6 مثالاً على تطبيق مصمّم للتعامل مع الطلبات المتزايدة. تتطلب كل من ميزتَي "عرض الموقع الجغرافي الحالي" و"اقتراح الأماكن المجاورة" الوصول إلى الموقع الجغرافي في المقدّمة. ومع ذلك، فإن ميزة "اقتراح الأماكن المجاورة" فقط تتطلب الوصول إلى الموقع الجغرافي في الخلفية.
في ما يلي عملية تنفيذ الطلبات المتزايدة:
-
في البداية، يجب أن يوجّه تطبيقك المستخدمين إلى الميزات التي تتطلّب الوصول إلى بيانات الموقع الجغرافي في المقدّمة، مثل ميزة "مشاركة الموقع الجغرافي" في الشكل 1 أو ميزة "عرض الموقع الجغرافي الحالي" في الشكل 2.
ننصحك بإيقاف وصول المستخدم إلى الميزات التي تتطلب الوصول إلى الموقع الجغرافي في الخلفية إلى أن يتم منح تطبيقك إذن الوصول إلى الموقع الجغرافي في المقدّمة.
-
في وقت لاحق، عندما يستكشف المستخدم وظيفة تتطلب الوصول إلى الموقع الجغرافي في الخلفية، يمكنك طلب الوصول إلى الموقع الجغرافي في الخلفية.
طلب رصد الموقع الجغرافي في الخلفية إذا لزم الأمر
يعتمد محتوى مربّع حوار الأذونات على إصدار حزمة تطوير البرامج (SDK) المستهدَف
عندما تطلب إحدى الميزات في تطبيقك الوصول إلى الموقع الجغرافي في الخلفية على جهاز يعمل بنظام التشغيل Android 10 (مستوى واجهة برمجة التطبيقات 29)، يتضمّن مربّع حوار أذونات النظام خيارًا يُسمى السماح طوال الوقت. إذا اختار المستخدم هذا الخيار، ستتمكّن الميزة في تطبيقك من الوصول إلى الموقع الجغرافي في الخلفية.
في نظام التشغيل Android 11 (المستوى 30 من واجهة برمجة التطبيقات) والإصدارات الأحدث، لا يتضمّن مربّع حوار النظام الخيار السماح طوال الوقت. بدلاً من ذلك، على المستخدمين تفعيل ميزة "تحديد الموقع الجغرافي" في الخلفية من صفحة الإعدادات، كما هو موضّح في الشكل 7.
يمكنك مساعدة المستخدمين في الانتقال إلى صفحة الإعدادات هذه باتّباع أفضل الممارسات عند طلب إذن تحديد الموقع الجغرافي في الخلفية. تعتمد عملية منح الإذن على إصدار حزمة تطوير البرامج (SDK) المستهدَف لتطبيقك
يستهدف التطبيق الإصدار 11 من نظام التشغيل Android أو إصدارًا أحدث
إذا لم يتم منح تطبيقك إذن ACCESS_BACKGROUND_LOCATION
، وعرض
shouldShowRequestPermissionRationale()
true
، يمكنك عرض واجهة مستخدم تعليمية للمستخدمين تتضمّن ما يلي:
- يُرجى توضيح سبب احتياج ميزة التطبيق إلى الوصول إلى الموقع الجغرافي في الخلفية.
- التصنيف المرئي للمستخدم لخيار الإعدادات الذي يمنح الموقع الجغرافي في الخلفية
(على سبيل المثال، السماح طوال الوقت في الشكل 7) يمكنك الاتصال بالرقم
getBackgroundPermissionOptionLabel()
للحصول على هذا التصنيف. يتمّ تعريب القيمة المعروضة لهذه الطريقة لتتوافق مع اللغة المفضّلة للمستخدم على الجهاز. - خيار للمستخدمين لرفض الإذن إذا رفض المستخدمون الوصول إلى بيانات الموقع الجغرافي في الخلفية، يجب أن يتمكنوا من مواصلة استخدام التطبيق
يستهدف التطبيق الإصدار 10 من نظام التشغيل Android أو الإصدارات الأقدم.
عندما تطلب إحدى الميزات في تطبيقك الوصول إلى الموقع الجغرافي في الخلفية، سيظهر للمستخدمين مربع حوار من النظام. يتضمّن مربّع الحوار هذا خيارًا للانتقال إلى خيارات إذن تحديد الموقع الجغرافي في تطبيقك في صفحة الإعدادات.
طالما أنّ تطبيقك يتّبع أفضل الممارسات لطلب أذونات الموقع الجغرافي، لن تحتاج إلى إجراء أي تغييرات للسماح بهذا السلوك.
يمكن أن يؤثر المستخدم في دقة الموقع الجغرافي في الخلفية.
إذا طلب المستخدم الموقع الجغرافي التقريبي، تنطبق خيارات المستخدم في مربّع حوار أذونات تحديد الموقع الجغرافي أيضًا على الموقع الجغرافي في الخلفية. بعبارة أخرى، إذا منح المستخدم تطبيقك إذن ACCESS_BACKGROUND_LOCATION
ولكنه لم يمنح التطبيق سوى إذن الوصول إلى الموقع الجغرافي التقريبي في المقدّمة، لن يحصل
تطبيقك على إذن الوصول إلى الموقع الجغرافي التقريبي في الخلفية أيضًا.
تذكير بمنح إذن الوصول إلى الموقع الجغرافي في الخلفية
في الإصدار 10 من نظام Android والإصدارات الأحدث، عندما تصل ميزة في تطبيقك إلى الموقع الجغرافي للجهاز في الخلفية للمرة الأولى بعد أن يمنح المستخدم إذن الوصول إلى الموقع الجغرافي في الخلفية، يحدّد النظام موعدًا لإرسال إشعار إلى المستخدم. ويذكّر هذا الإشعار المستخدم بأنّه سمح لتطبيقك بالوصول إلى الموقع الجغرافي للجهاز طوال الوقت. يظهر مثال على الإشعار في الشكل 8.
التحقّق من متطلبات الموقع الجغرافي في متطلّبات حِزمة تطوير البرامج (SDK) لتطبيقك
تحقَّق مما إذا كان تطبيقك يستخدم أي حِزم تطوير برامج (SDK) تعتمد على أذونات تحديد الموقع الجغرافي،
ولا سيما إذن ACCESS_FINE_LOCATION
. يمكنك الرجوع إلى هذه المقالة على موقع Medium
حول التعرّف على سلوكيات العناصر التابعة لحِزم SDK.
مصادر إضافية
لمزيد من المعلومات حول أذونات تحديد الموقع الجغرافي في Android، يمكنك الاطّلاع على المراجع التالية:
الدروس التطبيقية حول الترميز
الفيديوهات
نماذج
- نموذج تطبيق لتوضيح استخدام أذونات تحديد الموقع الجغرافي