إنشاء الحدود الجغرافية ومراقبتها

تجمع ميزة "الحدّ الجغرافي" بين الوعي بالموقع الجغرافي الحالي للمستخدم والوعي بمدى قربه من المواقع الجغرافية التي قد تهمّه. لتمييز موقع جغرافي مثير للاهتمام، حدِّد خط العرض وخط الطول. لتعديل مدى القرب من الموقع الجغرافي، يمكنك إضافة نطاق جغرافي. تحدِّد خطوط الطول والعرض والنطاق الجغرافي حدودًا جغرافية، ما ينشئ منطقة دائرية أو سياجًا حول الموقع الجغرافي المعنيّ.

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

يوضّح لك هذا الدرس كيفية إضافة حدود جغرافية وإزالتها، ثم الاستماع إلى عمليات الانتقال إلى الحدود الجغرافية باستخدام BroadcastReceiver.

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

الإعداد لتتبُّع حدود المنطقة الجغرافية

الخطوة الأولى لطلب مراقبة حدود المنطقة الجغرافية هي طلب الأذونات اللازمة. لاستخدام ميزة وضع حدود جغرافية، يجب أن يطلب تطبيقك ما يلي:

  • ACCESS_FINE_LOCATION
  • ACCESS_BACKGROUND_LOCATION إذا كان تطبيقك يستهدف الإصدار 10 من نظام التشغيل Android (المستوى 29 لواجهة برمجة التطبيقات) أو إصدارًا أحدث

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

إذا كنت تريد استخدام BroadcastReceiver للاستماع إلى عمليات النقل في حدود الجغرافية، أضِف عنصرًا يحدِّد اسم الخدمة. يجب أن يكون هذا العنصر عنصرًا فرعيًا لعنصر <application>:

<application
   android:allowBackup="true">
   ...
   <receiver android:name=".GeofenceBroadcastReceiver"/>
<application/>

للوصول إلى واجهات برمجة تطبيقات الموقع الجغرافي، عليك إنشاء مثيل لملف العميل Geofencing. للتعرّف على كيفية ربط العميل:

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

إنشاء حدود جغرافية وإضافتها

يجب أن ينشئ تطبيقك حدودًا جغرافية ويضيفها باستخدام فئة "أداة الإنشاء" في Location API ل إنشاء عناصر الحدود الجغرافية، وفئة "السهولة" لإضافتها. بالإضافة إلى ذلك، لمعالجة النوايا المُرسَلة من "خدمات الموقع الجغرافي" عند حدوث عمليات انتقال في حدود الجغرافية، يمكنك تحديد 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 {
        val intent = Intent(this, GeofenceBroadcastReceiver::class.java)
        // We use FLAG_UPDATE_CURRENT so that we get the same pending intent back when calling
        // addGeofences() and removeGeofences().
        PendingIntent.getBroadcast(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT)
    }
}

Java

public class MainActivity extends AppCompatActivity {

    // ...

    private PendingIntent getGeofencePendingIntent() {
        // Reuse the PendingIntent if we already have it.
        if (geofencePendingIntent != null) {
            return geofencePendingIntent;
        }
        Intent intent = new Intent(this, GeofenceBroadcastReceiver.class);
        // We use FLAG_UPDATE_CURRENT so that we get the same pending intent back when
        // calling addGeofences() and removeGeofences().
        geofencePendingIntent = PendingIntent.getBroadcast(this, 0, intent, PendingIntent.
                FLAG_UPDATE_CURRENT);
        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 ويمكنه بعد ذلك الحصول على حدث الحدود الجغرافية من النية، وتحديد نوع عمليات النقل في الحدود الجغرافية، وتحديد الحدود الجغرافية المحدّدة التي تم تنشيطها. يمكن لمستلم البث توجيه أحد التطبيقات لبدء تنفيذ عمل في الخلفية أو إرسال إشعار كنتيجة، إذا كان ذلك مطلوبًا.

ملاحظة: في الإصدار 8.0 من نظام Android (المستوى 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 في هذه الحالة. بعد ذلك، تُرسِل الخدمة إشعارًا وتُسجِّل تفاصيل عملية النقل.

إيقاف مراقبة حدود المنطقة الجغرافية

يمكن أن يساعد إيقاف ميزة "مراقبة الجغرافية" عندما لا تكون مطلوبة أو مرغوبًا فيها في توفير طاقة البطارية وعدد دورات وحدة المعالجة المركزية (CPU) على الجهاز. يمكنك إيقاف ميزة "مراقبة حدود جغرافية" في النشاط الرئيسي المستخدَم لإضافة حدود جغرافية وإزالتها، ويؤدي إزالة حدود جغرافية إلى إيقافها على الفور. توفّر واجهة برمجة التطبيقات طرقًا ل إزالة حدود جغرافية إمّا من خلال أرقام تعريف الطلبات أو من خلال إزالة حدود جغرافية مرتبطة بأحد 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). بدلاً من ذلك، استخدِم لوحة الإعدادات.

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

مصادر إضافية

لمزيد من المعلومات عن وضع حدود جغرافية، اطّلِع على المواد التالية:

نماذج

نموذج تطبيق لإنشاء حدود جغرافية ومراقبتها