1. Trước khi bắt đầu
Android 10 và 11 giúp người dùng kiểm soát chặt chẽ hơn quyền truy cập của ứng dụng vào thông tin vị trí trên 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 vị trí, người dùng có 4 lựa chọn:
- 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ề vị trí và cách hỗ trợ vị trí trên mọi phiên bản Android, đặc biệt là Android 10 và 11. Khi kết thúc lớp học lập trình này, bạn có thể kỳ vọng sẽ 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ý quyền truy cập thông tin vị trí ở chế độ nền trước (khi người dùng yêu cầu ứng dụng của bạn truy cập vào thông tin vị trí của thiết bị trong khi ứng dụng đang được sử dụng).
- Sửa đổi một ứng dụng hiện có để thêm tính năng hỗ trợ yêu cầu quyền truy cập vào vị trí bằng cách thêm mã để đăng ký và huỷ đăng ký vị trí.
- Thêm tính năng hỗ trợ cho ứng dụng trên Android 10 và 11 bằng cách thêm logic để truy cập thông tin vị trí ở chế độ nền trước hoặc khi đang sử dụng.
Bạn cần có
- Android Studio 3.4 trở lên để chạy mã
- Một thiết bị/trình mô phỏng chạy bản dùng thử cho nhà phát triển của Android 10 và 11
2. Bắt đầu
Nhân bản kho lưu trữ dự án ban đầu
Để có thể bắt đầu nhanh chóng, bạn có thể xây dựng ứng dụng dựa trên dự án khởi đầu này. Nếu đã cài đặt Git, bạn có thể chỉ cần chạy lệnh sau:
git clone https://github.com/android/codelab-while-in-use-location
Bạn có thể 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 xuống dưới dạng tệp zip:
Nhập dự án
Mở Android Studio, chọn "Open an existing Android Studio project" (Mở một dự án Android Studio hiện có) trên màn hình chào mừng rồi 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ả cá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 sổ dự án, bạn sẽ thấy như sau nếu đang ở chế độ xem Android. (Nếu đang ở chế độ xem Project (Dự án), bạn cần phải mở rộng dự án để thấy được như này.)

Có hai thư mục (base và complete). Mỗi thư mục được gọi là một "mô-đun".
Hãy lưu ý rằng 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 khoảng thời gian này, bạn sẽ thấy thông báo sau trong thanh trạng thái ở cuối Android Studio:

Hãy đợi cho đến khi Android Studio hoàn tất quá trình lập chỉ mục và tạo dự án trước khi thực hiện 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 thấy lời nhắc Tải lại để áp dụng các thay đổi về ngôn ngữ? hoặc tương tự, hãy chọn Có.
Tìm hiểu dự án khởi đầu
Bạn đã thiết lập xong 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. Khi bạn hoàn tất lớp học lập trình này, mã trong mô-đun base sẽ khớp với nội dung của mô-đun complete. Bạn có thể dùng mô-đun complete để kiểm tra công việc 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 dụng truy cập vào thông tin vị trí của thiết bịLocationService– dịch vụ đăng ký và huỷ đăng ký các thay đổi về vị trí, đồng thời tự quảng bá thành một 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 các hàm tiện ích cho lớpLocationvà lưu vị trí trongSharedPreferences(lớp dữ liệu đơn giản).
Thiết lập trình mô phỏng
Để biết thông tin về cách thiết lập trình mô phỏng Android, hãy xem phần Chạy trên trình mô phỏng.
Chạy dự án ban đầu
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 khởi động trình mô phỏng. (Đảm bảo thiết bị đang chạy Android 10 trở lên.)
- Trong thanh công cụ, hãy chọn cấu hình
basetrên bộ chọn thả xuống rồi nhấp vào Run (Chạy):

- Bạn sẽ thấy ứng dụng sau đây xuất hiện trên thiết bị:

