Nhận thông báo cập nhật vị trí trong Android bằng Kotlin

1. Trước khi bắt đầu

Android 10 và 11 trao cho người dùng nhiều quyền kiểm soát hơn đối với ứng dụng của họ quyền truy cập vào thông tin 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 thông tin 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

6a1029175b467c77.pngS

Android 11

73d8cc88c5877c25.pngS

Trong lớp học lập trình này, bạn 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 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, bạn sẽ có một ứng dụng tuân thủ 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ề thông tin 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 thông tin vị trí của thiết bị trong khi ứng dụng đang được dùng).
  • Sửa đổi ứng dụng hiện có để hỗ trợ thêm việc yêu cầu quyền truy cập thông tin vị trí bằng cách thêm mã đăng ký và huỷ đăng ký thông tin vị trí.
  • Thêm tính năng hỗ trợ cho ứng dụng 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 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

Để bắt đầu nhanh nhất có thể, bạn có thể xây 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

Vui lòng truy cập trực tiếp vào trang GitHub.

Nếu không có Git, bạn có thể nhận dự án 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 hiện có trong Android Studio) 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 nội dung tương tự như hình bên dưới nếu đang ở chế độ xem Android. (Nếu đang ở chế độ xem Project (Dự án), bạn cần mở rộng dự án để thấy được điều tương tự.)

fa825dae96c5dc18.png

Có hai thư mục (basecomplete). Mỗi mô-đun được gọi là một "mô-đun".

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:

c2273e7835c0841a.png

Hãy đợi cho đến khi Android Studio hoàn tất việc lập chỉ mục và xây dựng 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 có nội dung Tải lại để có hiệu lực các thay đổi về ngôn ngữ? hoặc nội dung tương tự, hãy chọn .

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 thông tin vị trí trong ứng dụng. 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. Tại thời điểm bạn kết thúc 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. Mô-đun complete có thể được dùng để kiểm tra công việc của bạn hoặc để bạn tham khảo nếu gặp bất kỳ vấn đề nào.

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ý theo dõi các thay đổi về vị trí, đồng thời tự nâng lên thành một dịch vụ trên nền trước (có 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 mở rộng cho lớp Location và lưu vị trí trong SharedPreferences (lớp dữ liệu được đơn giản hoá).

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 khởi đầu

Chạy ứng dụng của bạn.

  1. 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.)
  2. Trên thanh công cụ, hãy chọn cấu hình base trong bộ chọn thả xuống rồi nhấp vào Run (Chạy):

99600e9d44527ab.png.

  1. Hãy lưu ý ứng dụng sau xuất hiện trên thiết bị:

99bf1dae46f99af3.pngs

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í.

3. Đang thêm vị trí

Khái niệm

Trọng tâm của lớp học lập trình này là hướng dẫn bạn cách nhận thông tin cập nhật vị trí để sau này hỗ trợ Android 10 và Android 11.

Tuy nhiên, trước khi bắt đầu lập trình, 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í

Bạn có thể còn nhớ 4 tuỳ chọn cho quyền truy cập thông tin vị trí từ đầu lớp học lập trình này. 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à "trong khi sử dụng" hoặc "chỉ ở nền trước" truy cập, tuỳ chọn này đã được thêm vào Android 10 và cho phép nhà phát triển chỉ truy xuất thông tin vị trí khi ứng dụng đang được dùng. Ứng dụng được coi là đang hoạt động nếu một trong hai trường hợp sau xảy ra:
  • Một hoạt động sẽ hiển thị.
  • Một dịch vụ trên nền trước đang chạy kèm theo một thông báo hiển thị liên tục.
  • Chỉ một lần
  • Đã thêm vào Android 11, chính sách này giống như chế độ Chỉ cho phép khi dùng ứng dụng, nhưng 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
  • Lựa chọn này không cho phép truy cập vào thông tin vị trí.
  • Luôn cho phép
  • Tuỳ chọn này luôn cho phép truy cập thông tin vị trí, nhưng cần có thêm quyền đối với Android 10 trở lên. Bạn cũng phải đảm bảo rằng bạn có trường hợp sử dụng hợp lệ và tuân thủ chính sách vị trí. Bạn sẽ không đề cập đến tuỳ 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 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 biết cách xử lý đúng cách thông tin vị trí mọi lúc, bao gồm cả việc truy cập thông tin vị trí ở chế độ nền, hãy tham khảo mẫu LocationUpdatesBackgroundKotlin.

