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

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

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

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

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

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

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

  • 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 دقائق).

مصادر إضافية

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

نماذج

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