Bạn có thể nhận thấy rằng không có thông tin vị trí nào xuất hiện trên màn hình đầu ra. Lý do là vì bạn chưa thêm mã vị trí.
3. Thêm vị trí
Khái niệm
Lớp học lập trình này tập trung vào việc hướng dẫn bạn cách nhận thông tin cập nhật về vị trí và cuối cùng là hỗ trợ Android 10 và Android 11.
Tuy nhiên, trước khi bắt đầu viết mã, bạn nên xem lại những kiến thức cơ bản.
Các loại quyền truy cập thông tin vị trí
Có thể bạn còn nhớ 4 lựa chọn truy cập vào vị trí ở phần đầu của lớp học lập trình. Hãy xem ý nghĩa của các trạng thái này:
- Chỉ cho phép khi dùng ứng dụng
- Đây là lựa chọn được đề xuất cho hầu hết các ứng dụng. Còn được gọi là quyền truy cập "trong khi sử dụng" hoặc "chỉ ở nền trước", lựa 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 hai điều kiện sau đây là đúng:
- Một hoạt động đang hiển thị.
- Một dịch vụ trên nền trước đang chạy cùng với một thông báo hiển thị liên tục.
- Chỉ một lần
- Quyền này được thêm vào từ Android 11 và giống với quyền Chỉ cho phép khi dùng ứng dụng, nhưng chỉ có hiệu lực trong một khoảng thời gian giới hạn. Để biết thêm thông tin, hãy xem phần Quyền dùng một lần.
- Từ chối
- Tuỳ chọn này ngăn chặn việc truy cập vào thông tin vị trí.
- Luôn cho phép
- Lựa chọn này cho phép truy cập thông tin vị trí mọi lúc, nhưng yêu cầu thêm một quyền đối với Android 10 trở lên. Bạn cũng phải đảm bảo rằng mình có trường hợp sử dụng hợp lệ và tuân thủ các chính sách về vị trí. Bạn sẽ không đề cập đến lựa chọn này trong lớp học lập trình này vì đây là một trường hợp sử dụng hiếm gặp hơn. Tuy nhiên, nếu bạn có một trường hợp sử dụng hợp lệ và muốn tìm hiểu cách xử lý đúng thông tin vị trí mọi lúc, kể cả khi truy cập thông tin vị trí ở chế độ nền, hãy xem mẫu LocationUpdatesBackgroundKotlin.
Dịch vụ, dịch vụ trên nền trước và hoạt động liên kết
Để hỗ trợ đầy đủ các bản cập nhật vị trí Chỉ cho phép khi dùng ứng dụng, bạn cần tính đến trường hợp 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 các bản cập nhật trong trường hợp đó, bạn cần tạo một Service trên nền trước và liên kết với một Notification.
Ngoài ra, nếu muốn 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/huỷ liên kết Service đó với phần tử trên 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ề 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 qua lớp đó và MainActivity.kt để xem cách chúng hoạt động cùng nhau.
Để biết thêm thông tin, hãy xem bài viết Tổng quan về các dịch vụ và Tổng quan về các dịch vụ ràng buộc.
Quyền truy cập
Để nhận thông tin cập nhật về vị trí từ NETWORK_PROVIDER hoặc GPS_PROVIDER, bạn phải yêu cầu người dùng cấp quyền 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. 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 vào thông tin vị trí khi bắt đầu chạy.
Những quyền này bao gồm các trường hợp Chỉ một lần và Chỉ cho phép khi dùng ứng dụng khi ứng dụng của bạn được dùng trên 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 bộ dịch vụ vị trí được hỗ trợ thông qua các lớp trong gói com.google.android.gms.location.
Xem các lớp chính:
FusedLocationProviderClient- Đây là thành phần trung tâm của khung vị trí. Sau khi tạo, bạn có thể dùng đối tượng này để yêu cầu thông tin cập nhật về vị trí và nhận thông tin vị trí đã biết mới đây nhất.
LocationRequest- Đây là một đối tượng dữ liệu chứa các tham số chất lượng dịch vụ cho các yêu cầu (khoảng thời gian cập nhật, mức độ ưu tiên và độ chính xác). Tham số này được truyền đến
FusedLocationProviderClientkhi bạn yêu cầu thông tin cập nhật vị trí. LocationCallback- Dịch vụ này dùng để nhận thông báo khi vị trí của thiết bị thay đổi hoặc không xác định được nữa. Thao tác này sẽ truyền một
LocationResult, trong đó bạn có thể lấyLocationđể lưu vào cơ sở dữ liệu của mình.
Giờ bạn đã có ý tưởng cơ bản về những việc mình sẽ làm, hãy bắt đầu với đoạn mã!
4. Thêm các tính năng về vị trí
Lớp học lập trình này tập trung vào lựa chọn vị trí phổ biến nhất: Chỉ cho phép khi dùng ứng dụng.
Để nhận thông tin cập nhật về 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 ở nền trước (có 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à cho bạn biết cách nhận thông tin cập nhật 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, mã dựa trên quyền đã được viết sẵn cho bạn. Bạn có thể bỏ qua phần này nếu đã hiểu rõ.
Sau đây là những điểm nổi bật về quyền (bạn không cần làm gì trong phần này):
- Khai báo quyền mà bạn sử dụng trong
AndroidManifest.xml. - Trước khi cố gắng truy cập vào thông tin vị trí, hãy kiểm tra xem người dùng đã cấp cho ứng dụng của bạn quyền truy cập hay chưa. Nếu ứng dụng của bạn chưa nhận được quyền, hãy yêu cầu cấp quyền truy cập.
- Xử lý lựa chọn của người dùng về quyền. (Bạn có thể thấy mã này trên
MainActivity.kt.)
Nếu tìm kiếm TODO: Step 1.0, Review Permissions trong AndroidManifest.xml hoặc MainActivity.kt, bạn sẽ thấy tất cả mã được viết cho các 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 nội dung cập nhật vị trí
Trong mô-đun base, hãy tìm TODO: Step 1.1, Review variables trong
Tệp ForegroundOnlyLocationService.kt.
Bạn không cần làm gì trong bước này. Bạn chỉ cần xem xét khối mã sau, cùng với các nhận xét, để hiểu rõ các lớp và biến chính mà bạn dùng để nhận thông tin cập nhật về 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 quá trình khởi chạy FusedLocationProviderClient
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ẽ có dạ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ề vị trí. Biến này đã được khởi tạo cho bạn, nhưng bạn cần xem lại mã để hiểu cách khởi tạo biến. Sau đó, bạn sẽ thêm một số mã vào đây để yêu cầu thông tin cập nhật về vị trí.
Khởi chạy LocationRequest
- Trong mô-đun
base, hãy tìmTODO: Step 1.3, Create a LocationRequesttrong tệpForegroundOnlyLocationService.kt. - Sau đó, hãy thêm mã sau vào phần chú thích.
Mã khởi tạo LocationRequest sẽ thêm các thông số chất lượng dịch vụ bổ sung 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.create().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 các nhận xét để hiểu cách hoạt động của từng nhận xét.
Khởi chạy LocationCallback
- Trong mô-đun
base, hãy tìmTODO: Step 1.4, Initialize the LocationCallbacktrong 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)
// 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 the 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))
}
}
}
LocationCallback mà bạn tạo ở đây là lệnh gọi lại mà FusedLocationProviderClient sẽ gọi khi có thông báo 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 đối tượng LocationResult. Sau đó, bạn thông báo cho Activity về vị trí mới bằng cách sử dụng một thông báo truyền tin cục bộ (nếu thông báo này đang hoạt động) hoặc bạn cập nhật Notification nếu dịch vụ này đang chạy dưới dạng Service trên nền trước.
- Đọc các nhận xét để hiểu chức năng của từng phần.
Đăng ký nhận thông báo khi vị trí thay đổi
Sau khi khởi chạy 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 changestrong 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.getMainLooper())
Lệnh 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 đó. Những thông số này cho FusedLocationProviderClient biết các thông số về chất lượng dịch vụ cho yêu cầu của bạn và thông số mà yêu cầu đó sẽ gọi khi có bản 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í.
Huỷ đă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í nữa, bạn cần huỷ đă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 changestrong tệpForegroundOnlyLocationService.kt. - Sau đó, hãy thêm mã sau vào phần chú thích.
// 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 một tác vụ để 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 nữa. addOnCompleteListener() cung cấp lệnh gọi lại để hoàn tất và thực thi Task.
Như ở bước trước, có thể bạn đã nhận thấy 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ể thắc mắc về thời điểm các phương thức chứa mã đăng ký/huỷ đă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 trong Android Studio và thử nút vị trí.
Bạn sẽ thấy thông tin vị trí trên màn hình đầu ra. Đây là một ứng dụng có đầy đủ chức năng cho Android 9.


