Tạo và giám sát khoanh vùng địa lý

Tính năng khoanh vùng địa lý giúp kết hợp tính năng nhận biết vị trí hiện tại của người dùng với khả năng nhận biết mức độ gần của người dùng với những vị trí mà họ có thể quan tâm. Để đánh dấu một vị trí mà bạn quan tâm, hãy ghi rõ vĩ độ và kinh độ của vị trí đó. Để điều chỉnh mức độ gần với vị trí, hãy thêm bán kính. Vĩ độ, kinh độ và bán kính xác định khoanh vùng địa lý, tạo ra một khu vực hình tròn, hoặc hàng rào, xung quanh vị trí quan tâm.

Bạn có thể có nhiều hàng rào địa lý đang hoạt động, và mỗi người dùng thiết bị có tối đa 100 hàng rào địa lý cho một ứng dụng. Đối với mỗi khoanh vùng địa lý, bạn có thể yêu cầu Dịch vụ vị trí gửi cho bạn các sự kiện vào và thoát hoặc bạn có thể nêu rõ thời lượng trong phạm vi khu vực khoanh vùng địa lý phải chờ hoặc dwell (cư trú) trước khi kích hoạt sự kiện. Bạn có thể giới hạn thời lượng của mọi khoanh vùng địa lý bằng cách chỉ định thời lượng hết hạn theo mili giây. Sau khi khoanh vùng địa lý hết hạn, Dịch vụ vị trí sẽ tự động xoá khoanh vùng địa lý đó.

Bài học này sẽ hướng dẫn bạn cách thêm và xoá khoanh vùng địa lý, sau đó nghe chuyển đổi khoanh vùng địa lý bằng BroadcastReceiver.

Thiết lập để giám sát khoanh vùng địa lý

Bước đầu tiên trong việc yêu cầu giám sát khoanh vùng địa lý là yêu cầu các quyền truy cập cần thiết. Để sử dụng tính năng khoanh vùng địa lý, ứng dụng của bạn phải yêu cầu các quyền sau:

Để tìm hiểu thêm, hãy xem hướng dẫn cách yêu cầu quyền truy cập thông tin vị trí.

Nếu bạn muốn dùng BroadcastReceiver để nghe các lượt chuyển đổi khoanh vùng địa lý, hãy thêm một phần tử chỉ định tên dịch vụ. Phần tử này phải là phần tử con của phần tử <application>:

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

Để truy cập API vị trí, bạn cần tạo một bản sao của ứng dụng khoanh vùng địa lý. Để tìm hiểu cách kết nối với ứng dụng khoanh vùng địa lý của bạn, hãy làm như sau:

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

Tạo và thêm khoanh vùng địa lý

Ứng dụng của bạn cần tạo và thêm khoanh vùng địa lý bằng cách sử dụng lớp trình tạo của API vị trí để tạo đối tượng khoanh vùng địa lý và lớp tiện lợi để thêm các đối tượng đó. Ngoài ra, để xử lý các ý định do Dịch vụ vị trí gửi tới khi xảy ra các lượt chuyển đổi khoanh vùng địa lý, bạn có thể xác định một PendingIntent như được hiển thị trong phần này.

Lưu ý: Trên thiết bị một người dùng, mỗi ứng dụng có tối đa 100 khoanh vùng địa lý. Đối với thiết bị nhiều người dùng, mỗi người dùng thiết bị có tối đa 100 khoanh vùng địa lý cho mỗi ứng dụng.

Tạo đối tượng khoanh vùng địa lý

Trước tiên, hãy dùng Geofence.Builder để tạo khoanh vùng địa lý, thiết lập bán kính, thời lượng và các loại chuyển đổi mong muốn cho khoanh vùng địa lý đó. Ví dụ: để điền sẵn một đối tượng danh sách:

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

Ví dụ này lấy dữ liệu từ một tệp hằng số. Trong thực tế, các ứng dụng có thể tạo các khoanh vùng địa lý một cách linh động dựa trên vị trí của người dùng.

