ایجاد و نظارت بر geofences

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

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

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

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

برای نظارت بر حصار جغرافیایی تنظیم کنید

اولین قدم برای درخواست نظارت بر geofence، درخواست مجوزهای لازم است. برای استفاده از geofencing، برنامه شما باید موارد زیر را درخواست کند:

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

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

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

برای دسترسی به APIهای موقعیت مکانی، باید یک نمونه از کلاینت Geofencing ایجاد کنید. برای یادگیری نحوه اتصال کلاینت خود:

کاتلین

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

ایجاد و اضافه کردن حصارهای جغرافیایی

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

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

اشیاء geofence ایجاد کنید

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

کاتلین

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

کاتلین

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 را نشان می‌دهد. گذار GEOFENCE_TRANSITION_ENTER زمانی فعال می‌شود که یک دستگاه وارد یک geofence شود و گذار GEOFENCE_TRANSITION_EXIT زمانی فعال می‌شود که یک دستگاه از یک geofence خارج شود. مشخص کردن INITIAL_TRIGGER_ENTER به سرویس‌های موقعیت مکانی می‌گوید که اگر دستگاه از قبل داخل geofence باشد، GEOFENCE_TRANSITION_ENTER باید فعال شود.

در بسیاری از موارد، ممکن است ترجیح داده شود به جای آن از INITIAL_TRIGGER_DWELL استفاده شود، که رویدادها را فقط زمانی فعال می‌کند که کاربر برای مدت زمان مشخصی در یک geofence توقف کند. این رویکرد می‌تواند به کاهش "هشدار هرز" ناشی از تعداد زیادی اعلان هنگام ورود و خروج کوتاه مدت یک دستگاه از geofenceها کمک کند. استراتژی دیگر برای گرفتن بهترین نتیجه از geofenceهای شما، تنظیم حداقل شعاع ۱۰۰ متر است. این به محاسبه دقت موقعیت مکانی شبکه‌های Wi-Fi معمولی کمک می‌کند و همچنین به کاهش مصرف برق دستگاه کمک می‌کند.

یک گیرنده پخش برای انتقال‌های ژئوفنس تعریف کنید

An Intent sent from Location Services can trigger various actions in your app, but you should not have it start an activity or fragment, because components should only become visible in response to a user action. In many cases, a BroadcastReceiver is a good way to handle a geofence transition. 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 {
        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)
    }
}

جاوا

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

اضافه کردن حصارهای جغرافیایی

برای افزودن geofences، از متد 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
                // ...
            }
        });

مدیریت انتقال‌های ژئوفنس

وقتی سرویس‌های موقعیت مکانی تشخیص می‌دهند که کاربر وارد یک geofence شده یا از آن خارج شده است، Intent موجود در PendingIntent که در درخواست اضافه کردن geofences گنجانده‌اید را ارسال می‌کند. یک گیرنده پخش مانند GeofenceBroadcastReceiver متوجه می‌شود که Intent فراخوانی شده است و سپس می‌تواند رویداد geofencing را از intent دریافت کند، نوع انتقال (های) Geofence را تعیین کند و مشخص کند که کدام یک از geofenceهای تعریف شده فعال شده است. گیرنده پخش می‌تواند یک برنامه را برای شروع انجام کارهای پس‌زمینه هدایت کند یا در صورت تمایل، یک اعلان به عنوان خروجی ارسال کند.

توجه: در اندروید ۸.۰ (سطح API ۲۶) و بالاتر، اگر برنامه‌ای در پس‌زمینه در حال نظارت بر یک محدوده جغرافیایی باشد، دستگاه هر چند دقیقه یکبار به رویدادهای محدوده جغرافیایی پاسخ می‌دهد. برای یادگیری نحوه تطبیق برنامه خود با این محدودیت‌های پاسخ، به محدودیت‌های مکان پس‌زمینه مراجعه کنید.

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

