Yêu cầu quyền truy cập thông tin vị trí

Để bảo vệ quyền riêng tư của người dùng, các ứng dụng dùng dịch vụ vị trí phải yêu cầu quyền truy cập thông tin vị trí.

Có nhiều quyền liên quan đến thông tin vị trí. Quyền mà bạn yêu cầu và cách bạn yêu cầu quyền đó phụ thuộc vào các yêu cầu về vị trí đối với trường hợp sử dụng của ứng dụng.

Trang này mô tả nhiều loại yêu cầu về vị trí và giải thích cách yêu cầu quyền truy cập thông tin vị trí trong từng trường hợp.

Để yêu cầu quyền truy cập thông tin vị trí, hãy làm theo các phương pháp hay nhất cho tất cả quyền khi bắt đầu chạy.

Loại quyền truy cập thông tin vị trí

Mỗi quyền có một tổ hợp đặc điểm sau:

Quyền truy cập thông tin vị trí ở chế độ nền trước

Nếu ứng dụng của bạn chứa một tính năng chỉ chia sẻ hoặc nhận thông tin vị trí một lần hoặc trong một khoảng thời gian xác định, thì tính năng đó sẽ yêu cầu quyền truy cập thông tin vị trí ở chế độ nền trước. Sau đây là một số ví dụ:

  • Trong ứng dụng tìm đường, một tính năng cho phép người dùng xem đường đi từng chặng.
  • Trong ứng dụng nhắn tin, một tính năng cho phép người dùng chia sẻ vị trí hiện tại của mình với người dùng khác.

Hệ thống sẽ coi ứng dụng của bạn đang sử dụng thông tin vị trí ở chế độ nền trước nếu một tính năng của ứng dụng truy cập vào vị trí hiện tại của thiết bị ở một trong các tình huống sau:

  • Một hoạt động thuộc ứng dụng của bạn đang hiển thị.
  • Ứng dụng của bạn đang chạy một dịch vụ trên nền trước. Khi một dịch vụ trên nền trước đang chạy, hệ thống sẽ báo cho người dùng biết bằng cách hiển thị một thông báo liên tục. Ứng dụng của bạn vẫn giữ quyền truy cập khi được đặt vào chế độ nền, chẳng hạn như khi người dùng nhấn nút Màn hình chính trên thiết bị hoặc tắt màn hình thiết bị.

    Ngoài ra, bạn nên khai báo loại dịch vụ trên nền trướclocation, như trong đoạn mã sau. Trên Android 10 (API cấp 29) trở lên, bạn phải khai báo loại dịch vụ trên nền trước này.

    <!-- Recommended for Android 9 (API level 28) and lower. -->
    <!-- Required for Android 10 (API level 29) and higher. -->
    <service
        android:name="MyNavigationService"
        android:foregroundServiceType="location" ... >
        <!-- Any inner elements would go here. -->
    </service>
    

Bạn khai báo nhu cầu về thông tin vị trí ở chế độ nền trước khi ứng dụng yêu cầu cấp quyền ACCESS_COARSE_LOCATION hoặc quyền ACCESS_FINE_LOCATION, như hiển thị trong đoạn mã sau:

<manifest ... >
  <!-- Always include this permission -->
  <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />

  <!-- Include only if your app benefits from precise location access. -->
  <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
</manifest>

Quyền truy cập thông tin vị trí ở chế độ nền

Ứng dụng sẽ yêu cầu quyền truy cập thông tin vị trí ở chế độ nền nếu một tính năng trong ứng dụng đó liên tục chia sẻ vị trí với người dùng khác hoặc sử dụng Geofencing API. Sau đây là một số ví dụ:

  • Trong ứng dụng chia sẻ vị trí của nhóm gia đình, một tính năng cho phép người dùng liên tục chia sẻ vị trí với thành viên gia đình.
  • Trong ứng dụng IoT, một tính năng cho phép người dùng định cấu hình các thiết bị trong nhà để tắt thiết bị khi người dùng rời khỏi nhà và bật lại khi người dùng trở về nhà.

