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

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

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

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

ضبط إعدادات ميزة "مراقبة الحدود الجغرافية"

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

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

إذا كنت تريد استخدام 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 {
        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 ويمكنه بعد ذلك الحصول على حدث وضع حدود جغرافية من الغرض وتحديد نوع عمليات انتقال الحدود الجغرافية وتحديد الحدود الجغرافية المحدّدة التي تم تشغيلها. ويمكن لمستقِل البث توجيه التطبيق لبدء العمل في الخلفية أو إرسال إشعار كمخرج إذا كنت تريد ذلك.

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

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

يمكن أن يساعد إيقاف ميزة مراقبة الحدود الجغرافية عندما لا تكون هناك حاجة إليها أو عدم الحاجة إليها في توفير طاقة البطارية ودورات وحدة المعالجة المركزية (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). استخدِم لوحة الإعدادات بدلاً من ذلك.

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

مراجع إضافية

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

العيّنات

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