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

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

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

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

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

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

تحديد مستقبِل بث لعمليات الانتقال بين المناطق الجغرافية

يمكن أن يؤدي Intent مُرسَل من &quot;خدمات الموقع الجغرافي&quot; إلى تشغيل إجراءات مختلفة في تطبيقك، ولكن يجب عدم السماح له ببدء نشاط أو جزء، لأنّه يجب ألا تصبح المكوّنات مرئية إلا استجابةً لإجراء يتخذه المستخدم. في كثير من الحالات، يكون 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
                // ...
            }
        });

التعامل مع عمليات الانتقال بين المناطق الجغرافية

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

إيقاف مراقبة السياج الجغرافي

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

تحديد المشاكل المتعلّقة بحدث الدخول إلى الحدود الجغرافية وحلّها

إذا لم يتم تشغيل السياجات الجغرافية عند دخول الجهاز إلى سياج جغرافي (لم يتم تشغيل التنبيه GEOFENCE_TRANSITION_ENTER)، تأكَّد أولاً من تسجيل السياجات الجغرافية بشكل صحيح كما هو موضّح في هذا الدليل.

في ما يلي بعض الأسباب المحتملة لعدم عمل التنبيهات على النحو المتوقّع:

  • الموقع الجغرافي الدقيق غير متوفّر داخل السياج الجغرافي أو أنّ السياج الجغرافي صغير جدًا. في معظم الأجهزة، تستخدم خدمة السياج الجغرافي الموقع الجغرافي للشبكة فقط لتفعيل السياج الجغرافي. تستخدم الخدمة هذا الأسلوب لأنّ الموقع الجغرافي المستند إلى الشبكة يستهلك طاقة أقل بكثير، ويستغرق وقتًا أقل للحصول على مواقع جغرافية منفصلة، والأهم من ذلك أنّه متاح في الأماكن المغلقة.
  • تم إيقاف شبكة Wi-Fi على الجهاز. يمكن أن يؤدي تفعيل شبكة Wi-Fi إلى تحسين دقة الموقع الجغرافي بشكل كبير، لذا إذا كانت شبكة Wi-Fi غير مفعّلة، قد لا يتلقّى تطبيقك تنبيهات بشأن السياج الجغرافي، وذلك حسب العديد من الإعدادات، بما في ذلك نصف قطر السياج الجغرافي أو طراز الجهاز أو إصدار Android. بدءًا من الإصدار 4.3 من نظام التشغيل Android (المستوى 18 من واجهة برمجة التطبيقات)، أضفنا إمكانية "وضع البحث عن شبكة Wi-Fi فقط" الذي يتيح للمستخدمين إيقاف شبكة Wi-Fi مع الاستمرار في الحصول على موقع جغرافي جيد للشبكة. من الممارسات الجيدة أن تطلب من المستخدم توفير اختصار له لتفعيل شبكة Wi-Fi أو وضع البحث عن شبكات Wi-Fi فقط إذا كان كلاهما غير مفعّل. استخدِم SettingsClient للتأكّد من ضبط إعدادات نظام الجهاز بشكل سليم من أجل رصد الموقع الجغرافي على النحو الأمثل.

    ملاحظة: إذا كان تطبيقك يستهدف الإصدار 10 من نظام التشغيل Android (المستوى 29 من واجهة برمجة التطبيقات) أو إصدارًا أحدث، لا يمكنك استدعاء WifiManager.setEnabled() مباشرةً إلا إذا كان تطبيقك تطبيقًا تابعًا للنظام أو وحدة تحكّم في سياسة الجهاز (DPC). بدلاً من ذلك، استخدِم لوحة الإعدادات.

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

مراجع إضافية

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

نماذج

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