Chỉ định khoanh vùng địa lý và trình kích hoạt ban đầu

Đoạn mã sau sử dụng lớp GeofencingRequest và lớp GeofencingRequestBuilder lồng nhau để chỉ định khoanh vùng địa lý cần giám sát, cũng như thiết lập cách kích hoạt các sự kiện khoanh vùng địa lý có liên quan:

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

Ví dụ này cho thấy việc sử dụng hai trình kích hoạt khoanh vùng địa lý. Quá trình chuyển đổi GEOFENCE_TRANSITION_ENTER sẽ kích hoạt khi một thiết bị nhập vào khoanh vùng địa lý và quá trình chuyển đổi GEOFENCE_TRANSITION_EXIT sẽ kích hoạt khi một thiết bị thoát khỏi khoanh vùng địa lý. Việc chỉ định INITIAL_TRIGGER_ENTER cho Dịch vụ vị trí biết rằng GEOFENCE_TRANSITION_ENTER sẽ được kích hoạt nếu thiết bị đã nằm trong khoanh vùng địa lý.

Trong nhiều trường hợp, bạn nên dùng INITIAL_TRIGGER_DWELL để kích hoạt các sự kiện chỉ khi người dùng dừng hoạt động trong một khoảng thời gian nhất định trong phạm vi khoanh vùng địa lý. Phương pháp này có thể giúp giảm "cảnh báo vi phạm" do có nhiều thông báo khi một thiết bị nhập và thoát khỏi khoanh vùng địa lý trong thời gian ngắn. Một chiến lược khác để thu được kết quả tốt nhất từ các khoanh vùng địa lý của bạn là đặt bán kính tối thiểu là 100 mét. Dữ liệu này giúp tính chính xác hơn về vị trí của các mạng Wi-Fi thông thường, đồng thời giúp giảm mức tiêu thụ điện năng của thiết bị.

Xác định broadcast receiver để chuyển đổi khoanh vùng địa lý

Intent do Dịch vụ vị trí gửi đến có thể kích hoạt nhiều thao tác trong ứng dụng của bạn, nhưng bạn không nên yêu cầu hành động này bắt đầu một hoạt động hoặc mảnh vì các thành phần chỉ nên hiển thị trong phản hồi cho một thao tác của người dùng. Trong nhiều trường hợp, bạn nên dùng BroadcastReceiver để xử lý việc chuyển đổi khoanh vùng địa lý. BroadcastReceiver sẽ nhận được thông tin cập nhật khi sự kiện xảy ra, chẳng hạn như quá trình chuyển đổi vào hoặc ra khỏi khoanh vùng địa lý, cũng như có thể bắt đầu hoạt động chạy trong nền trong thời gian dài.

Đoạn mã sau đây cho biết cách xác định PendingIntent để bắt đầu 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;
    }

Thêm khoanh vùng địa lý

Để thêm khoanh vùng địa lý, hãy sử dụng phương thức GeofencingClient.addGeofences(). Cung cấp đối tượng GeofencingRequestPendingIntent. Đoạn mã sau minh hoạ cách xử lý kết quả:

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

Xử lý quá trình chuyển đổi khoanh vùng địa lý

Khi phát hiện người dùng đã nhập hoặc thoát khỏi khoanh vùng địa lý, Dịch vụ vị trí sẽ gửi Intent nằm trong PendingIntent mà bạn đưa vào yêu cầu thêm khoanh vùng địa lý. Một broadcast receiver như GeofenceBroadcastReceiver nhận thấy Intent đã được gọi và sau đó có thể lấy sự kiện khoanh vùng địa lý từ ý định, xác định loại của (các) lượt chuyển đổi khoanh vùng địa lý, cũng như hàng rào địa lý đã xác định nào đã được kích hoạt. Bộ broadcast receiver có thể hướng dẫn một ứng dụng bắt đầu thực hiện công việc trong nền hoặc gửi thông báo dưới dạng đầu ra (nếu muốn).

