Android 10 và 11 cung cấp cho người dùng nhiều quyền kiểm soát hơn đối với ứng dụng của họ\39; truy cập vào các vị trí thiết bị của họ.
Khi một ứng dụng chạy trên Android 11 yêu cầu quyền truy cập vào thông tin vị trí, người dùng có 4 cách sau đây:
- Luôn cho phép
- Chỉ cho phép khi dùng ứng dụng (trong Android 10)
- Chỉ một lần (trong Android 11)
- Từ chối
Android 10
Android 11
Trong lớp học lập trình này, bạn sẽ tìm hiểu cách nhận thông tin cập nhật vị trí và cách hỗ trợ thông tin vị trí trên bất kỳ phiên bản Android nào, đặc biệt là Android 10 và 11. Khi kết thúc lớp học lập trình, bạn có thể có một ứng dụng tuân theo các phương pháp hay nhất hiện tại để truy xuất thông tin cập nhật về vị trí.
Điều kiện tiên quyết
Bạn sẽ thực hiện
- Làm theo các phương pháp hay nhất về vị trí trong Android.
- Xử lý các quyền về vị trí ở chế độ nền trước (khi người dùng yêu cầu rằng ứng dụng của bạn truy cập vào thông tin vị trí của thiết bị khi đang dùng ứng dụng).
- Sửa đổi ứng dụng hiện có để thêm hỗ trợ yêu cầu quyền truy cập thông tin vị trí bằng cách thêm mã để đăng ký và hủy đăng ký vị trí.
- Thêm tùy chọn hỗ trợ cho ứng dụng trên Android 10 và 11 bằng cách thêm logic để truy cập vào thông tin vị trí ở chế độ nền trước hoặc trong khi đang sử dụng.
Bạn cần có
- Android Studio phiên bản 3.4 trở lên để chạy mã
- Một thiết bị/trình mô phỏng chạy bản xem trước cho nhà phát triển Android 10 và 11
Nhân bản kho lưu trữ dự án ban đầu
Để bắt đầu nhanh nhất có thể, bạn có thể xây dựng dựa trên dự án dành cho người mới bắt đầu này. Nếu đã cài đặt Git, bạn chỉ cần chạy lệnh sau:
git clone https://github.com/googlecodelabs/while-in-use-location
Vui lòng truy cập trực tiếp vào trang GitHub.
Nếu không có Git, bạn có thể tải dự án dưới dạng tệp zip:
Nhập dự án
Mở Android Studio, chọn "Mở một dự án Android Studio hiện có" từ màn hình chào mừng và mở thư mục dự án.
Sau khi tải dự án, có thể bạn sẽ nhìn thấy cảnh báo cho biết Git không theo dõi tất cả thay đổi cục bộ của bạn. Bạn có thể nhấp vào Bỏ qua. (Bạn sẽ không đẩy thay đổi nào ngược trở lại kho lưu trữ Git.)
Ở góc trên bên trái của cửa sổ dự án, bạn sẽ thấy hình ảnh như bên dưới nếu bạn đang ở chế độ xem Android. (Nếu đang ở chế độ xem Dự án, bạn cần mở rộng dự án để thấy nội dung tương tự.)
Có hai thư mục (base
và complete
). Mỗi thư mục được gọi là "module".
Hãy lưu ý Android Studio có thể mất vài giây để biên dịch dự án ở chế độ nền trong lần đầu tiên. Trong thời gian này, bạn sẽ thấy thông báo sau trên thanh trạng thái ở cuối Android Studio:
Chờ cho đến khi Android Studio hoàn tất việc lập chỉ mục và tạo dự án trước khi thay đổi mã. Quá trình này cho phép Android Studio chuẩn bị tất cả thành phần cần thiết.
Nếu bạn nhận được lời nhắc Tải lại để các thay đổi về ngôn ngữ có hiệu lực hoặc nội dung nào đó tương tự, hãy chọn Có.
Tìm hiểu dự án ban đầu
Bạn đã thiết lập và sẵn sàng yêu cầu vị trí trong ứng dụng. Hãy sử dụng mô-đun base
làm điểm xuất phát. Trong mỗi bước, hãy thêm mã vào mô-đun base
. Vào thời điểm bạn hoàn tất lớp học lập trình này, mã trong mô-đun base
phải khớp với nội dung của mô-đun complete
. Bạn có thể dùng mô-đun complete
để kiểm tra bài tập của mình hoặc tham khảo nếu gặp vấn đề.
Các thành phần chính bao gồm:
MainActivity
—Giao diện người dùng cho phép người dùng cho phép ứng dụng truy cập vào thông tin vị trí của thiết bịLocationService
—dịch vụ đăng ký và hủy đăng ký thay đổi vị trí, đồng thời tự quảng cáo cho dịch vụ trên nền trước (kèm theo thông báo) nếu người dùng rời khỏi hoạt động của ứng dụng. Bạn thêm mã vị trí tại đây.Util
– Thêm hàm mở rộng cho lớpLocation
và lưu vị trí trongSharedPreferences
(lớp dữ liệu đơn giản hóa).
Thiết lập trình mô phỏng
Để biết thông tin về cách thiết lập một trình mô phỏng Android, hãy xem phần Chạy trên một trình mô phỏng.
Chạy dự án khởi động
Chạy ứng dụng của bạn.
- Kết nối thiết bị Android với máy tính hoặc bắt đầu một trình mô phỏng. (Đảm bảo rằng thiết bị đang chạy Android 10 trở lên.)
- Trên thanh công cụ, hãy chọn cấu hình
base
từ bộ chọn thả xuống rồi nhấp vào Chạy:
- Lưu ý: Ứng dụng sau đây sẽ xuất hiện trên thiết bị của bạn:
Bạn có thể nhận thấy rằng không có thông tin vị trí nào xuất hiện trong màn hình đầu ra. Đó là vì bạn chưa thêm mã vị trí.
Khái niệm
Trọng tâm của lớp học lập trình này là chỉ cho bạn cách nhận bản cập nhật vị trí và cuối cùng hỗ trợ Android 10 và Android 11.
Tuy nhiên, trước khi bạn bắt đầu lập trình, bạn nên xem lại các khái niệm cơ bản.
Các loại quyền truy cập vào thông tin vị trí
Bạn có thể nhớ bốn tùy chọn khác nhau để truy cập vị trí từ đầu lớp học lập trình. Hãy xem ý nghĩa của chúng:
- Chỉ cho phép khi dùng ứng dụng
- Tùy chọn này là tùy chọn được đề xuất cho hầu hết các ứng dụng. Còn được gọi là "while-in-use" or "foreground only" quyền truy cập, tùy chọn này được thêm vào Android 10 và cho phép nhà phát triển chỉ truy xuất vị trí khi ứng dụng đang được sử dụng. Một ứng dụng được coi là đang hoạt động nếu một trong các trường hợp sau là đúng:
- Một hoạt động xuất hiện.
- Dịch vụ trên nền trước đang chạy với thông báo đang diễn ra.
- Chỉ một lần
- Thêm vào Android 11, việc này giống như Chỉ cho phép khi sử dụng ứng dụng, nhưng chỉ trong một khoảng thời gian giới hạn. Để biết thêm thông tin, hãy xem bài viết Quyền một lần.
- Từ chối
- Tùy chọn này ngăn truy cập vào thông tin vị trí.
- Luôn cho phép
- Tùy chọn này luôn cho phép truy cập vào thông tin vị trí, nhưng cần có thêm quyền cho Android 10 trở lên. Bạn cũng phải đảm bảo mình có trường hợp sử dụng hợp lệ và tuân thủ chính sách về vị trí. Bạn sẽ không thấy tùy chọn này trong lớp học lập trình này, vì đây là trường hợp sử dụng hiếm gặp. Tuy nhiên, nếu bạn có trường hợp sử dụng hợp lệ và muốn biết cách xử lý đúng vị trí mọi lúc, bao gồm cả quyền truy cập thông tin vị trí ở chế độ nền, hãy xem lại mẫu LocationUpdateBackgroundKotlin.
Dịch vụ, dịch vụ trên nền trước và liên kết
Để hỗ trợ đầy đủ nội dung cập nhật vị trí Chỉ cho phép khi dùng ứng dụng, bạn cần tính đến thời điểm người dùng rời khỏi ứng dụng của bạn. Nếu muốn tiếp tục nhận thông tin cập nhật trong trường hợp đó, bạn cần tạo Service
nền trước và liên kết với Notification
.
Ngoài ra, nếu muốn sử dụng cùng một Service
để yêu cầu cập nhật vị trí khi ứng dụng của bạn hiển thị và khi người dùng rời khỏi ứng dụng, bạn cần liên kết/hủy liên kết Service
đó với phần tử giao diện người dùng.
Vì lớp học lập trình này chỉ tập trung vào việc nhận thông tin cập nhật vị trí nên bạn có thể tìm thấy tất cả mã cần thiết trong lớp ForegroundOnlyLocationService.kt
. Bạn có thể duyệt xem lớp đó và MainActivity.kt
để xem cách hoạt động của các lớp này.
Để biết thêm thông tin, hãy xem phần Tổng quan về dịch vụ và Tổng quan về các dịch vụ.
Quyền truy cập
Để nhận thông tin cập nhật vị trí từ NETWORK_PROVIDER
hoặc GPS_PROVIDER
, bạn phải yêu cầu quyền của người dùng bằng cách khai báo quyền ACCESS_COARSE_LOCATION
hoặc quyền ACCESS_FINE_LOCATION
tương ứng trong tệp kê khai Android của bạn. Nếu không có các quyền này, ứng dụng của bạn sẽ không thể yêu cầu quyền truy cập thông tin vị trí vào thời gian chạy.
Các quyền đó bao gồm trường hợp Chỉ một lần và Chỉ cho phép khi sử dụng ứng dụng khi ứng dụng của bạn được sử dụng trên một thiết bị chạy Android 10 trở lên.
Vị trí
Ứng dụng của bạn có thể truy cập vào nhóm dịch vụ vị trí được hỗ trợ thông qua các lớp trong gói com.google.android.gms.location
.
Hãy xem các lớp học chính:
FusedLocationProviderClient
- Đây là thành phần trung tâm của khung vị trí. Sau khi tạo, bạn hãy dùng vị trí đó để yêu cầu cập nhật vị trí và biết vị trí xác định gần đây nhất.
LocationRequest
- Đây là đối tượng dữ liệu chứa thông số chất lượng dịch vụ cho yêu cầu (khoảng thời gian để cập nhật, mức độ ưu tiên và độ chính xác). Thông tin này được chuyển đến
FusedLocationProviderClient
khi bạn yêu cầu cập nhật vị trí. LocationCallback
- Thông báo này dùng để nhận thông báo khi vị trí thiết bị đã thay đổi hoặc không thể xác định được nữa. Mã này được chuyển qua
LocationResult
, nơi bạn có thể lấyLocation
để lưu trong cơ sở dữ liệu của mình.
Giờ đây, bạn đã có ý tưởng cơ bản về những gì bạn đang làm, hãy bắt đầu với mã!
Lớp học lập trình này tập trung vào tùy chọn vị trí phổ biến nhất: Chỉ cho phép khi sử dụng ứng dụng.
Để nhận được thông tin cập nhật vị trí, ứng dụng của bạn phải có một hoạt động hiển thị hoặc một dịch vụ đang chạy trên nền trước (kèm theo thông báo).
Quyền truy cập
Mục đích của lớp học lập trình này là hướng dẫn cách nhận thông tin cập nhật về vị trí chứ không phải cách yêu cầu quyền truy cập thông tin vị trí. Vì vậy, chúng tôi đã viết mã này cho bạn. Bạn có thể bỏ qua nếu đã hiểu.
Dưới đây là các thông tin nổi bật về quyền (bạn không cần làm gì đối với phần này):
- Khai báo quyền mà bạn sử dụng trong
AndroidManifest.xml
. - Trước khi thử truy cập thông tin vị trí, hãy kiểm tra xem người dùng đã cấp quyền cho ứng dụng của bạn hay chưa. Nếu ứng dụng của bạn chưa được cấp quyền, hãy yêu cầu quyền truy cập.
- Xử lý lựa chọn quyền của người dùng. (Bạn có thể xem mã này trong
MainActivity.kt
.)
Nếu tìm kiếm TODO: Step 1.0, Review Permissions
trong AndroidManifest.xml
hoặc MainActivity.kt
, thì bạn sẽ thấy mọi mã được viết để cấp quyền.
Để biết thêm thông tin, hãy xem bài viết Tổng quan về quyền.
Bây giờ, hãy bắt đầu viết một số mã vị trí.
Xem xét các biến chính cần thiết cho hoạt động cập nhật vị trí
Trong mô-đun base
, hãy tìm TODO: Step 1.1, Review variables
trong
ForegroundOnlyLocationService.kt
tệp.
Bạn không cần thực hiện hành động nào trong bước này. Bạn chỉ cần xem lại khối mã sau, cùng với nhận xét, để hiểu các lớp và biến chính mà bạn sử dụng để nhận thông tin cập nhật vị trí.
// TODO: Step 1.1, Review variables (no changes).
// FusedLocationProviderClient - Main class for receiving location updates.
private lateinit var fusedLocationProviderClient: FusedLocationProviderClient
// LocationRequest - Requirements for the location updates, i.e., how often you
// should receive updates, the priority, etc.
private lateinit var locationRequest: LocationRequest
// LocationCallback - Called when FusedLocationProviderClient has a new Location.
private lateinit var locationCallback: LocationCallback
// Used only for local storage of the last known location. Usually, this would be saved to your
// database, but because this is a simplified sample without a full database, we only need the
// last location to create a Notification if the user navigates away from the app.
private var currentLocation: Location? = null
Xem lại lệnh khởi tạo FuseLocationProviderClient
Trong mô-đun base
, hãy tìm TODO: Step 1.2, Review the FusedLocationProviderClient
trong tệp ForegroundOnlyLocationService.kt
. Mã của bạn sẽ trông giống như sau:
// TODO: Step 1.2, Review the FusedLocationProviderClient.
fusedLocationProviderClient = LocationServices.getFusedLocationProviderClient(this)
Như đã đề cập trong các nhận xét trước, đây là lớp chính để nhận thông tin cập nhật vị trí. Biến này đã được khởi tạo cho bạn, nhưng bạn cần phải xem lại mã để hiểu cách khởi tạo biến đó. Bạn thêm một số mã vào đây sau để yêu cầu cập nhật vị trí.
Khởi chạy LocationRequest
- Trong mô-đun
base
, hãy tìmTODO: Step 1.3, Create a LocationRequest
trong tệpForegroundOnlyLocationService.kt
. - Sau đó, hãy thêm mã sau vào phần chú thích.
Mã khởi tạo LocationRequest
thêm chất lượng bổ sung của các thông số dịch vụ mà bạn cần cho yêu cầu của mình (khoảng thời gian, thời gian chờ tối đa và mức độ ưu tiên).
// TODO: Step 1.3, Create a LocationRequest.
locationRequest = LocationRequest().apply {
// Sets the desired interval for active location updates. This interval is inexact. You
// may not receive updates at all if no location sources are available, or you may
// receive them less frequently than requested. You may also receive updates more
// frequently than requested if other applications are requesting location at a more
// frequent interval.
//
// IMPORTANT NOTE: Apps running on Android 8.0 and higher devices (regardless of
// targetSdkVersion) may receive updates less frequently than this interval when the app
// is no longer in the foreground.
interval = TimeUnit.SECONDS.toMillis(60)
// Sets the fastest rate for active location updates. This interval is exact, and your
// application will never receive updates more frequently than this value.
fastestInterval = TimeUnit.SECONDS.toMillis(30)
// Sets the maximum time when batched location updates are delivered. Updates may be
// delivered sooner than this interval.
maxWaitTime = TimeUnit.MINUTES.toMillis(2)
priority = LocationRequest.PRIORITY_HIGH_ACCURACY
}
- Đọc qua nhận xét để hiểu cách hoạt động của từng nhận xét.
Khởi chạy Lệnh gọi lại vị trí
- Trong mô-đun
base
, hãy tìmTODO: Step 1.4, Initialize the LocationCallback
trong tệpForegroundOnlyLocationService.kt
. - Sau đó, hãy thêm mã sau vào phần chú thích.
// TODO: Step 1.4, Initialize the LocationCallback.
locationCallback = object : LocationCallback() {
override fun onLocationResult(locationResult: LocationResult?) {
super.onLocationResult(locationResult)
if (locationResult?.lastLocation != null) {
// Normally, you want to save a new location to a database. We are simplifying
// things a bit and just saving it as a local variable, as we only need it again
// if a Notification is created (when user navigates away from app).
currentLocation = locationResult.lastLocation
// Notify our Activity that a new location was added. Again, if this was a
// production app, the Activity would be listening for changes to a database
// with new locations, but we are simplifying things a bit to focus on just
// learning the location side of things.
val intent = Intent(ACTION_FOREGROUND_ONLY_LOCATION_BROADCAST)
intent.putExtra(EXTRA_LOCATION, currentLocation)
LocalBroadcastManager.getInstance(applicationContext).sendBroadcast(intent)
// Updates notification content if this service is running as a foreground
// service.
if (serviceRunningInForeground) {
notificationManager.notify(
NOTIFICATION_ID,
generateNotification(currentLocation))
}
} else {
Log.d(TAG, "Location information isn't available.")
}
}
}
LocationCallback
bạn tạo ở đây là lệnh gọi lại mà FusedLocationProviderClient
sẽ gọi khi có bản cập nhật vị trí mới.
Trong lệnh gọi lại, trước tiên bạn sẽ nhận được vị trí mới nhất bằng cách sử dụng một đối tượng LocationResult
. Sau đó, hãy thông báo cho Activity
về vị trí mới của bạn bằng cách sử dụng thông báo cục bộ (nếu thông báo đó đang hoạt động) hoặc bạn cập nhật Notification
nếu dịch vụ này đang chạy ở chế độ nền trước Service
.
- Đọc qua bình luận để hiểu chức năng của mỗi phần.
Đăng ký thay đổi đối với vị trí
Bây giờ, bạn đã khởi tạo mọi thứ, bạn cần cho FusedLocationProviderClient
biết rằng bạn muốn nhận thông tin cập nhật.
- Trong mô-đun
base
, hãy tìmStep 1.5, Subscribe to location changes
trong tệpForegroundOnlyLocationService.kt
. - Sau đó, hãy thêm mã sau vào phần chú thích.
// TODO: Step 1.5, Subscribe to location changes.
fusedLocationProviderClient.requestLocationUpdates(locationRequest, locationCallback, Looper.myLooper())
Cuộc gọi requestLocationUpdates()
cho FusedLocationProviderClient
biết rằng bạn muốn nhận thông tin cập nhật vị trí.
Có thể bạn đã nhận ra LocationRequest
và LocationCallback
mà bạn đã xác định trước đó. Các thông số này cho FusedLocationProviderClient
biết các thông số chất lượng dịch vụ cho yêu cầu của bạn và nội dung mà yêu cầu sẽ gọi khi có thông tin cập nhật. Cuối cùng, đối tượng Looper
chỉ định luồng cho lệnh gọi lại.
Bạn cũng có thể nhận thấy rằng mã này nằm trong câu lệnh try/catch
. Phương thức này yêu cầu một khối như vậy vì SecurityException
xảy ra khi ứng dụng của bạn không có quyền truy cập vào thông tin vị trí.
Hủy đăng ký nhận thông báo về các thay đổi đối với vị trí
Khi ứng dụng không còn cần quyền truy cập vào thông tin vị trí, bạn cần phải hủy đăng ký nhận thông tin cập nhật vị trí.
- Trong mô-đun
base
, hãy tìmTODO: Step 1.6, Unsubscribe to location changes
trong tệpForegroundOnlyLocationService.kt
. - Thêm mã sau sau nhận xét.
// TODO: Step 1.6, Unsubscribe to location changes.
val removeTask = fusedLocationProviderClient.removeLocationUpdates(locationCallback)
removeTask.addOnCompleteListener { task ->
if (task.isSuccessful) {
Log.d(TAG, "Location Callback removed.")
stopSelf()
} else {
Log.d(TAG, "Failed to remove Location Callback.")
}
}
Phương thức removeLocationUpdates()
thiết lập việc cần làm để cho FusedLocationProviderClient
biết rằng bạn không muốn nhận thông tin cập nhật vị trí cho LocationCallback
của mình nữa. addOnCompleteListener()
cho phép gọi lại để hoàn thành và thực thi Task
.
Giống như bước trước, bạn có thể nhận thấy rằng mã này nằm trong câu lệnh try/catch
. Phương thức này yêu cầu một khối như vậy vì SecurityException
xảy ra khi ứng dụng của bạn không có quyền truy cập vào thông tin vị trí
Bạn có thể băn khoăn khi phương thức chứa mã đăng ký/hủy đăng ký được gọi. Chúng được kích hoạt trong lớp chính khi người dùng nhấn vào nút. Nếu bạn muốn xem, hãy xem lớp MainActivity.kt
.
Chạy ứng dụng
Chạy ứng dụng của bạn từ Android Studio và thử nút vị trí.
Bạn sẽ thấy thông tin vị trí trong màn hình đầu ra. Đây là một ứng dụng có đầy đủ chức năng cho Android 9.
Trong phần này, bạn sẽ hỗ trợ cho Android 10.
Ứng dụng của bạn đã đăng ký thay đổi vị trí, do đó, bạn sẽ không cần phải làm nhiều việc.
Trên thực tế, tất cả những gì bạn cần làm là chỉ định rằng dịch vụ trên nền trước của bạn được sử dụng cho các mục đích về vị trí.
SDK mục tiêu 29
- Trong mô-đun
base
, hãy tìmTODO: Step 2.1, Target SDK 10
trong tệpbuild.gradle
. - Thực hiện các thay đổi sau:
- Đặt
compileSdkVersion
thành29
. - Đặt
buildToolsVersion
thành"29.0.3"
. - Đặt
targetSdkVersion
thành29
.
Mã của bạn sẽ trông giống như sau:
android {
// TODO: Step 2.1, Target Android 10.
compileSdkVersion 29
buildToolsVersion "29.0.3"
defaultConfig {
applicationId "com.example.android.whileinuselocation"
minSdkVersion 26
targetSdkVersion 29
versionCode 1
versionName "1.0"
}
...
}
Sau khi thực hiện việc này, bạn sẽ được yêu cầu đồng bộ hóa dự án. Nhấp vào Đồng bộ hóa ngay.
Sau đó, ứng dụng của bạn sắp sẵn sàng cho Android 10.
Thêm loại dịch vụ trên nền trước
Trên Android 10, bạn cần đưa vào loại dịch vụ trên nền trước nếu cần quyền truy cập thông tin vị trí khi đang sử dụng. Trong trường hợp của bạn, thông tin đó đang được dùng để lấy thông tin vị trí.
Trong mô-đun base
, hãy tìm TODO: 2.2, Add foreground service type
trong AndroidManifest.xml
và thêm mã sau vào phần tử <service>
:
android:foregroundServiceType="location"
Mã của bạn sẽ trông giống như sau:
<application>
...
<!-- Foreground services in Android 10+ require type. -->
<!-- TODO: 2.2, Add foreground service type. -->
<service
android:name="com.example.android.whileinuselocation.ForegroundOnlyLocationService"
android:enabled="true"
android:exported="false"
android:foregroundServiceType="location" />
</application>
Vậy là xong! Ứng dụng của bạn hỗ trợ tính năng vị trí của Android 10 cho "trong khi sử dụng" bằng cách làm theo các phương pháp hay nhất về vị trí trong Android.
Chạy ứng dụng
Chạy ứng dụng của bạn từ Android Studio và thử nút vị trí.
Mọi thứ phải hoạt động như trước đây, nhưng bây giờ hoạt động trên Android 10. Nếu trước đây bạn không chấp nhận quyền cho vị trí, thì giờ đây, bạn sẽ thấy màn hình quyền!
Trong phần này, bạn nhắm mục tiêu Android 11.
Tin vui là bạn không cần thay đổi bất kỳ tệp nào trừ tệp build.gradle
!
Nhắm mục tiêu SDK R
- Trong học phần
base
, hãy tìmTODO: Step 2.1, Target SDK
trong tệpbuild.gradle
. - Thực hiện các thay đổi sau:
compileSdkVersion
đến"android-R"
targetSdkVersion
đến"R"
Mã của bạn sẽ trông giống như sau:
android {
// TODO: Step 2.1, Target Android 10.
compileSdkVersion "android-R"
buildToolsVersion "29.0.2"
defaultConfig {
applicationId "com.example.android.whileinuselocation"
minSdkVersion 26
targetSdkVersion "R"
versionCode 1
versionName "1.0"
}
...
}
Sau khi thực hiện việc này, bạn sẽ được yêu cầu đồng bộ hóa dự án. Nhấp vào Đồng bộ hóa ngay.
Sau đó, ứng dụng của bạn đã sẵn sàng cho Android 11!
Chạy ứng dụng
Chạy ứng dụng của bạn từ Android Studio và thử nhấp vào nút.
Mọi thứ sẽ hoạt động như trước đây, nhưng bây giờ hoạt động trên Android 11. Nếu trước đây bạn không chấp nhận quyền cho vị trí, thì giờ đây, bạn sẽ thấy màn hình quyền!
Bằng cách kiểm tra và yêu cầu cấp quyền truy cập thông tin vị trí theo các cách hiển thị trong lớp học lập trình này, ứng dụng của bạn có thể theo dõi thành công cấp độ truy cập liên quan đến vị trí thiết bị.
Trang này liệt kê một số phương pháp hay nhất chính liên quan đến quyền truy cập thông tin vị trí. Để biết thêm thông tin về cách giữ cho người dùng của bạn an toàn dữ liệu, hãy xem Các phương pháp hay nhất về quyền cho ứng dụng.
Chỉ yêu cầu các quyền cần thiết
Chỉ yêu cầu cấp quyền khi cần. Ví dụ:
- Không yêu cầu quyền truy cập thông tin vị trí khi khởi động ứng dụng, trừ khi thực sự cần thiết.
- Nếu ứng dụng của bạn nhắm mục tiêu Android 10 trở lên và bạn đã sử dụng dịch vụ trên nền trước, hãy khai báo
foregroundServiceType
là"location"
trong tệp kê khai. - Không yêu cầu quyền truy cập thông tin vị trí ở chế độ nền trừ khi bạn có trường hợp sử dụng hợp lệ như mô tả trong Quyền truy cập vào thông tin vị trí của người dùng theo cách an toàn và minh bạch hơn.
Hỗ trợ hạ thấp mức độ tốt nếu không được cấp quyền
Để duy trì trải nghiệm tốt cho người dùng, hãy thiết kế ứng dụng của bạn để có thể xử lý các tình huống sau một cách khéo léo:
- Ứng dụng của bạn không có quyền truy cập vào thông tin vị trí.
- Ứng dụng của bạn không có quyền truy cập vào thông tin vị trí khi chạy ở chế độ nền.
Bạn đã tìm hiểu cách nhận thông tin cập nhật vị trí trong Android, lưu ý các phương pháp hay nhất!
Tìm hiểu thêm
- Mẫu đầy đủ để sử dụng vị trí ở chế độ nền nếu bạn có trường hợp sử dụng hợp lệ
- Yêu cầu cập nhật thông tin vị trí