Để cải thiện chất lượng ứng dụng và bảo vệ quyền riêng tư của người dùng, bạn nên giảm thiểu việc sử dụng quyền trong ứng dụng. Điều này giúp người dùng khám phá và dùng các ứng dụng chất lượng cao, đem lại một môi trường an toàn và bảo mật cho họ.
Việc yêu cầu cấp quyền từ người dùng sẽ làm gián đoạn luồng người dùng và họ có thể từ chối yêu cầu của bạn. Ngoài ra, mỗi lần khai báo một quyền mới, bạn phải xem lại cách ứng dụng yêu cầu và chia sẻ dữ liệu người dùng. Một số API và quyền truy cập thông tin đặc biệt nhạy cảm yêu cầu bạn phải công bố thông tin trong ứng dụng về việc truy cập, thu thập, sử dụng và chia sẻ dữ liệu.
Có nhiều cách khác để giảm thiểu việc sử dụng quyền:
- Khai báo các quyền cung cấp thông tin vị trí tương đối thay vì thông tin vị trí chính xác nếu ứng dụng của bạn chỉ cần thông tin vị trí ước chừng.
- Gọi các API cho phép ứng dụng của bạn thực hiện chức năng mong muốn mà không cần khai báo quyền.
- Gọi các ý định hoặc trình xử lý sự kiện cụ thể để thực hiện chức năng, thay vì khai báo quyền.
- Hệ thống này cung cấp các hợp đồng tích hợp cho những hoạt động khác nhau của tệp và cũng hỗ trợ các hợp đồng tuỳ chỉnh.
Nếu bạn phải khai báo quyền, hãy luôn tôn trọng quyết định của người dùng và đưa ra cách xuống cấp nhẹ cho trải nghiệm ứng dụng.
Trang 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 thông tin ướ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
.
Tạo và truy cập vào các tệp
Android cho phép bạn tạo và truy cập vào các tệp mà không cần khai báo quyền nào liên quan đến bộ nhớ hoặc cảm biến.
Mở tệp nội dung nghe nhìn
Ứng dụng của bạn có thể cho phép người dùng chọn trong số các ảnh và video của họ, chẳng hạn như tệp đính kèm trong tin nhắn hoặc ảnh hồ sơ.
Để hỗ trợ chức năng này, hãy sử dụng công cụ chọn ảnh. Công cụ chọn ảnh không yêu cầu quyền nào khi bắt đầu chạy. Khi người dùng tương tác với công cụ chọn ảnh để chọn ảnh hoặc video cần chia sẻ với ứng dụng, hệ thống sẽ cấp quyền đọc tạm thời cho URI liên kết với các tệp nội dung nghe nhìn đã chọn.
Nếu ứng dụng của bạn cần truy cập vào các tệp nội dung nghe nhìn mà không cần sử dụng công cụ chọn ảnh, thì bạn không cần khai báo bất kỳ quyền truy cập bộ nhớ nào:
- Nếu bạn truy cập vào các tệp nội dung nghe nhìn mà ứng dụng của bạn đã tạo, thì ứng dụng của bạn đã có quyền truy cập vào những tệp đó trong kho lưu trữ nội dung nghe nhìn.
- Nếu bạn truy cập vào các tệp nội dung nghe nhìn mà các ứng dụng khác đã tạo, hãy sử dụng Storage Access Framework (Khung về quyền truy cập vào bộ nhớ).
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, chỉ khai báo READ_EXTERNAL_STORAGE
để biết khả năng tương thích với các thiết bị cũ. Đặ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:
- Nếu người dùng đã tạo tài liệu trong ứng dụng của bạn, hãy truy cập trực tiếp vào tài liệu đó.
- Nếu người dùng đã tạo tài liệu trong một ứng dụng khác, hãy sử dụng Storage Access Framework (Khung về quyền truy cập vào bộ nhớ).
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 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 khai báo quyền CAMERA
. Thay vào đó, hãy gọi thao tác theo ý định ACTION_VIDEO_CAPTURE
.
Xác định thiết bị đang chạy một thực thể của ứ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ự động nhập số thẻ thanh toán
Dịch vụ Google Play cung cấp một thư viện cho phép bạn tự động nhập số thẻ thanh toán. Thay vì khai báo quyền CAMERA
, bạn có thể sử dụng thư viện nhận dạng thẻ ghi nợ và thẻ tín dụng.
Quản lý cuộc gọi điện thoại và tin nhắn văn bản
Các dịch vụ của Android và Google Play cung cấp thư viện cho phép bạn quản lý các cuộc gọi điện thoại và tin nhắn văn bản mà không cần khai báo quyền nào liên quan đến cuộc gọi điện thoại hoặc tin nhắn SMS.
Tự động nhập mật mã một lần
Để đơn giản hoá quy trình xác thực hai yếu tố, ứng dụng của bạn có thể tự động nhập mật mã một lần được gửi đến thiết bị của người dùng để xác minh danh tính của họ.
Để hỗ trợ chức năng này trên các thiết bị do dịch vụ Google Play cung cấp, không khai báo quyền READ_SMS
. Thay vào đó, hãy sử dụng SMS Retriever API.
Trên các thiết bị khác, nếu ứng dụng của bạn nhắm đến Android 8.0 (API cấp 26) trở lên, hãy tạo một mã thông báo dành riêng cho ứng dụng bằng createAppSpecificSmsToken()
. Truyề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.
Tự động nhập số điện thoại của người dùng
Để cung cấp khả năng hỗ trợ hoặc bán hàng hiệu quả hơn, ứng dụng của bạn có thể cho phép người dùng tự động nhập số điện thoại trên thiết bị của họ.
Để hỗ trợ chức năng này trên các thiết bị do Dịch vụ Google Play cung cấp, không khai báo quyền READ_PHONE_STATE
. Thay vào đó, hãy sử dụng thư viện Gợi ý số điện thoại.
Lọ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 cuộc gọi (chẳng hạn như một số dòng máy tính bảng) cài đặt ứng dụng của bạn.
Tạm dừng nội dung nghe nhì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.
Quét mã vạch
Android hỗ trợ sẵn Google Code Scanner API (API Trình quét mã của Google – do Dịch vụ Google Play cung cấp), cho phép bạn giải mã mã vạch mà không cần khai báo quyền sử dụng máy ảnh. API này giúp bảo vệ quyền riêng tư của người dùng và giảm thiểu việc tạo giao diện người dùng tuỳ chỉnh cho trường hợp sử dụng quét mã vạch.
API quét mã vạch và chỉ trả về kết quả quét cho ứng dụng của bạn. Hình ảnh được xử lý ngay trên thiết bị và Google sẽ không lưu trữ bất kỳ dữ liệu hoặc kết quả quét nào.
Nếu ứng dụng của bạn cần hỗ trợ các trường hợp sử dụng hoặc định dạng mã vạch phức tạp, hoặc nếu ứng dụng bắt buộc phải có giao diện người dùng tuỳ chỉnh, hãy sử dụng API quét mã vạch của Bộ công cụ học máy.
Đặt lại quyền không dùng đến
Android cung cấp nhiều cách để đặt lại quyền không dùng đến khi bắt đầu chạy về trạng thái mặc định là bị từ chối:
Đọc hướng dẫn thiết kế.
Yêu cầu quyền khi bắt đầu chạy
Sau khi bạn đánh giá rằng ứng dụng của mình cần khai báo và yêu cầu các quyền khi bắt đầu chạy, hãy làm theo một quy trình cụ thể để thực hiện việc này.
Đọc hướng dẫn thiết kế.
Giải thích lý do ứng dụng của bạn cần quyền
Việc sử dụng requestPermissions()
sẽ hiển thị một hộp thoại cho biết ứng dụng của bạn muốn dùng những quyền nào nhưng không giải thích lý do. Điều này có thể khiến người dùng thấy khó hiểu.
Để biết thêm thông tin cũng như các đề xuất về cách thức và thời điểm hiển thị hộp thoại này, hãy đọc hướng dẫn thiết kế.
Xử lý việc từ chối cấp quyền
Ứng dụng của bạn phải giúp người dùng hiểu được hệ quả của việc từ chối cấp quyền trước và sau khi họ chọn làm vậy.
Đọc hướng dẫn thiết kế.