Hệ thống sẽ coi ứng dụng của bạn đang sử dụng thông tin vị trí ở chế độ nền nếu ứng dụng truy cập vào thông tin vị trí hiện tại của thiết bị trong bất kỳ tình huống nào trừ những tình huống được mô tả trong phần thông tin vị trí ở chế độ nền trước. Độ chính xác của vị trí ở chế độ nền giống như độ chính xác của vị trí ở chế độ nền trước, tuỳ thuộc vào quyền truy cập thông tin vị trí mà ứng dụng của bạn khai báo.

Trên Android 10 (API cấp 29) trở lên, bạn phải khai báo quyền ACCESS_BACKGROUND_LOCATION trong tệp kê khai của ứng dụng để yêu cầu quyền truy cập thông tin vị trí ở chế độ nền trong thời gian chạy. Trên các phiên bản Android cũ, khi ứng dụng nhận được quyền truy cập thông tin vị trí ở chế độ nền trước, ứng dụng đó cũng tự động nhận được quyền truy cập thông tin vị trí ở chế độ nền.

<manifest ... >
  <!-- Required only when requesting background location access on
       Android 10 (API level 29) and higher. -->
  <uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />
</manifest>

Độ chính xác

Android hỗ trợ độ chính xác của vị trí ở mức độ sau:

Gần đúng
Cung cấp thông tin vị trí ước tính của thiết bị. Nếu thông tin vị trí ước tính này là từ LocationManagerService hoặc FusedLocationProvider, thì ước tính này sẽ chính xác trong phạm vi khoảng 3 kilômét vuông (khoảng 1,2 dặm vuông). Ứng dụng của bạn có thể nhận được thông tin vị trí ở mức độ chính xác này khi bạn khai báo quyền ACCESS_COARSE_LOCATION chứ không phải quyền ACCESS_FINE_LOCATION.
Chính xác
Cung cấp thông tin vị trí ước tính của thiết bị một cách chính xác nhất có thể. Nếu thông tin vị trí ước tính là từ LocationManagerService hoặc FusedLocationProvider, thì thông tin này thường nằm trong phạm vi khoảng 50 mét (160 feet) và đôi khi chính xác nhất là trong phạm vi vài mét (10 feet). Ứng dụng của bạn có thể nhận được thông tin vị trí ở mức độ chính xác này khi bạn khai báo quyền ACCESS_FINE_LOCATION.

Nếu người dùng cấp quyền truy cập thông tin vị trí ước chừng, thì ứng dụng của bạn chỉ có quyền truy cập thông tin vị trí ước chừng, bất kể ứng dụng đó khai báo quyền truy cập thông tin vị trí nào.

Ứng dụng của bạn sẽ vẫn hoạt động khi người dùng chỉ cấp quyền truy cập thông tin vị trí gần đúng. Nếu một tính năng trong ứng dụng của bạn tuyệt đối yêu cầu quyền truy cập thông tin vị trí chính xác thông qua quyền ACCESS_FINE_LOCATION, thì bạn có thể yêu cầu người dùng cho phép ứng dụng của bạn truy cập vào vị trí chính xác.

Nhắc nhở cấp quyền truy cập thông tin vị trí ở chế độ nền

Trên Android 10 (API cấp 29) trở lên, khi một tính năng trong ứng dụng của bạn truy cập thông tin vị trí ở chế độ nền lần đầu tiên sau khi người dùng cấp quyền truy cập thông tin vị trí ở chế độ nền, hệ thống sẽ lên lịch gửi thông báo cho người dùng. Thông báo này nhắc người dùng rằng họ đã luôn cho phép ứng dụng của bạn truy cập vào thông tin vị trí của thiết bị. Hình 8 minh hoạ một thông báo mẫu.

Kiểm tra các yêu cầu về vị trí trong phần phụ thuộc SDK của ứng dụng

Kiểm tra xem ứng dụng của bạn có dùng SDK nào phụ thuộc vào quyền truy cập thông tin vị trí hay không, đặc biệt là quyền ACCESS_FINE_LOCATION. Đọc bài đăng trên blog Tìm hiểu hành vi của các phần phụ thuộc SDK trên Medium để biết thêm thông tin.

Tài nguyên khác

Để biết thêm thông tin về quyền truy cập thông tin vị trí trong Android, hãy xem các tài liệu sau:

Lớp học lập trình

Video

Mẫu

  • Ứng dụng mẫu để minh hoạ việc sử dụng quyền truy cập thông tin vị trí.