5. Hỗ trợ Android 10
Trong phần này, bạn sẽ thêm tính năng hỗ trợ cho Android 10.
Ứng dụng của bạn đã đăng ký nhận thông báo về các thay đổi về vị trí, nên bạn không cần làm gì nhiều.
Trên thực tế, bạn chỉ cần chỉ định rằng dịch vụ trên nền trước được dùng cho mục đích liên quan đến vị trí.
SDK mục tiêu 29
- Trong mô-đun
base, hãy tìmTODO: Step 2.1, Target Android 10 and then Android 11.trong tệpbuild.gradle. - Thực hiện những thay đổi sau:
- Đặt
targetSdkVersionthành29.
Mã của bạn sẽ có dạng như sau:
android {
// TODO: Step 2.1, Target Android 10 and then Android 11.
compileSdkVersion 29
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ộ hoá dự án. Nhấp vào Sync Now (Đồng bộ hoá ngay).

Sau đó, ứng dụng của bạn gần như đã sẵn sàng cho Android 10.
Thêm loại dịch vụ trên nền trước
Trong Android 10, bạn phải thêm loại dịch vụ trên nền trước nếu cần quyền truy cập vào vị trí khi đang sử dụng. Trong trường hợp của bạn, thông tin này đượ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 rồi thêm mã sau vào phần tử <service>:
android:foregroundServiceType="location"
Mã của bạn sẽ có dạ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ợ thông tin vị trí trên Android 10 cho trạng thái "đang 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 trong Android Studio và thử nút vị trí.
Mọi thứ sẽ hoạt động như trước đây, nhưng giờ đây, ứng dụng sẽ hoạt động trên Android 10. Nếu trước đây bạn chưa chấp nhận cấp quyền truy cập thông tin vị trí, thì giờ đây bạn sẽ thấy màn hình cấp quyền!



6. Hỗ trợ Android 11
Trong phần này, bạn sẽ nhắm đến Android 11.
Tin vui là bạn không cần phải thay đổi bất kỳ tệp nào, ngoại trừ tệp build.gradle!
SDK mục tiêu 11
- Trong mô-đun
base, hãy tìmTODO: Step 2.1, Target SDKtrong tệpbuild.gradle. - Thực hiện những thay đổi sau:
compileSdkVersionđến30targetSdkVersionđến30
Mã của bạn sẽ có dạng như sau:
android {
TODO: Step 2.1, Target Android 10 and then Android 11.
compileSdkVersion 30
defaultConfig {
applicationId "com.example.android.whileinuselocation"
minSdkVersion 26
targetSdkVersion 30
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ộ hoá dự án. Nhấp vào Sync Now (Đồng bộ hoá ngay).

Sau đó, ứng dụng của bạn sẽ sẵn sàng cho Android 11!
Chạy ứng dụng
Chạy ứng dụng trong Android Studio rồi thử nhấp vào nút.
Mọi thứ sẽ hoạt động như trước đây, nhưng giờ đây, ứng dụng sẽ hoạt động trên Android 11. Nếu trước đây bạn chưa chấp nhận cấp quyền truy cập thông tin vị trí, thì giờ đây bạn sẽ thấy màn hình cấp quyền!


7. Chiến lược vị trí cho Android
Bằng cách kiểm tra và yêu cầu quyền truy cập thông tin vị trí theo những cách được trình bày 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 của ứng dụng đối với thông tin vị trí của 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 bảo vệ dữ liệu của người dùng, hãy xem bài viết Các phương pháp hay nhất về quyền cho ứng dụng.
Chỉ yêu cầu cấp những quyền bạn cần
Chỉ yêu cầu cấp quyền khi cần. Ví dụ:
- Đừng yêu cầu quyền truy cập thông tin vị trí khi khởi động ứng dụng, trừ phi hoàn toàn cần thiết.
- Nếu ứng dụng của bạn nhắm đến Android 10 trở lên và có một dịch vụ trên nền trước, hãy khai báo
foregroundServiceTypecủa"location"trong tệp kê khai. - Đừng yêu cầu quyền truy cập thông tin vị trí ở chế độ nền, trừ phi bạn có một trường hợp sử dụng hợp lệ như mô tả trong bài viết Quyền truy cập an toàn và minh bạch hơn vào vị trí của người dùng.
Hỗ trợ xuống cấp nhẹ nếu không được cấp quyền
Để duy trì trải nghiệm người dùng tốt, hãy thiết kế ứng dụng sao cho ứng dụng có thể xử lý một cách hiệu quả các trường hợp sau:
- Ứ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.
8. Xin chúc mừng
Bạn đã tìm hiểu cách nhận thông tin cập nhật vị trí trong Android, đồng thời ghi nhớ các phương pháp hay nhất!
Tìm hiểu thêm
- Mẫu đầy đủ để sử dụng quyền truy cập thông tin vị trí ở chế độ nền nếu bạn có một trường hợp sử dụng hợp lệ
- Yêu cầu cập nhật thông tin vị trí