ایجاد و نظارت بر حصارکشی‌های جغرافیایی

حصار جغرافیایی آگاهی از مکان فعلی کاربر را با آگاهی از نزدیکی کاربر به مکان‌هایی که ممکن است مورد علاقه او باشد ترکیب می‌کند. برای علامت‌گذاری مکان موردنظر، طول و عرض جغرافیایی آن را مشخص می‌کنید. برای تنظیم مجاورت برای مکان، شعاعی اضافه می‌کنید. عرض جغرافیایی، طول جغرافیایی، و شعاع یک حصار جغرافیایی را تعریف می‌کنند و یک منطقه دایره‌ای یا حصار در اطراف مکان موردنظر ایجاد می‌کنند.

می‌توانید چندین حصار جغرافیایی فعال داشته باشید، با محدودیت ۱۰۰ حصار جغرافیایی برای هر برنامه، به‌ازای هر کاربر دستگاه. برای هر حصار جغرافیایی، می‌توانید از «خدمات مکان» بخواهید رویدادهای ورود و خروج را برایتان ارسال کند، یا می‌توانید مدت‌زمانی را برای انتظار یا توقف در محدوده حصار جغرافیایی مشخص کنید تا پس‌از آن رویداد راه‌اندازی شود. می‌توانید مدت هر حصار جغرافیایی را با مشخص کردن مدت انقضا برحسب میلی‌ثانیه محدود کنید. پس‌از منقضی شدن حصار جغرافیایی، «خدمات مکان» به‌طور خودکار آن را برمی‌دارد.

این درس به شما نشان می‌دهد که چگونه حصارکشی‌های جغرافیایی را اضافه و حذف کنید، و سپس بااستفاده از BroadcastReceiver به انتقال‌های حصارکشی جغرافیایی گوش دهید.

توجه: در دستگاه‌های Wear، میاناهای برنامه‌سازی کاربردی «حصار جغرافیایی» به‌طور کارآمد از برق استفاده نمی‌کنند. این میاناهای برنامه‌سازی کاربردی را برای Wear توصیه نمی‌کنیم. برای اطلاعات بیشتر، صرفه‌جویی در مصرف برق و باتری را بخوانید.

راه‌اندازی برای پایش حصار جغرافیایی

اولین گام در درخواست نظارت بر حصار جغرافیایی، درخواست اجازه‌های لازم است. برای استفاده از حصار جغرافیایی، برنامه‌تان باید موارد زیر را درخواست کند:

برای کسب اطلاعات بیشتر، راهنمای نحوه درخواست اجازه‌های مکان را ببینید.

اگر می‌خواهید از BroadcastReceiver برای گوش دادن به انتقال‌های حصار جغرافیایی استفاده کنید، عنصری را اضافه کنید که نام سرویس را مشخص می‌کند. این عنصر باید فرزند عنصر <application> باشد:

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

برای دسترسی به میاناهای برنامه‌سازی کاربردی مکان، باید نمونه‌ای از کارخواه «حصار جغرافیایی» ایجاد کنید. برای آشنایی با نحوه متصل کردن کارخواه:

کاتلین

lateinit var geofencingClient: GeofencingClient

override fun onCreate(savedInstanceState: Bundle?) {
    // ...
    geofencingClient = LocationServices.getGeofencingClient(this)
}

جاوا

private GeofencingClient geofencingClient;

@Override
public void onCreate(Bundle savedInstanceState) {
    // ...
    geofencingClient = LocationServices.getGeofencingClient(this);
}

ایجاد و افزودن حصارکشی جغرافیایی

برنامه شما باید بااستفاده از کلاس سازنده Location API برای ایجاد اشیای Geofence و کلاس راحتی برای افزودن آن‌ها، حصارکشی‌های جغرافیایی را ایجاد و اضافه کند. همچنین، برای رسیدگی به هدف‌های ارسال‌شده از «خدمات مکان» هنگام وقوع انتقال‌های حصار جغرافیایی، می‌توانید PendingIntent را همان‌طور که در این بخش نشان داده شده است تعریف کنید.

توجه: در دستگاه‌های تک‌کاربره، محدودیت ۱۰۰ حصار جغرافیایی برای هر برنامه وجود دارد. برای دستگاه‌های چندکاربره، محدودیت ۱۰۰ حصار جغرافیایی برای هر برنامه به‌ازای هر کاربر دستگاه وجود دارد.

ایجاد اشیای حصار جغرافیایی

ابتدا، از Geofence.Builder برای ایجاد حصار جغرافیایی استفاده کنید و شعاع، مدت، و انواع انتقال موردنظر را برای حصار جغرافیایی تنظیم کنید. برای مثال، برای پر کردن شیء فهرست:

کاتلین

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())

جاوا

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 آن برای مشخص کردن حصارهای جغرافیایی برای نظارت و تنظیم نحوه راه‌اندازی رویدادهای حصار جغرافیایی مرتبط استفاده می‌کند:

کاتلین

