Giảm thiểu các yêu cầu cấp quyền

Trước khi bạn khai báo quyền trong ứng dụng của mình, hãy cân nhắc xem việc đó có cần thiết hay không. Mỗi khi người dùng dùng thử một tính năng ứng dụng yêu cầu quyền khi bắt đầu chạy, ứng dụng của bạn phải làm gián đoạn công việc của người dùng để đưa ra yêu cầu cấp quyền. Sau đó, người dùng phải đưa ra quyết định. Nếu người dùng không hiểu vì sao ứng dụng của bạn yêu cầu một quyền cụ thể, họ có thể từ chối cấp quyền hoặc thậm chí gỡ cài đặt ứng dụng của bạn.

Cân nhắc xem một ứng dụng đã cài đặt khác có thể thực hiện chức năng thay cho ứng dụng của bạn hay không. Trong những trường hợp này, hãy dùng một ý định để uỷ quyền cho ứng dụng khác thực hiện nhiệm vụ. Nhờ đó, bạn không cần khai báo các quyền cần thiết vì ứng dụng kia sẽ khai báo các quyền đó.

Lựa chọn thay thế cho việc khai báo quyền

Phần này mô tả một số trường hợp sử dụng mà ứng dụng của bạn có thể thực hiện mà không cần khai báo yêu cầu cấp bất kỳ quyền nào.

Hiển thị địa điểm lân cận

Ứng dụng của bạn có thể cần biết vị trí ước chừng của người dùng. Điều này rất hữu ích khi hiển thị thông tin nhận biết vị trí, chẳng hạn như nhà hàng lân cận.

Một số trường hợp sử dụng chỉ yêu cầu ước đoán sơ bộ về vị trí của thiết bị. Trong những trường hợp này, hãy thực hiện một trong các bước sau, tuỳ thuộc vào tần suất ứng dụng của bạn cần thông tin nhận biết vị trí:

  • Nếu ứng dụng của bạn thường xuyên cần thông tin vị trí, hãy khai báo quyền ACCESS_COARSE_LOCATION. Quyền này cung cấp thông tin ước đoán về vị trí thiết bị từ các dịch vụ vị trí, như mô tả trong tài liệu về độ chính xác của vị trí ước chừng.
  • Nếu ứng dụng của bạn cần thông tin vị trí ít thường xuyên hơn hoặc chỉ cần một lần, hãy cân nhắc việc yêu cầu người dùng nhập địa chỉ hoặc mã bưu chính.

Các trường hợp sử dụng khác yêu cầu ước đoán vị trí thiết bị chính xác hơn. Những tình huống đó là lần duy nhất bạn có thể khai báo quyền ACCESS_FINE_LOCATION.

Chụp ảnh

Người dùng có thể chụp ảnh trong ứng dụng của bạn bằng ứng dụng máy ảnh cài sẵn trên hệ thống.

Trong trường hợp này, không được khai báo quyền CAMERA. Thay vào đó, hãy gọi thao tác theo ý định ACTION_IMAGE_CAPTURE.

Quay video

Người dùng có thể quay video trong ứng dụng của bạn bằng ứng dụng máy ảnh cài sẵn trên hệ thống.

Trong trường hợp này, không được khai báo quyền CAMERA. Thay vào đó, hãy gọi thao tác theo ý định ACTION_VIDEO_CAPTURE.

Mở nội dung phương tiện mà ứng dụng của bạn đã tạo

Ứng dụng của bạn có thể hiển thị nội dung phương tiện, chẳng hạn như ảnh hoặc video, mà người dùng đã tạo trong khi sử dụng ứng dụng. Trong trường hợp này, bạn không cần sử dụng quyền READ_EXTERNAL_STORAGE trên các thiết bị chạy Android 10 (API cấp 29) trở lên, miễn là ứng dụng của bạn nhắm mục tiêu đến Android 10 trở lên. Nếu ứng dụng của bạn nhắm mục tiêu đến Android 10, hãy chọn không sử dụng bộ nhớ có giới hạn.

Để tương thích với các thiết bị cũ, hãy khai báo quyền READ_EXTERNAL_STORAGE và đặt android:maxSdkVersion thành 28.

Tìm tệp thuộc một trong các bộ sưu tập mà kho phương tiện biết rõ sau đây:

Sử dụng ContentResolver để truy vấn nội dung phương tiện trực tiếp từ kho phương tiện thay vì cố tự khám phá nội dung phương tiện.

Mở tài liệu

Ứng dụng của bạn có thể hiển thị các tài liệu mà người dùng đã tạo, trong ứng dụng của bạn hoặc trong một ứng dụng khác. Ví dụ phổ biến là tệp văn bản.