Lưu ý: Trên Android 8.0 (API cấp 26) trở lên, nếu một ứng dụng đang chạy trong nền trong khi giám sát khoanh vùng địa lý, thì thiết bị đó sẽ phản hồi các sự kiện khoanh vùng địa lý vài phút một lần. Để tìm hiểu cách điều chỉnh ứng dụng cho phù hợp với các giới hạn phản hồi này, hãy xem nội dung Các giới hạn về quyền truy cập thông tin vị trí ở chế độ nền.

Đoạn mã sau đây cho biết cách xác định BroadcastReceiver đăng thông báo khi quá trình chuyển đổi khoanh vùng địa lý xảy ra. Khi người dùng nhấp vào thông báo, hoạt động chính của ứng dụng sẽ xuất hiện:

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

Sau khi phát hiện sự kiện chuyển đổi quaPendingIntent, BroadcastReceiver nhận loại chuyển đổi khoanh vùng địa lý và kiểm tra xem đó có phải là một trong các sự kiện mà ứng dụng sử dụng để kích hoạt thông báo hay không -- trong trường hợp này có thể là GEOFENCE_TRANSITION_ENTER hoặc GEOFENCE_TRANSITION_EXIT. Sau đó, Dịch vụ vị trí sẽ gửi thông báo và ghi lại thông tin chi tiết chuyển đổi.

Ngừng giám sát khoanh vùng địa lý

Việc ngừng giám sát khoanh vùng địa lý khi không còn cần thiết hoặc không cần nữa có thể giúp tiết kiệm pin và chu kỳ CPU trên thiết bị. Bạn có thể ngừng giám sát khoanh vùng địa lý trong hoạt động chính được dùng để thêm và xoá khoanh vùng địa lý; việc xoá khoanh vùng địa lý sẽ làm khoanh vùng địa lý này dừng hoạt động ngay lập tức. API này cung cấp các phương thức để xoá khoanh vùng địa lý theo mã yêu cầu hoặc xoá các khoanh vùng địa lý liên kết với một PendingIntent nhất định.

Đoạn mã sau đây sẽ xoá các khoanh vùng địa lý trước PendingIntent, ngừng nhận thêm tất cả thông báo khi thiết bị nhập hoặc thoát ra khỏi các khoanh vùng địa lý đã thêm trước đó:

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

Bạn có thể kết hợp tính năng khoanh vùng địa lý với các tính năng nhận biết vị trí khác, chẳng hạn như các thông báo cập nhật vị trí định kỳ. Để biết thêm thông tin, hãy xem các bài học khác trong lớp học này.

Sử dụng các phương pháp hay nhất để khoanh vùng địa lý

Phần này trình bày các đề xuất về việc sử dụng tính năng khoanh vùng địa lý với API vị trí dành cho Android.

Giảm mức tiêu thụ điện năng

Bạn có thể sử dụng các kỹ thuật sau để tối ưu hoá mức tiêu thụ điện năng trong các ứng dụng sử dụng tính năng khoanh vùng địa lý:

  • Đặt phản hồi của thông báo thành giá trị cao hơn. Làm như vậy sẽ cải thiện mức tiêu thụ điện năng bằng cách tăng độ trễ của cảnh báo khoanh vùng địa lý. Ví dụ: nếu bạn đặt giá trị phản hồi là 5 phút, thì ứng dụng của bạn chỉ kiểm tra cảnh báo việc nhập vào hoặc thoát ra 5 phút một lần. Việc đặt giá trị thấp hơn không nhất thiết có nghĩa là người dùng sẽ nhận được thông báo trong khoảng thời gian đó (ví dụ: nếu bạn đặt giá trị là 5 giây, thời gian để nhận được thông báo có thể lâu hơn một chút).

  • Sử dụng bán kính khoanh vùng địa lý lớn hơn cho các vị trí mà người dùng dành một khoảng thời gian đáng kể, chẳng hạn như nhà riêng hoặc cơ quan. Mặc dù bán kính lớn hơn không trực tiếp làm giảm mức tiêu thụ điện năng, nhưng bán kính giảm tần suất ứng dụng kiểm tra việc nhập vào hoặc thoát ra, giúp giảm mức tiêu thụ điện năng tổng thể một cách hiệu quả.

