تجمع ميزة "الحدود الجغرافية" بين معرفة الموقع الجغرافي الحالي للمستخدم ومعرفة مدى قربه من المواقع الجغرافية التي قد تهمّه. لوضع علامة على موقع اهتمام، عليك تحديد خط العرض وخط الطول الخاصَّين به. لتعديل مدى القرب من الموقع الجغرافي، يمكنك إضافة نطاق جغرافي. تحدّد خطوط العرض والطول ونصف القطر حدودًا جغرافية، ما يؤدي إلى إنشاء منطقة دائرية أو سياج حول موقع الاهتمام.
يمكنك استخدام عدة حدود جغرافية نشطة، بحدّ أقصى 100 لكل تطبيق، لكل مستخدم جهاز. لكل حد جغرافي، يمكنك أن تطلب من "خدمات الموقع الجغرافي" إرسال أحداث الدخول والخروج، أو يمكنك تحديد مدة الانتظار داخل منطقة الحدود الجغرافية، أو البقاء، قبل بدء حدث. يمكنك تحديد مدة أي حدود جغرافية من خلال تحديد مدة انتهاء الصلاحية بالمللي ثانية. بعد انتهاء صلاحية الحدود الجغرافية، تزيلها "الخدمات المستندة إلى الموقع الجغرافي" تلقائيًا.
يوضّح لك هذا الدرس كيفية إضافة الحدود الجغرافية وإزالتها، ثم الاستماع إلى عمليات الانتقال بين الحدود الجغرافية
باستخدام BroadcastReceiver.
ملاحظة: على أجهزة Wear OS، لا تستخدم واجهات برمجة التطبيقات Geofencing الطاقة بكفاءة. لا ننصح باستخدام واجهات برمجة التطبيقات هذه على Wear. لمزيد من المعلومات، يُرجى الاطّلاع على مقالة توفير الطاقة والبطارية.
الإعداد لمراقبة الحدود الجغرافية
الخطوة الأولى لطلب تتبُّع الحدود الجغرافية هي طلب الأذونات اللازمة. لاستخدام ميزة "الحدود الجغرافية"، يجب أن يطلب تطبيقك ما يلي:
-
ACCESS_FINE_LOCATION -
ACCESS_BACKGROUND_LOCATIONإذا كان تطبيقك يستهدف الإصدار 10 من نظام التشغيل Android (المستوى 29 من واجهة برمجة التطبيقات) أو الإصدارات الأحدث
لمزيد من المعلومات، يُرجى الاطّلاع على الدليل حول كيفية طلب أذونات تحديد الموقع الجغرافي.
إذا أردت استخدام BroadcastReceiver للاستماع إلى عمليات انتقال الحدود الجغرافية،
أضِف عنصرًا يحدّد اسم الخدمة. يجب أن يكون هذا العنصر
عنصرًا ثانويًا لعنصر
<application>:
<application android:allowBackup="true"> ... <receiver android:name=".GeofenceBroadcastReceiver"/> <application/>
للوصول إلى واجهات برمجة التطبيقات للموقع الجغرافي، عليك إنشاء مثيل لعميل "الحدود الجغرافية". لمعرفة كيفية ربط عميلك، يُرجى اتّباع الخطوات التالية:
Kotlin
lateinit var geofencingClient: GeofencingClient override fun onCreate(savedInstanceState: Bundle?) { // ... geofencingClient = LocationServices.getGeofencingClient(this) }
Java
private GeofencingClient geofencingClient; @Override public void onCreate(Bundle savedInstanceState) { // ... geofencingClient = LocationServices.getGeofencingClient(this); }
إنشاء حدود جغرافية وإضافتها
يحتاج تطبيقك إلى إنشاء حدود جغرافية وإضافتها باستخدام فئة أداة الإنشاء في واجهة برمجة التطبيقات للموقع الجغرافي لإنشاء عناصر الحدود الجغرافية، وفئة الراحة لإضافتها. وللتعامل مع الأهداف المُرسَلة من "الخدمات المستندة إلى الموقع الجغرافي" عند حدوث عمليات انتقال ضمن الحدود الجغرافية، يمكنك تحديد PendingIntent كما هو موضّح في هذا القسم.
ملاحظة: على الأجهزة التي يستخدمها مستخدم واحد، يكون الحد الأقصى هو 100 حدود جغرافية لكل تطبيق. أما على الأجهزة التي يستخدمها عدة مستخدمين، فيكون الحد الأقصى هو 100 حدود جغرافية لكل تطبيق لكل مستخدم للجهاز.
إنشاء عناصر الحدود الجغرافية
أولاً، استخدِم
Geofence.Builder لإنشاء حدود جغرافية، مع ضبط نصف القطر والمدة وأنواع الانتقال المطلوبة للحدود الجغرافية. على سبيل المثال، لتعبئة كائن قائمة:
Kotlin
geofenceList.add(Geofence.Builder() // Set the request ID of the geofence. This is a string to identify this // geofence. .setRequestId(entry.key) // Set the circular region of this geofence. .setCircularRegion( entry.value.latitude, entry.value.longitude, Constants.GEOFENCE_RADIUS_IN_METERS ) // Set the expiration duration of the geofence. This geofence gets automatically // removed after this period of time. .setExpirationDuration(Constants.GEOFENCE_EXPIRATION_IN_MILLISECONDS) // Set the transition types of interest. Alerts are only generated for these // transition. We track entry and exit transitions in this sample. .setTransitionTypes(Geofence.GEOFENCE_TRANSITION_ENTER or Geofence.GEOFENCE_TRANSITION_EXIT) // Create the geofence. .build())
Java
geofenceList.add(new Geofence.Builder() // Set the request ID of the geofence. This is a string to identify this // geofence. .setRequestId(entry.getKey()) .setCircularRegion( entry.getValue().latitude, entry.getValue().longitude, Constants.GEOFENCE_RADIUS_IN_METERS ) .setExpirationDuration(Constants.GEOFENCE_EXPIRATION_IN_MILLISECONDS) .setTransitionTypes(Geofence.GEOFENCE_TRANSITION_ENTER | Geofence.GEOFENCE_TRANSITION_EXIT) .build());
يستخرج هذا المثال البيانات من ملف ثوابت. في الواقع، قد تنشئ التطبيقات حدودًا جغرافية بشكل ديناميكي استنادًا إلى الموقع الجغرافي للمستخدم.
تحديد الحدود الجغرافية والمشغِّلات الأولية
يستخدم المقتطف التالي الفئة
GeofencingRequest والفئة
GeofencingRequestBuilder المضمّنة فيها لتحديد الحدود الجغرافية المطلوب مراقبتها وضبط كيفية بدء أحداث الحدود الجغرافية ذات الصلة:
Kotlin
private fun getGeofencingRequest(): GeofencingRequest { return GeofencingRequest.Builder().apply { setInitialTrigger(GeofencingRequest.INITIAL_TRIGGER_ENTER) addGeofences(geofenceList) }.build() }
Java
private GeofencingRequest getGeofencingRequest() { GeofencingRequest.Builder builder = new GeofencingRequest.Builder(); builder.setInitialTrigger(GeofencingRequest.INITIAL_TRIGGER_ENTER); builder.addGeofences(geofenceList); return builder.build(); }
يوضّح هذا المثال استخدام اثنين من عوامل تشغيل الحدود الجغرافية. يتم تفعيل الانتقال
GEOFENCE_TRANSITION_ENTER عندما يدخل جهاز إلى حدود جغرافية، ويتم تفعيل الانتقال
GEOFENCE_TRANSITION_EXIT عندما يخرج جهاز من حدود جغرافية. يؤدي تحديد
INITIAL_TRIGGER_ENTER إلى إعلام "الخدمات المستندة إلى الموقع الجغرافي" بأنّه يجب تفعيل
GEOFENCE_TRANSITION_ENTER
إذا كان الجهاز داخل الحدود الجغرافية.
في كثير من الحالات، قد يكون من الأفضل استخدام
INITIAL_TRIGGER_DWELL بدلاً من ذلك،
والذي يؤدي إلى تشغيل الأحداث فقط عندما يتوقف المستخدم لمدة محددة داخل حدود جغرافية.
يمكن أن يساعد هذا الأسلوب في تقليل "التنبيهات غير المرغوب فيها" الناتجة عن أعداد كبيرة من الإشعارات عندما يدخل الجهاز الحدود الجغرافية ويخرج منها لفترة وجيزة. هناك استراتيجية أخرى للحصول على أفضل النتائج من
الحدود الجغرافية، وهي ضبط الحد الأدنى لنصف القطر على 100 متر. يساعد ذلك في مراعاة دقة الموقع الجغرافي لشبكات Wi-Fi العادية، كما يساعد في تقليل استهلاك طاقة الجهاز.
تحديد مستقبِل بث لعمليات الانتقال في الحدود الجغرافية
يمكن أن يؤدي Intent المُرسَل من "خدمات الموقع الجغرافي" إلى تنفيذ إجراءات مختلفة في
تطبيقك، ولكن يجب ألا يبدأ نشاطًا أو جزءًا، لأنّ المكوّنات
يجب أن تظهر فقط استجابةً لإجراء من المستخدم. في كثير من الحالات، يُعدّ BroadcastReceiver طريقة جيدة للتعامل مع الانتقال عبر الحدود الجغرافية. يتلقّى BroadcastReceiver تحديثات عند وقوع حدث، مثل الانتقال إلى داخل حدود جغرافية أو خارجها، ويمكنه بدء عمل في الخلفية يستغرق وقتًا طويلاً.
يوضّح المقتطف التالي كيفية تحديد PendingIntent يبدأ BroadcastReceiver:
Kotlin
class MainActivity : AppCompatActivity() { // ... private val geofencePendingIntent: PendingIntent by lazy { // We use FLAG_UPDATE_CURRENT so that we get the same pending intent back when calling // addGeofences() and removeGeofences(). val flags = PendingIntent.FLAG_UPDATE_CURRENT if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.S) { // Starting on Android S+ the pending intent has to be mutable. flags or PendingIntent.FLAG_MUTABLE } val intent = Intent(this, GeofenceBroadcastReceiver::class.java) PendingIntent.getBroadcast(this, 0, intent, flags) } }
Java
public class MainActivity extends AppCompatActivity { // ... private PendingIntent getGeofencePendingIntent() { // Reuse the PendingIntent if we already have it. if (geofencePendingIntent != null) { return geofencePendingIntent; } // We use FLAG_UPDATE_CURRENT so that we get the same pending intent back when calling // addGeofences() and removeGeofences(). int flags = PendingIntent.FLAG_UPDATE_CURRENT; if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.S) { // Starting on Android S+ the pending intent has to be mutable. flags |= PendingIntent.FLAG_MUTABLE; } Intent intent = new Intent(this, GeofenceBroadcastReceiver.class); geofencePendingIntent = PendingIntent.getBroadcast(this, 0, intent, flags); return geofencePendingIntent; } }
إضافة حدود جغرافية
لإضافة حدود جغرافية، استخدِم طريقة
.
قدِّم العنصر GeofencingClient.addGeofences()
GeofencingRequest وPendingIntent.
يوضّح المقتطف التالي كيفية معالجة النتائج:
Kotlin
geofencingClient?.addGeofences(getGeofencingRequest(), geofencePendingIntent)?.run { addOnSuccessListener { // Geofences added // ... } addOnFailureListener { // Failed to add geofences // ... } }
Java
geofencingClient.addGeofences(getGeofencingRequest(), getGeofencePendingIntent()) .addOnSuccessListener(this, new OnSuccessListener<Void>() { @Override public void onSuccess(Void aVoid) { // Geofences added // ... } }) .addOnFailureListener(this, new OnFailureListener() { @Override public void onFailure(@NonNull Exception e) { // Failed to add geofences // ... } });
التعامل مع عمليات الانتقال في الحدود الجغرافية
عندما ترصد "الخدمات المستندة إلى الموقع الجغرافي" دخول المستخدم إلى حدود جغرافية أو خروجه منها، ترسل Intent المضمّنة في PendingIntent التي أدرجتها في طلب إضافة الحدود الجغرافية. يلاحظ جهاز استقبال البث مثل GeofenceBroadcastReceiver أنّه تم استدعاء Intent ويمكنه بعد ذلك الحصول على حدث الحدود الجغرافية من الغرض، وتحديد أنواع عمليات الانتقال في الحدود الجغرافية، وتحديد الحدود الجغرافية التي تم تفعيلها. يمكن لمستقبل البث توجيه التطبيق لبدء تنفيذ العمل في الخلفية أو إرسال إشعار كمخرجات إذا رغبت في ذلك.
ملاحظة: في نظام التشغيل Android 8.0 (مستوى واجهة برمجة التطبيقات 26) والإصدارات الأحدث، إذا كان التطبيق قيد التشغيل في الخلفية أثناء مراقبة حدود جغرافية، يستجيب الجهاز لأحداث الحدود الجغرافية كل بضع دقائق. للتعرّف على كيفية تكييف تطبيقك مع حدود الاستجابة هذه، يُرجى الاطّلاع على حدود رصد الموقع الجغرافي في الخلفية.
يوضّح المقتطف التالي كيفية تحديد
BroadcastReceiver
ينشر إشعارًا عند حدوث انتقال عبر الحدود الجغرافية. عندما ينقر المستخدم على الإشعار، يظهر النشاط الرئيسي للتطبيق:
Kotlin
class GeofenceBroadcastReceiver : BroadcastReceiver() { // ... override fun onReceive(context: Context?, intent: Intent?) { val geofencingEvent = GeofencingEvent.fromIntent(intent) if (geofencingEvent.hasError()) { val errorMessage = GeofenceStatusCodes .getStatusCodeString(geofencingEvent.errorCode) Log.e(TAG, errorMessage) return } // Get the transition type. val geofenceTransition = geofencingEvent.geofenceTransition // Test that the reported transition was of interest. if (geofenceTransition == Geofence.GEOFENCE_TRANSITION_ENTER || geofenceTransition == Geofence.GEOFENCE_TRANSITION_EXIT) { // Get the geofences that were triggered. A single event can trigger // multiple geofences. val triggeringGeofences = geofencingEvent.triggeringGeofences // Get the transition details as a String. val geofenceTransitionDetails = getGeofenceTransitionDetails( this, geofenceTransition, triggeringGeofences ) // Send notification and log the transition details. sendNotification(geofenceTransitionDetails) Log.i(TAG, geofenceTransitionDetails) } else { // Log the error. Log.e(TAG, getString(R.string.geofence_transition_invalid_type, geofenceTransition)) } } }
Java
public class GeofenceBroadcastReceiver extends BroadcastReceiver { // ... protected void onReceive(Context context, Intent intent) { GeofencingEvent geofencingEvent = GeofencingEvent.fromIntent(intent); if (geofencingEvent.hasError()) { String errorMessage = GeofenceStatusCodes .getStatusCodeString(geofencingEvent.getErrorCode()); Log.e(TAG, errorMessage); return; } // Get the transition type. int geofenceTransition = geofencingEvent.getGeofenceTransition(); // Test that the reported transition was of interest. if (geofenceTransition == Geofence.GEOFENCE_TRANSITION_ENTER || geofenceTransition == Geofence.GEOFENCE_TRANSITION_EXIT) { // Get the geofences that were triggered. A single event can trigger // multiple geofences. List<Geofence> triggeringGeofences = geofencingEvent.getTriggeringGeofences(); // Get the transition details as a String. String geofenceTransitionDetails = getGeofenceTransitionDetails( this, geofenceTransition, triggeringGeofences ); // Send notification and log the transition details. sendNotification(geofenceTransitionDetails); Log.i(TAG, geofenceTransitionDetails); } else { // Log the error. Log.e(TAG, getString(R.string.geofence_transition_invalid_type, geofenceTransition)); } } }
بعد رصد حدث الانتقال من خلال PendingIntent،
يحصل BroadcastReceiver على نوع الانتقال في الحدود الجغرافية
ويختبر ما إذا كان أحد الأحداث التي يستخدمها التطبيق لتشغيل
الإشعارات، إما
GEOFENCE_TRANSITION_ENTER
أو GEOFENCE_TRANSITION_EXIT
في هذه الحالة. بعد ذلك، ترسل الخدمة إشعارًا وتسجّل تفاصيل عملية النقل.
إيقاف مراقبة الحدود الجغرافية
يمكن أن يساعد إيقاف مراقبة الحدود الجغرافية عند عدم الحاجة إليها أو عدم الرغبة فيها في توفير طاقة البطارية ودورات وحدة المعالجة المركزية على الجهاز. يمكنك إيقاف تتبُّع الحدود الجغرافية
في النشاط الرئيسي المستخدَم لإضافة الحدود الجغرافية وإزالتها، وتؤدي إزالة الحدود الجغرافية إلى إيقافها
على الفور. توفّر واجهة برمجة التطبيقات طرقًا لإزالة الحدود الجغرافية إما من خلال أرقام تعريف الطلبات أو من خلال إزالة الحدود الجغرافية المرتبطة بـ PendingIntent معيّن.
يزيل المقتطف التالي الحدود الجغرافية من خلال PendingIntent، ما يؤدي إلى إيقاف جميع
الإشعارات الإضافية عندما يدخل الجهاز الحدود الجغرافية التي تمت إضافتها سابقًا أو يخرج منها:
Kotlin
geofencingClient?.removeGeofences(geofencePendingIntent)?.run { addOnSuccessListener { // Geofences removed // ... } addOnFailureListener { // Failed to remove geofences // ... } }
Java
geofencingClient.removeGeofences(getGeofencePendingIntent()) .addOnSuccessListener(this, new OnSuccessListener<Void>() { @Override public void onSuccess(Void aVoid) { // Geofences removed // ... } }) .addOnFailureListener(this, new OnFailureListener() { @Override public void onFailure(@NonNull Exception e) { // Failed to remove geofences // ... } });
يمكنك دمج ميزة "الحدود الجغرافية" مع ميزات أخرى تستند إلى الموقع الجغرافي، مثل الإشعارات الدورية بشأن الموقع الجغرافي. لمزيد من المعلومات، يُرجى الاطّلاع على الدروس الأخرى في هذا الصف.
اتّباع أفضل الممارسات المتعلّقة بالحدود الجغرافية
يقدّم هذا القسم اقتراحات لاستخدام الحدود الجغرافية مع واجهات برمجة التطبيقات للموقع الجغرافي في Android.
تقليل استهلاك الطاقة
يمكنك استخدام الأساليب التالية لتحسين استهلاك الطاقة في تطبيقاتك التي تستخدم ميزة "الحدود الجغرافية":
اضبط سرعة الاستجابة للإشعارات على قيمة أعلى. يؤدي ذلك إلى تحسين استهلاك الطاقة من خلال زيادة وقت استجابة تنبيهات الحدود الجغرافية. على سبيل المثال، إذا ضبطت قيمة الاستجابة على خمس دقائق، لن يتحقّق تطبيقك من تنبيه الدخول أو الخروج إلا مرة واحدة كل خمس دقائق. لا يعني ضبط قيم أقل بالضرورة أنّه سيتم إشعار المستخدمين خلال تلك الفترة الزمنية (على سبيل المثال، إذا ضبطت قيمة 5 ثوانٍ، قد يستغرق تلقّي التنبيه وقتًا أطول قليلاً من ذلك).
استخدِم نطاقًا جغرافيًا أكبر للحدود الجغرافية التي يقضي فيها المستخدم وقتًا طويلاً، مثل المنزل أو العمل. مع أنّ زيادة نصف القطر لا تقلّل من استهلاك الطاقة بشكل مباشر، إلا أنّها تقلّل من معدّل تكرار تحقّق التطبيق من الدخول أو الخروج، ما يؤدي إلى خفض استهلاك الطاقة بشكل عام.
اختيار النطاق الجغرافي الأمثل للحدود الجغرافية
للحصول على أفضل النتائج، يجب ضبط الحد الأدنى لنصف قطر الحدود الجغرافية بين 100 و150 مترًا. عند توفّر شبكة Wi-Fi، تتراوح دقة الموقع الجغرافي عادةً بين 20 و50 مترًا. وعندما يكون الموقع الجغرافي الداخلي متاحًا، يمكن أن يصل نطاق الدقة إلى 5 أمتار. ما لم تكن تعرف أنّ الموقع الجغرافي الداخلي متاح داخل الحدود الجغرافية، افترض أنّ دقة الموقع الجغرافي لشبكة Wi-Fi تبلغ حوالي 50 مترًا.
وعندما لا يتوفّر الموقع الجغرافي لشبكة Wi-Fi (على سبيل المثال، أثناء القيادة في مناطق ريفية)، تنخفض دقة الموقع الجغرافي. ويمكن أن يتراوح نطاق الدقة بين مئات الأمتار وبضعة كيلومترات. في مثل هذه الحالات، عليك إنشاء حدود جغرافية باستخدام نصف قطر أكبر.
توضيح سبب استخدام تطبيقك للحدود الجغرافية للمستخدمين
بما أنّ تطبيقك يصل إلى الموقع الجغرافي في الخلفية عند استخدام ميزة "الحدود الجغرافية"، يجب مراعاة كيفية تقديم تطبيقك للمزايا للمستخدمين. يجب أن توضّح لهم سبب حاجة تطبيقك إلى هذا الإذن لتعزيز فهم المستخدمين وشفافية التطبيق.
لمزيد من المعلومات حول أفضل الممارسات المتعلّقة بالوصول إلى الموقع الجغرافي، بما في ذلك الحدود الجغرافية، يُرجى الاطّلاع على صفحة أفضل ممارسات الخصوصية.
استخدام نوع الانتقال "البقاء" للحدّ من التنبيهات غير المرغوب فيها
إذا تلقّيت عددًا كبيرًا من التنبيهات عند القيادة لفترة وجيزة بالقرب من حدود جغرافية، فإنّ أفضل طريقة لتقليل التنبيهات هي استخدام نوع الانتقال
GEOFENCE_TRANSITION_DWELL بدلاً من
GEOFENCE_TRANSITION_ENTER. بهذه الطريقة، يتم إرسال تنبيه التوقّف فقط عندما يتوقف المستخدم
داخل حدود جغرافية لفترة زمنية معيّنة. يمكنك اختيار المدة من خلال ضبط
مهلة التسكّع.
إعادة تسجيل الحدود الجغرافية عند الضرورة فقط
يتم الاحتفاظ بالحدود الجغرافية المسجَّلة في عملية com.google.process.location التي تملكها حزمة com.google.android.gms.
لا يحتاج التطبيق إلى اتّخاذ أي إجراء للتعامل مع الأحداث التالية، لأنّ النظام
يستعيد الحدود الجغرافية بعد هذه الأحداث:
- تمت ترقية "خدمات Google Play".
- يتم إيقاف "خدمات Google Play" وإعادة تشغيلها من قِبل النظام بسبب قيود الموارد.
- تعطُّل عملية تحديد الموقع الجغرافي
يجب أن يعيد التطبيق تسجيل الحدود الجغرافية إذا كانت لا تزال مطلوبة بعد الأحداث التالية، لأنّ النظام لا يمكنه استرداد الحدود الجغرافية في الحالات التالية:
- تمت إعادة تشغيل الجهاز. يجب أن يستمع التطبيق إلى إجراء اكتمال تشغيل الجهاز، ثم إعادة تسجيل الحدود الجغرافية المطلوبة.
- يتم إلغاء تثبيت التطبيق وإعادة تثبيته.
- يتم محو بيانات التطبيق.
- تم محو بيانات "خدمات Google Play".
- تلقّى التطبيق تنبيهًا بشأن
GEOFENCE_NOT_AVAILABLE. ويحدث ذلك عادةً بعد إيقاف ميزة "موفِّر الموقع الجغرافي للشبكة" (NLP) في Android.
تحديد المشاكل وحلّها في حدث الدخول إلى الحدود الجغرافية
إذا لم يتم تفعيل الحدود الجغرافية عند دخول الجهاز إلى حدود جغرافية
(لم يتم تفعيل تنبيه
GEOFENCE_TRANSITION_ENTER)، تأكَّد أولاً من تسجيل حدودك الجغرافية
بشكل صحيح كما هو موضّح في هذا الدليل.
في ما يلي بعض الأسباب المحتملة لعدم عمل التنبيهات على النحو المتوقّع:
- لا يتوفّر الموقع الجغرافي الدقيق داخل حدودك الجغرافية أو أنّ حدودك الجغرافية صغيرة جدًا. في معظم الأجهزة، تستخدم خدمة الحدود الجغرافية الموقع الجغرافي للشبكة فقط لتفعيل الحدود الجغرافية. تستخدم الخدمة هذا النهج لأنّ الموقع الجغرافي للشبكة يستهلك طاقة أقل بكثير، ويستغرق وقتًا أقل للحصول على مواقع جغرافية منفصلة، والأهم من ذلك أنّه متاح في الأماكن المغلقة.
تم إيقاف Wi-Fi على الجهاز. يمكن أن يؤدي تفعيل Wi-Fi إلى تحسين دقة الموقع الجغرافي بشكل كبير، لذا إذا تم إيقاف Wi-Fi، قد لا يتلقّى تطبيقك تنبيهات الحدود الجغرافية أبدًا بناءً على عدة إعدادات، بما في ذلك نصف قطر الحدود الجغرافية أو طراز الجهاز أو إصدار Android. اعتبارًا من الإصدار Android 4.3 (مستوى واجهة برمجة التطبيقات 18)، أضفنا ميزة "وضع البحث عن شبكات Wi-Fi فقط" التي تتيح للمستخدمين إيقاف Wi-Fi مع الاستمرار في الحصول على موقع جغرافي جيد للشبكة. من الممارسات الجيدة أن تطلب من المستخدم تفعيل Wi-Fi أو وضع البحث عن شبكات Wi-Fi فقط إذا كان كلاهما غير مفعّل، وأن توفّر له اختصارًا لذلك. استخدِم SettingsClient للتأكّد من ضبط إعدادات نظام الجهاز بشكل صحيح من أجل رصد الموقع الجغرافي على النحو الأمثل.
ملاحظة: إذا كان تطبيقك يستهدف الإصدار Android 10 (مستوى واجهة برمجة التطبيقات 29) أو إصدارًا أحدث، لا يمكنك استدعاء
WifiManager.setEnabled()مباشرةً ما لم يكن تطبيقك تطبيق نظام أو وحدة التحكّم بسياسة الجهاز (DPC). بدلاً من ذلك، استخدِم لوحة الإعدادات.- لا يتوفّر اتصال موثوق بالشبكة داخل الحدود الجغرافية. في حال عدم توفّر اتصال موثوق بالبيانات، قد لا يتم إنشاء التنبيهات. ويرجع ذلك إلى أنّ خدمة الحدود الجغرافية تعتمد على مقدّم خدمة الموقع الجغرافي للشبكة الذي يتطلّب بدوره اتصالاً بالبيانات.
- قد تتأخر التنبيهات. لا تطلب خدمة الحدود الجغرافية الموقع الجغرافي بشكل مستمر، لذا يُرجى توقُّع بعض التأخير عند تلقّي التنبيهات. عادةً ما يكون وقت الاستجابة أقل من دقيقتين، وأقل من ذلك عندما يكون الجهاز متحركًا. في حال تفعيل الحدود القصوى لرصد الموقع الجغرافي في الخلفية، يبلغ وقت الاستجابة دقيقتَين إلى 3 دقائق في المتوسط. إذا كان الجهاز ثابتًا لفترة طويلة، قد تزيد فترة الاستجابة (ما يصل إلى 6 دقائق).
مراجع إضافية
لمزيد من المعلومات حول ميزة "الحدود الجغرافية"، يُرجى الاطّلاع على المواد التالية:
نماذج
نموذج تطبيق لإنشاء الحدود الجغرافية ومراقبتها