کاتلین

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 را دریافت می‌کند و بررسی می‌کند که آیا این یکی از رویدادهایی است که برنامه برای ایجاد اعلان‌ها استفاده می‌کند یا خیر -- در این مورد GEOFENCE_TRANSITION_ENTER یا GEOFENCE_TRANSITION_EXIT . سپس سرویس یک اعلان ارسال می‌کند و جزئیات انتقال را ثبت می‌کند.

نظارت بر حصار جغرافیایی را متوقف کنید

متوقف کردن نظارت بر geofence زمانی که دیگر مورد نیاز یا مطلوب نیست، می‌تواند به صرفه‌جویی در مصرف باتری و چرخه‌های CPU در دستگاه کمک کند. می‌توانید نظارت بر geofence را در فعالیت اصلی مورد استفاده برای اضافه کردن و حذف geofenceها متوقف کنید؛ حذف یک geofence بلافاصله آن را متوقف می‌کند. API روش‌هایی را برای حذف geofenceها یا با استفاده از شناسه‌های درخواست یا با حذف geofenceهای مرتبط با یک 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
                // ...
            }
        });

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

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

این بخش توصیه‌هایی برای استفاده از geofencing با API های مکان برای اندروید ارائه می‌دهد.

کاهش مصرف برق

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

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

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

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

برای بهترین نتیجه، حداقل شعاع ژئوفنس باید بین ۱۰۰ تا ۱۵۰ متر تنظیم شود. وقتی وای‌فای در دسترس باشد، دقت مکان‌یابی معمولاً بین ۲۰ تا ۵۰ متر است. وقتی مکان‌یابی در فضای داخلی در دسترس باشد، محدوده دقت می‌تواند به کوچکی ۵ متر باشد. مگر اینکه بدانید مکان‌یابی در فضای داخلی در داخل ژئوفنس در دسترس است، فرض کنید دقت مکان‌یابی وای‌فای حدود ۵۰ متر است.

وقتی موقعیت مکانی وای‌فای در دسترس نباشد (مثلاً وقتی در مناطق روستایی رانندگی می‌کنید) دقت موقعیت مکانی کاهش می‌یابد. محدوده دقت می‌تواند از چند صد متر تا چند کیلومتر باشد. در مواردی مانند این، باید حصارهای جغرافیایی با شعاع بزرگتر ایجاد کنید.

به کاربران توضیح دهید که چرا برنامه شما از حصار جغرافیایی استفاده می‌کند

از آنجا که برنامه شما هنگام استفاده از geofencing در پس‌زمینه به موقعیت مکانی دسترسی دارد، در نظر بگیرید که چگونه برنامه شما مزایایی را برای کاربران ارائه می‌دهد. برای آنها به وضوح توضیح دهید که چرا برنامه شما به این دسترسی نیاز دارد تا درک و شفافیت کاربر را افزایش دهد.

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

از نوع انتقال ساکن برای کاهش هرزنامه هشدار استفاده کنید

اگر هنگام رانندگی برای مدت کوتاهی از کنار یک حصار جغرافیایی (geofence) عبور می‌کنید و تعداد زیادی هشدار دریافت می‌کنید، بهترین راه برای کاهش تعداد هشدارها، استفاده از نوع انتقال GEOFENCE_TRANSITION_DWELL به جای GEOFENCE_TRANSITION_ENTER است. به این ترتیب، هشدار توقف فقط زمانی ارسال می‌شود که کاربر برای مدت زمان مشخصی در داخل یک حصار جغرافیایی توقف کند. می‌توانید مدت زمان را با تنظیم تأخیر در عبور (loitering delay) انتخاب کنید.

فقط در صورت لزوم، ژئوفنس‌ها را دوباره ثبت کنید