Chọn bán kính tối ưu cho khoanh vùng địa lý

Để có kết quả tốt nhất, bạn nên đặt bán kính tối thiểu của khoanh vùng địa lý trong khoảng từ 100 đến 150 mét. Khi có Wi-Fi, độ chính xác về vị trí thường nằm trong khoảng từ 20 đến 50 mét. Khi có vị trí trong nhà, phạm vi chính xác có thể chỉ là 5 mét. Trừ khi bạn biết vị trí trong nhà có sẵn trong khoanh vùng địa lý, hãy giả sử rằng độ chính xác của vị trí Wi-Fi là khoảng 50 mét.

Khi không có vị trí Wi-Fi (ví dụ: khi bạn đang lái xe ở các vùng nông thôn), độ chính xác của vị trí sẽ giảm đi. Phạm vi chính xác có thể lớn từ vài trăm mét đến vài km. Trong trường hợp như vậy, chúng tôi khuyến khích bạn tạo các khoanh vùng địa lý bằng cách sử dụng bán kính lớn hơn.

Giải thích cho người dùng lý do ứng dụng của bạn sử dụng tính năng khoanh vùng địa lý

Vì ứng dụng của bạn truy cập thông tin vị trí ở chế độ nền khi bạn dùng tính năng khoanh vùng địa lý, nên hãy cân nhắc cách ứng dụng mang lại lợi ích cho người dùng. Hãy giải thích rõ cho người dùng về lý do ứng dụng của bạn cần quyền truy cập này để người dùng hiểu biết thêm và tăng tính minh bạch.

Để biết thêm thông tin về các phương pháp hay nhất liên quan đến quyền truy cập thông tin vị trí, bao gồm cả việc khoanh vùng địa lý, hãy xem trang các phương pháp hay nhất về quyền riêng tư.

Sử dụng loại chuyển đổi vị trí để giảm cảnh báo rác

Nếu bạn nhận được số lượng lớn cảnh báo khi lái xe nhanh qua một khoanh vùng địa lý, cách tốt nhất để giảm cảnh báo là sử dụng loại chuyển đổi GEOFENCE_TRANSITION_DWELL thay vì GEOFENCE_TRANSITION_ENTER. Bằng cách này, thông báo về vị trí chỉ được gửi khi người dùng dừng trong phạm vi khoanh vùng địa lý trong một khoảng thời gian nhất định. Bạn có thể chọn thời lượng bằng cách đặt độ trễ (loitering delay).

Chỉ đăng ký lại khoanh vùng địa lý khi được yêu cầu

Các khoanh vùng địa lý đã đăng ký được lưu giữ trong quy trình com.google.process.location do gói com.google.android.gms sở hữu. Ứng dụng không cần phải làm gì để xử lý các sự kiện sau đây vì hệ thống sẽ khôi phục khoanh vùng địa lý sau các sự kiện này:

  • Nâng cấp các dịch vụ của Google Play.
  • Hệ thống tắt đi và khởi động lại các dịch vụ Google Play do hạn chế tài nguyên.
  • Quá trình xử lý vị trí gặp sự cố.

Ứng dụng phải đăng ký lại khoanh vùng địa lý nếu vẫn cần thiết sau các sự kiện sau, vì hệ thống không thể khôi phục khoanh vùng địa lý trong các trường hợp sau:

  • Khởi động lại thiết bị. Ứng dụng sẽ theo dõi thao tác hoàn tất khởi động của thiết bị và sau đó đăng ký lại khoanh vùng địa lý theo yêu cầu.
  • Gỡ cài đặt và cài đặt lại ứng dụng.
  • Xoá dữ liệu của ứng dụng.
  • Xoá dữ liệu Dịch vụ Google Play.
  • Ứng dụng này đã nhận được một thông báo GEOFENCE_NOT_AVAILABLE. Điều này thường xảy ra sau khi NLP (Nhà cung cấp vị trí mạng của Android) bị tắt.