Trong trường hợp này, bạn không cần sử dụng quyền READ_EXTERNAL_STORAGE trên các thiết bị chạy Android 10 trở lên, miễn là ứng dụng của bạn nhắm mục tiêu đến Android 10 trở lên. Nếu ứng dụng của bạn nhắm mục tiêu đến Android 10, hãy chọn không sử dụng bộ nhớ có giới hạn.

Để tương thích với các thiết bị cũ, hãy khai báo quyền READ_EXTERNAL_STORAGE và đặt android:maxSdkVersion thành 28.

Tuỳ thuộc vào ứng dụng đã tạo tài liệu, hãy làm theo một trong những cách sau:

Xác định thiết bị đang chạy một phiên bản ứng dụng của bạn

Phiên bản cụ thể của ứng dụng có thể cần biết ứng dụng đang chạy trên thiết bị nào. Thông tin này sẽ hữu ích đối với các ứng dụng có lựa chọn ưu tiên hoặc thông báo riêng dành cho thiết bị, chẳng hạn như các danh sách phát khác nhau dành cho thiết bị TV và thiết bị có thể đeo.

Trong trường hợp này, bạn không được truy cập trực tiếp vào IMEI của thiết bị. Trên thực tế, kể từ Android 10, bạn không thể làm như vậy. Thay vào đó, hãy thực hiện một trong những thao tác sau:

  • Nhận giá trị nhận dạng thiết bị duy nhất cho phiên bản ứng dụng bằng cách sử dụng thư viện Mã thực thể.
  • Tạo giá trị nhận dạng của riêng bạn trong phạm vi bộ nhớ của ứng dụng. Sử dụng các hàm hệ thống cơ bản, chẳng hạn như randomUUID().

Ghép nối với một thiết bị qua Bluetooth

Ứng dụng của bạn có thể cung cấp trải nghiệm nâng cao bằng cách chuyển dữ liệu sang một thiết bị khác qua Bluetooth.

Để hỗ trợ chức năng này, không khai báo quyền ACCESS_FINE_LOCATION, ACCESS_COARSE_LOCATIION hoặc BLUETOOTH_ADMIN. Thay vào đó, hãy sử dụng tính năng ghép nối thiết bị đồng hành.

Tạm dừng nội dung phương tiện khi ứng dụng của bạn bị gián đoạn

Nếu người dùng nhận được cuộc gọi điện thoại hoặc nếu có đồng hồ báo thức do người dùng định cấu hình, thì ứng dụng của bạn nên tạm dừng mọi hoạt động phát nội dung phương tiện cho đến khi ứng dụng của bạn lấy lại quyền phát âm thanh.

Để hỗ trợ chức năng này, không khai báo quyền READ_PHONE_STATE. Thay vào đó, hãy triển khai trình xử lý sự kiện onAudioFocusChange(). Trình xử lý này sẽ tự động chạy khi hệ thống thay đổi quyền phát âm thanh. Tìm hiểu thêm về cách triển khai quyền phát âm thanh.

Lọc các cuộc gọi điện thoại

Để giảm thiểu tình trạng gián đoạn không cần thiết cho người dùng, ứng dụng của bạn có thể lọc các cuộc gọi điện thoại để tìm cuộc gọi không mong muốn.

Để hỗ trợ chức năng này, không khai báo quyền READ_PHONE_STATE. Thay vào đó, hãy sử dụng API CallScreeningService.

Gọi điện thoại

Ứng dụng của bạn có thể cung cấp khả năng gọi điện thoại bằng cách nhấn vào thông tin liên hệ.

Để hỗ trợ chức năng này, hãy sử dụng thao tác theo ý định ACTION_DIAL thay vì thao tác ACTION_CALL. ACTION_CALL yêu cầu quyền khi cài đặt CALL_PHONE. Quyền này ngăn các thiết bị không thể thực hiện lệnh gọi (chẳng hạn như một số máy tính bảng) cài đặt ứng dụng của bạn.

Truy cập vào tin nhắn SMS

Ứng dụng của bạn có thể cần quyền truy cập vào tin nhắn SMS, chẳng hạn như để nhận mã xác thực bảo vệ người dùng khỏi hành vi gian lận.

Để hỗ trợ chức năng này, nếu ứng dụng của bạn nhắm đến Android 8.0 (API cấp 26) trở lên, không nên yêu cầu cấp quyền READ_SMS trong quá trình xác minh thông tin xác thực của người dùng. Thay vào đó, hãy tạo mã thông báo dành riêng cho ứng dụng bằng createAppSpecificSmsToken(), sau đó chuyển mã thông báo này sang một ứng dụng hoặc dịch vụ khác có khả năng gửi tin nhắn SMS xác minh.