ژئوفنس‌های ثبت‌شده در فرآیند com.google.process.location متعلق به پکیج com.google.android.gms نگهداری می‌شوند. برنامه برای مدیریت رویدادهای زیر نیازی به انجام کاری ندارد، زیرا سیستم پس از این رویدادها، ژئوفنس‌ها را بازیابی می‌کند:

  • سرویس‌های گوگل پلی ارتقا یافته‌اند.
  • سرویس‌های گوگل پلی به دلیل محدودیت منابع توسط سیستم از کار افتاده و مجدداً راه‌اندازی می‌شوند.
  • فرآیند مکان‌یابی با مشکل مواجه می‌شود.

اگر پس از رویدادهای زیر هنوز به ژئوفنس‌ها نیاز باشد، برنامه باید آنها را دوباره ثبت کند، زیرا سیستم در موارد زیر نمی‌تواند ژئوفنس‌ها را بازیابی کند:

  • دستگاه دوباره راه‌اندازی می‌شود. برنامه باید منتظر عمل تکمیل بوت دستگاه بماند و سپس ژئوفنس‌های مورد نیاز را دوباره ثبت کند.
  • برنامه حذف و دوباره نصب می‌شود.
  • اطلاعات برنامه پاک شده است.
  • داده‌های سرویس‌های گوگل پلی پاک می‌شوند.
  • این برنامه هشدار GEOFENCE_NOT_AVAILABLE دریافت کرده است. این معمولاً پس از غیرفعال شدن NLP (ارائه‌دهنده موقعیت مکانی شبکه اندروید) اتفاق می‌افتد.

عیب‌یابی رویداد ورودی geofence

اگر هنگام ورود دستگاه به یک geofence، geofenceها فعال نمی‌شوند (هشدار GEOFENCE_TRANSITION_ENTER فعال نمی‌شود)، ابتدا مطمئن شوید که geofenceهای شما به درستی مطابق توضیحات این راهنما ثبت شده‌اند.

در اینجا چند دلیل احتمالی برای عدم کارکرد هشدارها طبق انتظار آورده شده است:

  • موقعیت مکانی دقیق در داخل محدوده جغرافیایی شما در دسترس نیست یا محدوده جغرافیایی شما خیلی کوچک است. در اکثر دستگاه‌ها، سرویس محدوده جغرافیایی فقط از موقعیت مکانی شبکه برای فعال‌سازی محدوده جغرافیایی استفاده می‌کند. این سرویس از این رویکرد استفاده می‌کند زیرا موقعیت مکانی شبکه انرژی بسیار کمتری مصرف می‌کند، زمان کمتری برای دریافت موقعیت‌های گسسته صرف می‌کند و از همه مهم‌تر، در داخل خانه نیز در دسترس است.
  • وای‌فای دستگاه خاموش است. روشن بودن وای‌فای می‌تواند دقت موقعیت مکانی را به میزان قابل توجهی بهبود بخشد، بنابراین اگر وای‌فای خاموش باشد، بسته به تنظیمات مختلف از جمله شعاع ژئوفنس، مدل دستگاه یا نسخه اندروید، ممکن است برنامه شما هرگز هشدارهای ژئوفنس را دریافت نکند. از اندروید ۴.۳ (سطح API ۱۸)، قابلیت «حالت فقط اسکن وای‌فای» را اضافه کردیم که به کاربران امکان می‌دهد وای‌فای را غیرفعال کنند اما همچنان موقعیت مکانی شبکه خوبی داشته باشند. بهتر است در صورت غیرفعال بودن هر دو حالت، از کاربر بخواهید که آن را فعال کند و یک میانبر برای او فراهم کنید. از SettingsClient استفاده کنید تا مطمئن شوید که تنظیمات سیستم دستگاه برای تشخیص بهینه موقعیت مکانی به درستی پیکربندی شده است.

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

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

منابع اضافی

برای کسب اطلاعات بیشتر در مورد Geofencing، مطالب زیر را مشاهده کنید:

نمونه‌ها

برنامه نمونه برای ایجاد و نظارت بر حصارهای جغرافیایی.