Khắc phục sự cố của sự kiện nhập vào khoanh vùng địa lý

Nếu khoanh vùng địa lý không được kích hoạt khi thiết bị nhập vào một khoanh vùng địa lý (thông báo GEOFENCE_TRANSITION_ENTER không được kích hoạt), trước tiên, bạn phải đảm bảo rằng khoanh vùng địa lý của mình được đăng ký đúng cách như mô tả trong hướng dẫn này.

Dưới đây là một số lý do có thể khiến cảnh báo không hoạt động như mong đợi:

  • Không có vị trí chính xác trong phạm vi khoanh vùng địa lý hoặc vị trí khoanh vùng địa lý của bạn quá nhỏ. Trên hầu hết các thiết bị, dịch vụ khoanh vùng địa lý chỉ sử dụng vị trí mạng để kích hoạt khoanh vùng địa lý. Dịch vụ khoanh vùng địa lý sử dụng phương pháp này vì vị trí mạng tiêu thụ ít điện năng hơn, mất ít thời gian hơn để có được các vị trí riêng biệt, và quan trọng nhất là vị trí này có sẵn trong nhà.
  • Wi-Fi bị tắt trên thiết bị này. Việc bật Wi-Fi có thể cải thiện đáng kể độ chính xác của vị trí, vì vậy, nếu Wi-Fi bị tắt, ứng dụng của bạn có thể không bao giờ nhận được cảnh báo khoanh vùng địa lý tuỳ thuộc vào một số cài đặt, bao gồm bán kính của khoanh vùng địa lý, kiểu thiết bị hoặc phiên bản Android. Kể từ Android 4.3 (API cấp 18), chúng tôi đã thêm tính năng "Chế độ chỉ quét tìm Wi-Fi" cho phép người dùng tắt Wi-Fi nhưng vẫn nhận được vị trí mạng tốt. Bạn nên nhắc người dùng và cung cấp lối tắt để người dùng bật Wi-Fi hoặc chế độ chỉ quét Wi-Fi nếu cả hai chế độ đó đều bị tắt. Sử dụng SettingsClient để đảm bảo rằng các chế độ cài đặt hệ thống của thiết bị được định cấu hình đúng cách để phát hiện vị trí tối ưu.

    Lưu ý: Nếu ứng dụng của bạn nhắm mục tiêu Android 10 (API cấp 29) trở lên, bạn không thể gọi trực tiếp WifiManager.setEnabled() trừ phi ứng dụng của bạn là ứng dụng hệ thống hoặc trình kiểm soát chính sách thiết bị (DPC). Thay vào đó, hãy sử dụng bảng cài đặt.

  • Không có kết nối mạng đáng tin cậy trong phạm vi khoanh vùng địa lý của bạn. Nếu không có kết nối dữ liệu đáng tin cậy, cảnh báo có thể không được tạo. Điều này là do dịch vụ khoanh vùng địa lý phụ thuộc vào nhà cung cấp vị trí mạng và do đó, cần phải có kết nối dữ liệu.
  • Cảnh báo có thể bị trễ. Dịch vụ khoanh vùng địa lý không truy vấn vị trí liên tục, vì vậy, bạn sẽ phải chờ một khoảng thời gian khi nhận được thông báo. Thông thường, thời gian chờ chưa tới 2 phút, thậm chí là ít hơn khi thiết bị đang di chuyển. Nếu Giới hạn về quyền truy cập thông tin vị trí ở chế độ nền có hiệu lực, thời gian chờ trung bình sẽ là khoảng 2-3 phút. Nếu thiết bị đã đứng yên trong một khoảng thời gian đáng kể, thì thời gian chờ có thể tăng (tối đa 6 phút).

Tài nguyên khác

Để tìm hiểu thêm về tính năng Khoanh vùng địa lý, hãy xem các tài liệu sau:

Mẫu

Ứng dụng mẫu để tạo và giám sát khoanh vùng địa lý.