private fun getGeofencingRequest(): GeofencingRequest {
    return GeofencingRequest.Builder().apply {
        setInitialTrigger(GeofencingRequest.INITIAL_TRIGGER_ENTER)
        addGeofences(geofenceList)
    }.build()
}

جاوا

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 استفاده شود، که رویدادها را فقط زمانی راه‌اندازی می‌کند که کاربر برای مدت‌زمان مشخصی در حصار جغرافیایی توقف کند. این رویکرد می‌تواند به کاهش «هرزنامه هشدار» ناشی از تعداد زیاد اعلان‌ها در زمانی که دستگاه برای مدت کوتاهی وارد حصار جغرافیایی می‌شود و از آن خارج می‌شود کمک کند. راهبرد دیگر برای دریافت بهترین نتایج از حصارکشی‌های جغرافیایی، تنظیم حداقل شعاع ۱۰۰ متری است. این کار به دقت مکان شبکه‌های Wi-Fi معمولی کمک می‌کند و همچنین به کاهش مصرف باتری دستگاه کمک می‌کند.

تعریف گیرنده رویداد ثبت‌شده برای گذرهای حصارکشی جغرافیایی

Intent ارسال‌شده از «خدمات مکان» می‌تواند کنش‌های مختلفی را در برنامه شما راه‌اندازی کند، اما نباید بگذارید فعالیت یا قطعه‌ای را شروع کند، زیرا مؤلفه‌ها فقط باید در پاسخ به کنش کاربر نمایان شوند. در بسیاری از موارد، BroadcastReceiver روش خوبی برای مدیریت انتقال حصار جغرافیایی است. ‫A BroadcastReceiver gets updates when an event occurs, such as a transition into or out of a geofence, and can start long-running background work.

تکه‌کد زیر نشان می‌دهد که چگونه PendingIntent را تعریف کنید که BroadcastReceiver را شروع می‌کند:

کاتلین

class MainActivity : AppCompatActivity() {

    // ...

    private val geofencePendingIntent: PendingIntent by lazy {
        // We use FLAG_UPDATE_CURRENT so that we get the same pending intent back when calling
        // addGeofences() and removeGeofences().
        val flags = PendingIntent.FLAG_UPDATE_CURRENT
        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.S) {
            // Starting on Android S+ the pending intent has to be mutable.
            flags or PendingIntent.FLAG_MUTABLE
        }
        val intent = Intent(this, GeofenceBroadcastReceiver::class.java)
        PendingIntent.getBroadcast(this, 0, intent, flags)
    }

}

جاوا

public class MainActivity extends AppCompatActivity {

    // ...

    private PendingIntent getGeofencePendingIntent() {
        // Reuse the PendingIntent if we already have it.
        if (geofencePendingIntent != null) {
          return geofencePendingIntent;
        }
        // We use FLAG_UPDATE_CURRENT so that we get the same pending intent back when calling
        // addGeofences() and removeGeofences().
        int flags = PendingIntent.FLAG_UPDATE_CURRENT;
        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.S) {
            // Starting on Android S+ the pending intent has to be mutable.
            flags |= PendingIntent.FLAG_MUTABLE;
        }
        Intent intent = new Intent(this, GeofenceBroadcastReceiver.class);
        geofencePendingIntent = PendingIntent.getBroadcast(this, 0, intent, flags);
        return geofencePendingIntent;
   }

}

افزودن حصار جغرافیایی

برای افزودن حصارکشی جغرافیایی، از روش GeofencingClient.addGeofences() استفاده کنید. شیء GeofencingRequest و PendingIntent را ارائه دهید. قطعه کد زیر پردازش نتایج را نشان می‌دهد:

کاتلین

geofencingClient?.addGeofences(getGeofencingRequest(), geofencePendingIntent)?.run {
    addOnSuccessListener {
        // Geofences added
        // ...
    }
    addOnFailureListener {
        // Failed to add geofences
        // ...
    }
}

جاوا

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 (سطح میانای برنامه‌سازی کاربردی ۲۶) و بالاتر، اگر برنامه‌ای درحال اجرا در پس‌زمینه باشد و هم‌زمان حصار جغرافیایی را پایش کند، دستگاه هر چند دقیقه یک‌بار به رویدادهای حصار جغرافیایی پاسخ می‌دهد. برای آشنایی با نحوه سازگار کردن برنامه با این محدودیت‌های پاسخ، به محدودیت‌های مکان پس‌زمینه‌ای مراجعه کنید.

تکه‌کد زیر نشان می‌دهد که چگونه می‌توان یک BroadcastReceiver تعریف کرد که وقتی انتقال حصار جغرافیایی رخ می‌دهد، اعلانی ارسال کند. وقتی کاربر روی اعلان کلیک می‌کند، فعالیت اصلی برنامه نشان داده می‌شود:

کاتلین

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

جاوا

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 برمی‌دارد و همه اعلان‌های بعدی را هنگام ورود یا خروج دستگاه از حصارکشی‌های جغرافیایی اضافه‌شده قبلی متوقف می‌کند:

کاتلین