Dịch vụ, dịch vụ trên nền trước và liên kết

Để hỗ trợ đầy đủ chế độ 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. 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 một Service trên nền trước rồi liên kết với một Notification.

Ngoài ra, nếu muốn sử dụng cùng một Service để yêu cầu thông tin cập nhật vị trí khi ứng dụng xuất hiện và khi người dùng rời khỏi ứng dụng, thì bạn cần liên kết/huỷ liên kết Service đó với thành phần 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ả các mã mình cần trong lớp ForegroundOnlyLocationService.kt. Bạn có thể duyệt qua lớp đó và MainActivity.kt để xem cách các lớp này hoạt động cùng nhau.

Để biết thêm thông tin, hãy xem bài viết Tổng quan về dịch vụTổng quan về dịch vụ ràng buộc.

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 người dùng cấp quyền bằng cách khai báo quyền ACCESS_COARSE_LOCATION hoặc 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í trong thời gian chạy.

Các quyền đó áp dụng cho các trường hợp Chỉ một lầnChỉ 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 nhóm các 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 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ể sử dụng vị trí này để yêu cầu thông tin cập nhật về vị trí và lấy thông tin vị trí xác định được gần đây nhất.
  • LocationRequest
  • Đây là đối tượng dữ liệu chứa các tham số về 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). Thông tin này được chuyển đến FusedLocationProviderClient khi bạn yêu cầu thông tin cập nhật về vị trí.
  • LocationCallback
  • Thông tin này dùng để nhận thông báo khi vị trí của thiết bị đã thay đổi hoặc không thể xác định được nữa. Giá trị này được truyền qua LocationResult để bạn có thể lấy Location để lưu vào cơ sở dữ liệu.

Bây giờ, bạn đã có ý tưởng cơ bản về những việc bạn sẽ làm, hãy bắt đầu với mã!

4. Thêm tính năng 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 rõ ràng 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à hướng dẫn 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 bạn đã nắm 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):

  1. Khai báo quyền bạn sử dụng trong AndroidManifest.xml.
  2. 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 làm như vậy chưa. Nếu ứng dụng của bạn chưa được cấp quyền, hãy yêu cầu cấp quyền truy cập.
  3. Xử lý lựa chọn về 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, bạn sẽ thấy tất cả mã được viết cho 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 vài mã vị trí.

Xem xét các biến chính cần thiết cho việc cập nhật vị trí

Trong mô-đun base, hãy tìm TODO: Step 1.1, Review variables trong phần

Tệp ForegroundOnlyLocationService.kt.

Bạn không cần làm gì trong bước này. Bạn chỉ cần xem khối mã dưới đây, cùng với nhận xét, để hiểu các lớp và biến chính mà bạn 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 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ị 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 này. Bạn sẽ thêm một số mã tại đây sau để yêu cầu thông tin cập nhật về vị trí.

Khởi chạy LocationRequest

  1. Trong mô-đun base, hãy tìm TODO: Step 1.3, Create a LocationRequest trong tệp ForegroundOnlyLocationService.kt.
  2. Sau đó, hãy thêm mã sau vào phần chú thích.

Mã khởi chạy 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
}
  1. Hãy đọ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 LocationCallback

  1. Trong mô-đun base, hãy tìm TODO: Step 1.4, Initialize the LocationCallback trong tệp ForegroundOnlyLocationService.kt.
  2. 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 bạn tạo ở đây là lệnh gọi lại mà FusedLocationProviderClient sẽ gọi khi có thông tin cập nhật vị trí mới.

Trong lệnh gọi lại, trước tiên, bạn nhận thông tin 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 thông báo truyền tin cục bộ (nếu vị trí đ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.

  1. Hãy đọc qua nhận xét để hiểu chức năng của từng phần.

Đăng ký nhận thông báo về các thay đổi về vị trí

Giờ đây, 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.

  1. Trong mô-đun base, hãy tìm Step 1.5, Subscribe to location changes trong tệp ForegroundOnlyLocationService.kt.
  2. 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())

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í.

