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

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

يمكن أن يكون لديك عدة حدود جغرافية نشطة، بحد أقصى 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);
}

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

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

ملاحظة: في 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 دقائق).

مصادر إضافية

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

العيّنات

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