geofencingClient?.removeGeofences(geofencePendingIntent)?.run {
    addOnSuccessListener {
        // Geofences removed
        // ...
    }
    addOnFailureListener {
        // Failed to remove geofences
        // ...
    }
}

جاوا

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 ارائه می‌دهد.

کاهش مصرف برق

می‌توانید از تکنیک‌های زیر برای بهینه‌سازی مصرف برق در برنامه‌هایی که از حصار جغرافیایی استفاده می‌کنند استفاده کنید:

  • پاسخ‌گویی اعلان را روی مقدار بالاتری تنظیم کنید. این کار با افزایش تأخیر هشدارهای حصار جغرافیایی، مصرف برق را بهبود می‌بخشد. برای مثال، اگر مقدار پاسخ‌گویی را پنج دقیقه تنظیم کنید، برنامه‌تان فقط هر پنج دقیقه یک‌بار هشدار ورود یا خروج را بررسی می‌کند. تنظیم مقادیر کمتر لزوماً به این معنی نیست که کاربران در آن دوره زمانی مطلع می‌شوند (برای مثال، اگر مقدار را ۵ ثانیه تنظیم کنید، ممکن است دریافت هشدار کمی بیشتر از آن طول بکشد).

  • برای مکان‌هایی که کاربر زمان قابل‌توجهی را در آنجا می‌گذراند، مثل خانه یا محل کار، از شعاع حصار جغرافیایی بزرگ‌تری استفاده کنید. اگرچه شعاع بزرگ‌تر مستقیماً مصرف برق را کاهش نمی‌دهد، اما دفعاتی را که برنامه ورود یا خروج را بررسی می‌کند کاهش می‌دهد و به‌طور مؤثری مصرف کلی برق را پایین می‌آورد.

شعاع بهینه را برای حصارکشی جغرافیایی‌تان انتخاب کنید

برای بهترین نتایج، حداقل شعاع حصار جغرافیایی باید بین ۱۰۰ تا ۱۵۰ متر تنظیم شود. وقتی Wi-Fi دردسترس باشد، دقت مکان معمولاً بین ۲۰ تا ۵۰ متر است. وقتی مکان داخلی دردسترس باشد، محدوده دقت می‌تواند تا ۵ متر باشد. مگر اینکه بدانید مکان داخلی در حصار جغرافیایی دردسترس است، فرض کنید که دقت مکان Wi-Fi حدود ۵۰ متر است.

وقتی مکان 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 نسخه ۴.۳ (سطح میانای برنامه‌سازی کاربردی ۱۸)، قابلیت «حالت فقط اسکن Wi-Fi» را اضافه کردیم که به کاربران اجازه می‌دهد Wi-Fi را غیرفعال کنند اما همچنان مکان شبکه خوبی دریافت کنند. بهتر است از کاربر درخواست شود و میان‌بری برای کاربر ارائه شود تا Wi-Fi یا حالت فقط اسکن Wi-Fi را درصورت غیرفعال بودن هر دو فعال کند. از SettingsClient استفاده کنید تا مطمئن شوید تنظیمات سیستم دستگاه به‌درستی برای تشخیص بهینه مکان پیکربندی شده است.

    توجه: اگر برنامه شما Android 10 (سطح میانای برنامه‌سازی کاربردی ۲۹) یا بالاتر را هدف قرار می‌دهد، نمی‌توانید مستقیماً WifiManager.setEnabled() را فراخوانی کنید، مگراینکه برنامه شما یک برنامه سیستم یا کنترل‌کننده خط‌مشی دستگاه (DPC) باشد. درعوض، از پانل تنظیمات استفاده کنید.

  • اتصال شبکه قابل‌اعتمادی در محدوده جغرافیایی شما وجود ندارد. اگر اتصال داده قابل‌اعتمادی وجود نداشته باشد، ممکن است هشدارها تولید نشوند. دلیل این امر این است که سرویس حصار جغرافیایی به ارائه‌دهنده مکان شبکه وابسته است که آن هم به اتصال داده نیاز دارد.
  • هشدارها ممکن است دیر ارسال شوند. سرویس حصار جغرافیایی به‌طور مداوم برای مکان درخواست نمی‌کند، بنابراین هنگام دریافت هشدارها انتظار کمی تأخیر داشته باشید. معمولاً تأخیر کمتر از ۲ دقیقه است، و وقتی دستگاه درحال حرکت باشد حتی کمتر هم می‌شود. اگر محدودیت‌های مکان پس‌زمینه‌ای اعمال شده باشد، زمان تأخیر به‌طور میانگین حدود ۲ تا ۳ دقیقه است. اگر دستگاه برای مدت زمان قابل‌توجهی ثابت بوده باشد، ممکن است تأخیر افزایش یابد (تا ۶ دقیقه).

منابع بیشتر

برای کسب اطلاعات بیشتر درباره «حصار جغرافیایی»، مطالب زیر را مشاهده کنید:

نمونه‌ها

برنامه نمونه برای ایجاد و پایش حصارکشی‌های جغرافیایی.