Bạn có thể nhận ra LocationRequestLocationCallback mà bạn đã xác định trước đó. Các chế độ cài đặt đó cho FusedLocationProviderClient biết các tham số chất lượng dịch vụ dành cho yêu cầu của bạn và nội dung nên 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 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 về vị trí

Bạn cần phải huỷ đăng ký nhận thông tin cập nhật 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.

  1. Trong mô-đun base, hãy tìm TODO: Step 1.6, Unsubscribe to location changes trong tệp ForegroundOnlyLocationService.kt.
  2. Hãy thêm mã dưới đây 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() sẽ 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 thành và thực thi Task.

Tương tự như bước trước, bạn có thể 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 khi nào các phương thức chứa mã đăng ký/huỷ đăng ký được gọi. Lệnh này đượ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 tệp này, hãy xem lớp MainActivity.kt.

Chạy ứng dụng

Chạy ứng dụng trong Android Studio rồi dùng 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 dành cho Android 9.

2ae45c4e297e3681.pngs

d66089bfb532e993.png

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 các thay đổi về vị trí, vì vậy không cần phải 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ủa bạn sẽ được dùng cho mục đích truy cập thông tin vị trí.

SDK mục tiêu 29

  1. Trong mô-đun base, hãy tìm TODO: Step 2.1, Target Android 10 and then Android 11. trong tệp build.gradle.
  2. Thực hiện các thay đổi sau:
  3. Đặt targetSdkVersion thành 29.

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 thao tác xong, bạn sẽ được yêu cầu đồng bộ hoá dự án. Nhấp vào Sync Now (Đồng bộ hoá ngay).

153f70847e0ec320.pngS

Sau khoảng thời gian đó, ứ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

Trên Android 10, bạn bắt buộc phải thêm 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í trong khi sử dụng. Trong trường hợp của bạn, phương thức này đang được dùng để nhận 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 ở chế độ "trong khi sử dụng" bằng cách làm theo các phương pháp hay nhất về thông tin vị trí trong Android.

Chạy ứng dụng

Chạy ứng dụng trong Android Studio rồi dùng thử nút vị trí.

Mọi thứ vốn dĩ sẽ hoạt động như trước đây, nhưng giờ thì mọi thứ đã 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 cấp quyền!

6a1029175b467c77.pngS

c7c1d226e49a121.png

39a262b66a275f66.pngS

6. Hỗ trợ Android 11

Trong phần này, bạn nhắm đến Android 11.

Tin vui là bạn không cần thực hiện thay đổi đối với bất kỳ tệp nào ngoại trừ tệp build.gradle!

SDK mục tiêu 11

  1. Trong mô-đun base, hãy tìm TODO: Step 2.1, Target SDK trong tệp build.gradle.
  2. Thực hiện các thay đổi sau:
  3. compileSdkVersion đến 30
  4. targetSdkVersion đến 30

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 thao tác xong, bạn sẽ được yêu cầu đồng bộ hoá dự án. Nhấp vào Sync Now (Đồng bộ hoá ngay).

153f70847e0ec320.pngS

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 trong Android Studio rồi thử nhấp vào nút này.

Mọi thứ vốn dĩ sẽ hoạt động như trước đây, nhưng giờ thì mọi thứ đã 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 cấp quyền!

73d8cc88c5877c25.pngS

cc98fac6e089bc4.png

7. Chiến lược vị trí dành 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 cách nêu 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 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 liên quan đến quyền truy cập thông tin vị trí. Để biết thêm thông tin về cách duy trì 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ấp các 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 thực sự cần thiết.
  • Nếu ứng dụng của bạn nhắm đến Android 10 trở lên và bạn có một dịch vụ trên nền trước, hãy khai báo foregroundServiceType của "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ừ 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 hơn và minh bạch hơn vào thông tin 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 tốt cho người dùng, hãy thiết kế ứng dụng của bạn sao cho ứng dụng có thể xử lý linh hoạt các tình huống 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 bằng cách ghi nhớ các phương pháp hay nhất!

Tìm hiểu thêm