Để 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:
- Danh mục: Quyền truy cập thông tin vị trí ở chế độ nền trước hoặc quyền truy cập thông tin vị trí ở chế độ nền.
- Độ chính xác: Vị trí chính xác hoặc vị trí gần đúng.
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ước là
location
, 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ặcFusedLocationProvider
, 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ềnACCESS_COARSE_LOCATION
chứ không phải quyềnACCESS_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ặcFusedLocationProvider
, 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ềnACCESS_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í.