Mọi ứng dụng android đều chạy trong một hộp cát bị giới hạn về quyền truy cập. Nếu ứng dụng của bạn cần sử dụng tài nguyên hoặc thông tin bên ngoài hộp cát, thì bạn có thể khai báo quyền chi bắt đầu chạy và thiết lập yêu cầu cấp quyền truy cập này. Các bước này là một phần trong quy trình sử dụng quyền .
Lưu ý: Một số quyền giúp bảo vệ quyền truy cập vào các tài nguyên hệ thống đặc biệt nhạy cảm hoặc không trực tiếp liên quan đến quyền riêng tư của người dùng. Đối với các quyền đặc biệt này, hãy làm theo một quy trình khác .
Nếu bạn khai báo bất kỳ quyền nguy hiểm nào và ứng dụng của bạn được cài đặt trên thiết bị chạy android 6.0 ( API cấp twenty-three ) trở lên, bạn phải yêu cầu các quyền nguy hiểm đó trong thời gian chạy bằng cách làm theo các bước trong hướng dẫn này.
Nếu bạn không khai báo bất kỳ quyền nguy hiểm nào hoặc nếu ứng dụng được cài đặt trên thiết bị chạy android 5.1 ( API cấp twenty-two ) trở xuống, thì các quyền đó sẽ tự động được cấp và bạn không cần hoàn thành bất kỳ bước nào còn lại trên trang này .
Nguyên tắc cơ bản
Nguyên tắc cơ bản để yêu cầu cấp quyền trong thời gian chạy bao gồm :
- Yêu cầu cấp quyền trong bối cảnh khi người dùng bắt đầu tương tác với tính năng yêu cầu quyền đó.
- Không chặn người dùng. Luôn cung cấp tuỳ chọn huỷ quy trình giao diện hướng dẫn người dùng, chẳng hạn như quy trình giải thích lý do yêu cầu cấp quyền.
- Nếu người dùng từ chối hoặc thu hồi quyền mà một tính năng cần đến, nên xuống cấp nhẹ với ứng dụng để người dùng tiếp tục dùng ứng dụng, có thể là bằng cách tắt tính năng yêu cầu cấp quyền đó.
- Không giả định bất kỳ hành vi hệ thống nào. Ví dụ: không giả định rằng quyền xuất hiện trong cùng một nhóm quyền. Nhóm quyền chỉ giúp hệ thống giảm thiểu tối đa số lượng hộp thoại hệ thống hiển thị với người dùng khi ứng dụng yêu cầu cấp quyền có liên quan chặt chẽ.
Quy trình yêu cầu cấp quyền
Trước chi bạn khai báo và yêu cầu cấp quyền chi bắt đầu chạy trong ứng dụng, hãy đánh giá xem liệu ứng dụng có cần làm như vậy hay không. Bạn có thể thực hiện nhiều trường hợp sử dụng trong ứng dụng của mình, chẳng hạn như chụp ảnh, tạm dừng việc phát nội droppings nghe nhìn và hiển thị quảng cáo phù hợp mà không cần khai báo bất kỳ quyền nào .
Nếu bạn kết luận rằng ứng dụng cần khai báo và yêu cầu cấp quyền chi bắt đầu chạy, thì hoàn tất các bước sau :
- Trong tệp kê khai của ứng dụng, khai báo các quyền mà ứng dụng của bạn có thể yêu cầu.
- Thiết kế trải nghiệm người dùng trên ứng dụng của bạn để hành động cụ thể trong ứng dụng liên kết với các quyền cụ thể khi bắt đầu chạy. Cho người dùng biết những hành động nào có thể yêu cầu họ cấp quyền cho ứng dụng truy cập vào dữ liệu riêng tư của người dùng.
- Chờ người dùng gọi ra nhiệm vụ hoặc thao tác trong ứng dụng mà yêu cầu quyền truy cập vào dữ liệu riêng tư của người dùng. Tại thời điểm đó, ứng dụng của bạn có thể yêu cầu cấp quyền khi bắt đầu chạy cần đến để truy cập dữ liệu đó.
- Kiểm tra xem liệu người dùng đã cấp quyền chi bắt đầu chạy mà ứng dụng của bạn yêu cầu chưa. Nếu có, ứng dụng của bạn có thể truy cập dữ liệu riêng tư của người dùng. Nếu không, chuyển sing bước tiếp theo .
Bạn phải kiểm tra xem liệu mình có quyền hay không mỗi lần thực hiện một thao tác yêu cầu quyền đó .- Kiểm tra liệu ứng dụng của bạn có cho biết lý do hay không, giải thích với người dùng tại sao ứng dụng của bạn cần người dùng cấp quyền cụ thể chi bắt đầu chạy. Nếu hệ thống xác định rằng ứng dụng không nên cho biết lý do, thì tiếp tục thực hiện ngay bước tiếp theo mà không cần hiển thị thành phần giao diện người dùng .
Tuy nhiên, nếu hệ thống xác định rằng ứng dụng của bạn cần cho biết lý practice, thì nên trình bày lý do với người dùng trong một thành phần trên giao diện người dùng. Trong lý make này, hãy giải thích rõ ràng ứng dụng của bạn đang cố truy cập vào dữ liệu nào và ứng dụng cung cấp quyền lợi gì cho người dùng nếu họ cấp quyền chi bắt đầu chạy. Sau chi người dùng xác nhận lý do, tiếp tục chuyển sing bước tiếp theo .- Yêu cầu cấp quyền chi bắt đầu chạy mà ứng dụng của bạn cần để truy cập vào dữ liệu riêng tư của người dùng. Hệ thống sẽ hiển thị lời nhắc cấp quyền chi bắt đầu chạy, chẳng hạn như lời nhắc xuất hiện trên trang tổng quan về cấp quyền .
- Kiểm tra phản hồi của người dùng, xem họ đã chọn cấp hay từ chối cấp quyền chi bắt đầu chạy .
- Nếu người dùng đã cấp quyền cho ứng dụng, bạn có thể truy cập vào dữ liệu riêng tư của người dùng. Thay vào đó, nếu người dùng từ chối cấp quyền, hãy xuống cấp nhẹ cho trải nghiệm ứng dụng của bạn để cung cấp chức năng cho người dùng chi không có thông canister được bảo vệ bằng quyền đó .
Hình one minh hoạ quy trình làm việc và tập hợp các quyết định liên quan đến quy trình này :
Hình 1. Sơ đồ cho thấy quy trình khai báo và yêu cầu cấp quyền khi bắt đầu chạy trên Android.Xác định xem liệu ứng dụng của bạn đã được cấp quyền hay chưa
Để kiểm tra xem người dùng đã cấp cho ứng dụng một quyền cụ thể hay chưa, hãy chuyển quyền đó vào phương thức
ContextCompat.checkSelfPermission()
. Phương thức này trả vềPERMISSION_GRANTED
hoặcPERMISSION_DENIED
, tuỳ thuộc vào việc ứng dụng của bạn có quyền hay không .Giải thích vì sao ứng dụng của bạn cần quyền truy cập
Hộp thoại cấp quyền được hệ thống hiển thị chi bạn gọi
requestPermissions()
cho biết ứng dụng muốn có quyền gì, nhưng không cho biết lý serve vì sao. Trong một số trường hợp, người dùng có thể thấy khó hiểu. Nên giải thích cho người dùng tại sao ứng dụng muốn có quyền trước chi bạn gọirequestPermissions()
.
Nghiên cứu cho thấy người dùng cảm thấy thoải mái hơn nhiều với các yêu cầu cấp quyền nếu họ biết lý bash vì sao ứng dụng cần những quyền đó, chẳng hạn như việc quyền có cần thiết để hỗ trợ một tính năng cốt lõi của ứng dụng hay cho mục đích quảng cáo không. suffice đó, nếu bạn chỉ sử dụng một phần các lệnh gọi API thuộc một nhóm quyền, thì việc này sẽ giúp bạn liệt kê rõ ràng những quyền bạn đang sử dụng và lý do bạn làm như vậy. Ví dụ : nếu bạn chỉ sử dụng vị trí gần đúng, hãy cho người dùng biết điều này trong phần mô tả ứng dụng hoặc trong các bài viết trợ giúp về ứng dụng của bạn .
Trong một số tình huống nhất định, việc cho người dùng biết về quyền truy cập dữ liệu nhạy cảm theo thời gian thực cũng sẽ rất hữu ích. Ví dụ : nếu đang truy cập vào máy ảnh hoặc micrô, bạn nên cho người dùng biết bằng biểu tượng thông báo ở một nơi nào đó trong ứng dụng hoặc trong khay thông báo ( nếu ứng dụng đang chạy ở chế độ nền ), để không mang lại cảm giác là bạn đang lén lút thu thập dữ liệu .
Lưu ý: Kể từ android twelve ( cấp độ API thirty-one ), các chỉ báo quyền riêng tư sẽ thông báo cho người dùng bất cứ chi nào ứng dụng truy cập vào micrô hoặc máy ảnh .
Cuối cùng, nếu cần một quyền để khiến tính năng nào đó trong ứng dụng hoạt động, nhưng người dùng lại không rõ lý act, hãy tìm cách cho người dùng biết tại sao bạn cần các quyền truy cập thông tin nhạy cảm nhất .
Nếu phương thứcContextCompat.checkSelfPermission()
trả vềPERMISSION_DENIED
, hãy gọishouldShowRequestPermissionRationale()
. Nếu phương thức này trả vềtrue
, hãy hiển thị giao diện hướng dẫn người dùng cho người dùng. Trong giao diện người dùng này, hãy mô tả lý perform tính năng, mà người dùng muốn bật, cần có một quyền cụ thể .
Ngoài right ascension, nếu ứng dụng của bạn yêu cầu một quyền liên quan đến vị trí, micrô hoặc máy ảnh, hãy cân nhắc giải thích lý make ứng dụng của bạn cần quyền truy cập vào thông tin này .Yêu cầu cấp quyền
Hãy yêu cầu cấp quyền sau chi người dùng xem giao diện hướng dẫn người dùng hoặc giá trị trả về của
shouldShowRequestPermissionRationale()
cho biết bạn không cần hiển thị giao diện hướng dẫn người dùng. Người dùng sẽ thấy hộp thoại cấp quyền của hệ thống, trong đó họ có thể chọn có cấp một quyền cụ thể cho ứng dụng của bạn hay không .
Để làm điều này, hãy sử dụng hợp đồngRequestPermission
, nằm trong thư viện AndroidX, trong đó bạn cho phép hệ thống quản lý mã yêu cầu cấp quyền cho bạn. Vì việc sử dụng hợp đồngRequestPermission
giúp đơn giản hoá logic, perform vậy, bạn nên dùng giải pháp này chi có thể. Tuy nhiên, nếu cần, bạn cũng có thể tự quản lý mã yêu cầu trong yêu cầu cấp quyền và đưa mã yêu cầu này vào logic gọi lại quyền của mình .Cho phép hệ thống quản lý mã yêu cầu cấp quyền
Để cho phép hệ thống quản lý mã yêu cầu được liên kết với yêu cầu cấp quyền, thêm các phần phụ thuộc có trong những thư viện sau vào tệp
build.gradle
của mô-đun :
androidx.activity
, phiên bản 1.2.0 trở lênandroidx.fragment
, phiên bản 1.3.0 trở lênSau đó, bạn có thể sử dụng một trong các lớp sau :
- Để yêu cầu cấp một quyền đơn lẻ, sử dụng
RequestPermission
.- Để yêu cầu cấp nhiều quyền một lúc, sử dụng
RequestMultiplePermissions
.Các bước sau đây cho biết cách sử dụng hợp đồng
RequestPermission
. Quy trình gần giống với quy trình cho hợp đồngRequestMultiplePermissions
.
- Trong hoạt động hoặc logic khởi chạy mảnh của bạn, chuyển việc triển khai
ActivityResultCallback
vào lệnh gọi đếnregisterForActivityResult()
.ActivityResultCallback
xác định cách ứng dụng của bạn xử lý phản hồi của người dùng với yêu cầu cấp quyền .
Duy trì tham chiếu đến giá trị trả về củaregisterForActivityResult()
, thuộc loạiActivityResultLauncher
.- Để hiển thị hộp thoại cấp quyền của hệ thống chi cần, gọi phương thức
launch()
trên thực thể củaActivityResultLauncher
mà bạn đã lưu ở bước trước .
Sau chilaunch()
được gọi, hộp thoại cấp quyền của hệ thống sẽ xuất hiện. chi người dùng chọn, hệ thống sẽ không đồng bộ gọi cách triển khaiActivityResultCallback
đã được bạn xác định ở bước trước .
Lưu ý: Ứng dụng của bạn không thể tuỳ chỉnh hộp thoại xuất hiện chi bạn gọilaunch()
. Để cung cấp thêm thông tin hoặc ngữ cảnh đến người dùng, hãy thay đổi giao diện người dùng của ứng dụng để người dùng dễ dàng hiểu lý do vì sao một tính năng trong ứng dụng của bạn cần một quyền cụ thể. Ví dụ : bạn có thể thay đổi văn bản trong nút để bật tính năng này .
Ngoài right ascension, văn bản trong hộp thoại cấp quyền của hệ thống tham chiếu đến nhóm quyền được liên kết với quyền mà bạn đã yêu cầu. Nhóm quyền này được thiết kế để giúp hệ thống dễ dùng và ứng dụng của bạn không nên dựa vào các quyền nằm bên trong hoặc bên ngoài một nhóm quyền cụ thể .Đoạn mã sau đây cho thấy cách xử lý phản hồi cấp quyền :
Kotlin
// Register the permissions callback, which handles the user's response to the // system permissions dialog. Save the return value, an instance of // ActivityResultLauncher. You can use either a val, as shown in this snippet, // or a lateinit var in your onAttach() or onCreate() method. val requestPermissionLauncher = registerForActivityResult(RequestPermission() ) { isGranted: Boolean -> if (isGranted) { // Permission is granted. Continue the action or workflow in your // app. } else { // Explain to the user that the feature is unavailable because the // feature requires a permission that the user has denied. At the // same time, respect the user's decision. Don't link to system // settings in an effort to convince the user to change their // decision. } }Java
// Register the permissions callback, which handles the user's response to the // system permissions dialog. Save the return value, an instance of // ActivityResultLauncher, as an instance variable. private ActivityResultLauncherrequestPermissionLauncher = registerForActivityResult(new RequestPermission(), isGranted -> { if (isGranted) { // Permission is granted. Continue the action or workflow in your // app. } else { // Explain to the user that the feature is unavailable because the // feature requires a permission that the user has denied. At the // same time, respect the user's decision. Don't link to system // settings in an effort to convince the user to change their // decision. } }); Đoạn mã này minh hoạ quy trình đề xuất để kiểm tra một quyền và yêu cầu người dùng cấp quyền chi cần :
Kotlin
when { ContextCompat.checkSelfPermission( CONTEXT, Manifest.permission.REQUESTED_PERMISSION ) == PackageManager.PERMISSION_GRANTED -> { // You can use the API that requires the permission. } shouldShowRequestPermissionRationale(...) -> { // In an educational UI, explain to the user why your app requires this // permission for a specific feature to behave as expected, and what // features are disabled if it's declined. In this UI, include a // "cancel" or "no thanks" button that lets the user continue // using your app without granting the permission. showInContextUI(...) } else -> { // You can directly ask for the permission. // The registered ActivityResultCallback gets the result of this request. requestPermissionLauncher.launch( Manifest.permission.REQUESTED_PERMISSION) } }Java
if (ContextCompat.checkSelfPermission( CONTEXT, Manifest.permission.REQUESTED_PERMISSION) == PackageManager.PERMISSION_GRANTED) { // You can use the API that requires the permission. performAction(...); } else if (shouldShowRequestPermissionRationale(...)) { // In an educational UI, explain to the user why your app requires this // permission for a specific feature to behave as expected, and what // features are disabled if it's declined. In this UI, include a // "cancel" or "no thanks" button that lets the user continue // using your app without granting the permission. showInContextUI(...); } else { // You can directly ask for the permission. // The registered ActivityResultCallback gets the result of this request. requestPermissionLauncher.launch( Manifest.permission.REQUESTED_PERMISSION); }Tự quản lý mã yêu cầu cấp quyền
Thay vì cho phép hệ thống quản lý mã yêu cầu cấp quyền, bạn có thể tự quản lý mã yêu cầu cấp quyền này. Để thực hiện việc này, đưa mã yêu cầu vào lệnh gọi
requestPermissions()
.
Lưu ý:requestPermissions()
. Văn bản trong hộp thoại cấp quyền của hệ thống tham chiếu đến một Ứng dụng của bạn không thể tuỳ chỉnh hộp thoại được xuất hiện chi bạn gọi. Văn bản trong hộp thoại cấp quyền của hệ thống tham chiếu đến một nhóm quyền nhưng nhóm quyền này được thiết kế để giúp bạn dễ sử dụng hệ thống. Ứng dụng của bạn không nên dựa vào các quyền nằm trong hoặc ngoài một nhóm quyền cụ thể .
Đoạn mã sau đây minh hoạ cách yêu cầu cấp quyền bằng mã yêu cầu :Read more : Zalo
Kotlin
when { ContextCompat.checkSelfPermission( CONTEXT, Manifest.permission.REQUESTED_PERMISSION ) == PackageManager.PERMISSION_GRANTED -> { // You can use the API that requires the permission. performAction(...) } shouldShowRequestPermissionRationale(...) -> { // In an educational UI, explain to the user why your app requires this // permission for a specific feature to behave as expected, and what // features are disabled if it's declined. In this UI, include a // "cancel" or "no thanks" button that lets the user continue // using your app without granting the permission. showInContextUI(...) } else -> { // You can directly ask for the permission. requestPermissions(CONTEXT, arrayOf(Manifest.permission.REQUESTED_PERMISSION), REQUEST_CODE) } }Java
if (ContextCompat.checkSelfPermission( CONTEXT, Manifest.permission.REQUESTED_PERMISSION) == PackageManager.PERMISSION_GRANTED) { // You can use the API that requires the permission. performAction(...); } else if (shouldShowRequestPermissionRationale(...)) { // In an educational UI, explain to the user why your app requires this // permission for a specific feature to behave as expected, and what // features are disabled if it's declined. In this UI, include a // "cancel" or "no thanks" button that lets the user continue // using your app without granting the permission. showInContextUI(...); } else { // You can directly ask for the permission. requestPermissions(CONTEXT, new String[] { Manifest.permission.REQUESTED_PERMISSION }, REQUEST_CODE); }Sau chi người dùng phản hồi với hộp thoại cấp quyền hệ thống, thì hệ thống sẽ gọi chế độ triển khai
onRequestPermissionsResult()
của ứng dụng. Hệ thống sẽ chuyển phản hồi người dùng tới hộp thoại cấp quyền, cũng như mã yêu cầu mà bạn đã xác định, như được cho thấy trong đoạn mã sau :Kotlin
override fun onRequestPermissionsResult(requestCode: Int, permissions: Array, grantResults: IntArray) { when (requestCode) { PERMISSION_REQUEST_CODE -> { // If request is cancelled, the result arrays are empty. if ((grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED)) { // Permission is granted. Continue the action or workflow // in your app. } else { // Explain to the user that the feature is unavailable because // the feature requires a permission that the user has denied. // At the same time, respect the user's decision. Don't link to // system settings in an effort to convince the user to change // their decision. } return } // Add other 'when' lines to check for other // permissions this app might request. else -> { // Ignore all other requests. } } } Java
@Override public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { switch (requestCode) { case PERMISSION_REQUEST_CODE: // If request is cancelled, the result arrays are empty. if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { // Permission is granted. Continue the action or workflow // in your app. } else { // Explain to the user that the feature is unavailable because // the feature requires a permission that the user has denied. // At the same time, respect the user's decision. Don't link to // system settings in an effort to convince the user to change // their decision. } return; } // Other 'case' lines to check for other // permissions this app might request. } }Yêu cầu quyền truy cập thông tin vị trí
chi bạn yêu cầu cấp quyền truy cập thông tin vị trí, hãy làm theo các phương pháp hay nhất như đối với mọi quyền chi bắt đầu chạy khác. Một điểm khác biệt quan trọng chi nói đến cấp quyền truy cập thông tin vị trí là hệ thống bao gồm nhiều quyền liên quan đến vị trí. Quyền bạn yêu cầu và cách bạn yêu cầu quyền đó tuỳ thuộc vào các yêu cầu về vị trí đối với trường hợp sử dụng của ứng dụng .
Vị trí nền trước
Nếu ứng dụng của bạn chứa một tính năng chỉ chia sẻ hoặc nhận thông can vị trí một lần hoặc trong một khoảng thời gian xác định, thì tính năng đó sẽ yêu cầu quyền truy cập thông tin vị trí ở chế độ nền trước. Sau đây là một số ví dụ :
- Trong ứng dụng đi theo chỉ dẫn, một tính năng cho phép người dùng xem đường đi từng chặng.
- Trong ứng dụng nhắn tin, một tính năng cho phép người dùng chia sẻ vị trí hiện tại của mình với người dùng khác.
Hệ thống sẽ coi ứng dụng của bạn đang dùng thông tin vị trí ở chế độ nền trước nếu một tính năng của ứng dụng truy cập vào vị trí hiện tại của thiết bị ở một trong các tình huống sau :
- Một hoạt động thuộc ứng dụng của bạn đang hiển thị.
- Ứng dụng của bạn đang chạy một dịch vụ trên nền trước. chi một dịch vụ trên nền trước đang chạy, hệ thống sẽ báo cho người dùng biết bằng cách hiển thị một thông báo liên tục. Ứng dụng của bạn vẫn giữ quyền truy cập chi được đặt vào chế độ nền, chẳng hạn như chi người dùng nhấn nút Màn hình chính trên thiết bị hoặc tắt màn hình thiết bị .
Trên android ten ( API cấp twenty-nine ) trở lên, bạn phải khai báo loại dịch vụ trên nền trước làlocation
, như được minh hoạ trong đoạn mã sau. Trên các phiên bản android cũ, bạn nên khai báo loại dịch vụ trên nền trước này .android:foregroundServiceType="location" ... > Bạn khai báo nhu cầu về thông tin vị trí ở chế độ nền trước chi ứng dụng yêu cầu cấp quyền
ACCESS_COARSE_LOCATION
hoặc quyềnACCESS_FINE_LOCATION
, như được hiển thị trong đoạn mã sau :Quyền truy cập thông tin vị trí ở chế độ nền
Ứng dụng sẽ yêu cầu quyền truy cập thông tin vị trí ở chế độ nền nếu một tính năng trong ứng dụng đó liên tục chia sẻ vị trí với người dùng khác hoặc sử dụng ( Geofencing API ) API Khoanh vùng địa lý. Sau đây là một số ví dụ :
- Trong ứng dụng chia sẻ vị trí với gia đình, một tính năng cho phép người dùng liên tục chia sẻ vị trí với thành viên gia đình.
- Trong ứng dụng IoT, một tính năng cho phép người dùng định cấu hình các thiết bị trong nhà để tắt thiết bị khi người dùng rời khỏi nhà và bật lại khi người dùng trở về nhà.
Hệ thống sẽ coi ứng dụng của bạn đang sử dụng quyền truy cập thông can vị trí ở chế độ nền nếu ứng dụng truy cập vào thông tin vị trí hiện tại của thiết bị trong bất kỳ tình huống nào, trừ những tình huống được mô tả trong phần thông tin vị trí ở chế độ nền trước. Độ chính xác của vị trí ở chế độ nền giống như độ chính xác của vị trí ở chế độ nền trước, tuỳ thuộc vào quyền truy cập thông canister vị trí mà ứng dụng của bạn khai báo .
Trên android ten ( API cấp twenty-nine ) trở lên, bạn phải khai báoACCESS_BACKGROUND_LOCATION
quyền trong tệp kê khai của ứng dụng để yêu cầu quyền truy cập thông canister vị trí ở chế độ nền trong thời gian chạy. Trên các phiên bản android cũ, chi ứng dụng nhận được quyền truy cập thông can vị trí ở chế độ nền trước, ứng dụng đó cũng tự động nhận được quyền truy cập thông tin vị trí ở chế độ nền .Lưu ý: Cửa hàng google play có chính sách về vị trí liên quan đến vị trí của thiết bị, chỉ cấp quyền truy cập thông tin vị trí ở chế độ nền cho các ứng dụng cần quyền này để thực hiện chức năng cốt lõi và đáp ứng các yêu cầu liên quan của chính sách .
Xử lý việc từ chối cấp quyền
Nếu người dùng từ chối yêu cầu cấp quyền, ứng dụng của bạn sẽ giúp người dùng hiểu hệ quả của việc từ chối cấp quyền. Cụ thể, ứng dụng của bạn phải thông báo cho người dùng về những tính năng sẽ không hoạt động serve không có quyền. chi bạn làm như vậy, lưu ý các phương pháp hay nhất sau :
- Thu hút sự chú ý của người dùng. Làm nổi bật một phần cụ thể trên giao diện người dùng của ứng dụng trên đó có chức năng bị hạn chế make ứng dụng không có được quyền truy cập cần thiết. Dưới đây là một số ví dụ về những việc bạn có thể làm :
- Hiển thị thông báo trong đó kết quả hoặc dữ liệu của tính năng có thể xuất hiện.
- Hiển thị một nút khác chứa biểu tượng lỗi và màu sắc.
- Vui lòng mô tả cụ thể. Không hiển thị thông báo chung chung. Thay vào đó, hãy làm rõ những tính năng không thể hoạt động vì ứng dụng của bạn không có được quyền cần thiết .
- Không chặn giao diện người dùng. Nói cách khác, không nên hiển thị thông báo cảnh báo toàn màn hình không cho người dùng tiếp tục dùng ứng dụng của bạn .
Lưu ý: Ứng dụng của bạn phải khuyến khích trải nghiệm tốt nhất có thể với người dùng, ngay cả sau chi bị từ chối cấp quyền. Chẳng hạn như nếu quyền truy cập vào micrô bị từ chối, bạn vẫn nên quảng bá đầy đủ chức năng của văn bản .
Đồng thời, ứng dụng của bạn nên tôn trọng quyết định từ chối cấp quyền của người dùng. Kể từ android eleven ( API cấp thirty ), nếu người dùng nhiều lần nhấn vào Từ chối với một quyền cụ thể trong suốt thời gian ứng dụng của bạn được cài đặt trên thiết bị, thì người dùng sẽ không xem hộp thoại cấp quyền của hệ thống nếu ứng dụng của bạn yêu cầu cấp lại quyền đó. Hành động của người dùng ngụ ý “ không hỏi lại ”. Trên các phiên bản trước, người dùng sẽ thấy hộp thoại cấp quyền của hệ thống mỗi chi ứng dụng của bạn yêu cầu cấp quyền, trừ chi trước đó họ đã chọn hộp đánh dấu hoặc tuỳ chọn “ không hỏi lại ” .
Nếu người dùng từ chối yêu cầu cấp quyền nhiều lần, thì hành động này được coi là từ chối vĩnh viễn. Điều quan trọng là chỉ nên nhắc người dùng cấp quyền chi họ cần truy cập vào một tính năng cụ thể, nếu không, bạn có thể vô tình mất khả năng yêu cầu cấp quyền lần nữa .
Trong một số trường hợp nhất định, quyền có thể tự động bị từ chối mà không cần người dùng thực hiện bất kỳ hành động nào. ( Một quyền cũng có thể được cấp tự động. ) Bạn không nên giả định bất kỳ điều gì về hành six tự động. Mỗi chi ứng dụng cần truy cập chức năng yêu cầu cấp quyền, hãy kiểm tra để biết ứng dụng vẫn được cấp quyền đó .
Để cung cấp trải nghiệm người dùng tốt nhất chi yêu cầu cấp quyền cho ứng dụng, bạn cũng nên xem Các phương pháp hay nhất về quyền cho ứng dụng .Cấp quyền một lần
Hình 2. Hộp thoại hệ thống xuất hiện khi ứng dụng yêu cầu cấp quyền một lần.Kể từ android eleven ( API cấp thirty ), bất cứ chi nào ứng dụng yêu cầu cấp quyền liên quan đến vị trí, micrô hoặc máy ảnh, hộp thoại cấp quyền, mà người dùng nhìn thấy, chứa tuỳ chọn có tên là Chỉ lần này, như được minh hoạ trong hình two. Nếu người dùng chọn tuỳ chọn này trong hộp thoại, thì ứng dụng của bạn sẽ tạm thời được cấp quyền một lần .
Sau đó, ứng dụng có thể truy cập vào dữ liệu liên quan trong một khoảng thời gian nhất định, tuỳ thuộc vào hành six của ứng dụng và hành động của người dùng :
- Trong khi hoạt động của ứng dụng được hiển thị, thì ứng dụng có thể truy cập dữ liệu.
- Nếu người dùng chuyển ứng dụng của bạn vào nền, ứng dụng vẫn có thể tiếp tục truy cập dữ liệu trong một khoảng thời gian ngắn.
- Nếu bạn khởi chạy một dịch vụ trên nền trước trong khi hoạt động được hiển thị, sau đó người dùng chuyển ứng dụng sang chế độ nền, thì ứng dụng của bạn có thể tiếp tục truy cập vào dữ liệu cho đến khi dịch vụ trên nền trước này ngừng hoạt động.
Quá trình xử lý của ứng dụng chấm dứt khi quyền bị thu hồi
Nếu người dùng thu hồi quyền một lần, chẳng hạn như trong phần cài đặt hệ thống, thì ứng dụng của bạn không thể truy cập vào dữ liệu, bất kể bạn đã khởi chạy dịch vụ trên nền trước hay chưa. Cũng như đối với bất kỳ quyền nào, nếu người dùng thu hồi quyền một lần của ứng dụng, thì quy trình của ứng dụng sẽ chấm dứt .
Lần tiếp theo chi người dùng mở ứng dụng của bạn và một tính năng trong ứng dụng yêu cầu quyền truy cập vào thông tin vị trí, micrô hoặc máy ảnh, thì người dùng sẽ nhận được lời nhắc cấp quyền một lần nữa .Lưu ý: Nếu ứng dụng đã làm theo các phương pháp hay nhất chi yêu cầu cấp quyền chi bắt đầu chạy, thì bạn không cần thêm hay thay đổi bất kỳ logic nào trong ứng dụng để hỗ trợ quyền một lần .Đặt lại quyền không dùng đến
android cung cấp một số cách để đặt lại quyền không dùng đến chi bắt đầu chạy về trạng thái mặc định, bị từ chối :
- Một API mà trong đó bạn có thể chủ động xoá quyền truy cập của ứng dụng vào quyền khi bắt đầu chạy không dùng đến.
- Cơ chế hệ thống tự động đặt lại quyền của các ứng dụng không dùng đến.
Xoá quyền truy cập của ứng dụng
Trên android thirteen ( API cấp thirty-three ) trở lên, bạn có thể xoá quyền truy cập của ứng dụng vào các quyền chi bắt đầu chạy mà ứng dụng không còn yêu cầu. chi bạn cập nhật ứng dụng, hãy thực hiện bước này để người dùng có thể dễ hiểu lý cause ứng dụng tiếp tục yêu cầu các quyền cụ thể. Kiến thức này giúp người dùng canister tưởng ứng dụng của bạn .
Để xoá quyền truy cập vào một quyền chi bắt đầu chạy, hãy chuyển tên của quyền đó vàorevokeSelfPermissionOnKill()
. Để xoá quyền truy cập vào một nhóm các quyền chi bắt đầu chạy, hãy chuyển một tập hợp tên quyền vàorevokeSelfPermissionsOnKill()
. Quy trình xoá quyền diễn right ascension không đồng bộ và loại bỏ tất cả các quy trình liên kết với UID của ứng dụng .
Lưu ý:tất cả các quyền trong nhóm quyền đó. Trong trường hợp này, bạn nên gọirevokeSelfPermissionsOnKill()
và chuyển vào nhiều quyền trong nhóm quyền này. Để các chế độ cài đặt hệ thống cho thấy rằng ứng dụng của bạn không truy cập vào dữ liệu trong một nhóm quyền cụ thể, bạn phải xoá quyền truy cập vàocác quyền trong nhóm quyền đó. Trong trường hợp này, bạn nên gọivà chuyển vào nhiều quyền trong nhóm quyền này .
Để hệ thống xoá quyền truy cập của ứng dụng vào các quyền, mọi quy trình liên kết với ứng dụng đều phải bị loại bỏ. chi bạn gọi API, hệ thống sẽ xác định thời điểm associate in nursing toàn để loại bỏ các quy trình này. Thông thường, hệ thống sẽ chờ cho đến chi ứng dụng dành một khoảng thời gian dài để chạy trong nền thay vì trong nền trước .
Để thông báo cho người dùng rằng ứng dụng của bạn không còn yêu cầu truy cập vào các quyền cụ thể chi bắt đầu chạy, hãy hiển thị một hộp thoại vào lần tới người dùng chạy ứng dụng. Hộp thoại này có thể bao gồm danh sách các quyền .Tự động đặt lại quyền cho các ứng dụng không dùng đến
Nếu ứng dụng của bạn nhắm mục tiêu vào android eleven ( API cấp thirty ) trở lên và không được dùng trong vài tháng, thì hệ thống sẽ bảo vệ dữ liệu người dùng bằng cách tự động đặt lại các quyền nhạy cảm chi bắt đầu chạy mà người dùng đã cấp cho ứng dụng. Hãy tìm hiểu thêm trong hướng dẫn về trạng thái ngủ đông của ứng dụng .
Yêu cầu để trở thành trình xử lý mặc định nếu cần
Một số ứng dụng phụ thuộc vào quyền truy cập thông tin nhạy cảm của người dùng liên quan đến nhật ký cuộc gọi và tin nhắn samarium. Nếu muốn yêu cầu cấp quyền cụ thể với nhật ký cuộc gọi và canister nhắn samarium cũng như xuất bản ứng dụng lên Cửa hàng play, thì bạn phải nhắc người dùng đặt ứng dụng làm trình xử lý mặc định cho một hàm hệ thống cốt lõi trước chi yêu cầu quyền chi bắt đầu chạy này .
Để biết thêm thông tin về trình xử lý mặc định, bao gồm cả hướng dẫn về hiển thị lời nhắc trình xử lý mặc định cho người dùng, hãy xem hướng dẫn về các quyền chỉ được sử dụng trong trình xử lý mặc định .Cấp tất cả quyền khi bắt đầu chạy cho mục đích kiểm thử
Để tự động cấp tất cả các quyền chi bắt đầu chạy chi bạn cài đặt một ứng dụng trên trình mô phỏng hoặc thiết bị kiểm thử, sử dụng tuỳ chọn
-g
cho lệnhadb shell install
như minh hoạ trong đoạn mã sau đây :Read more : Zalo
adb shell install -g PATH_TO_APK_FILETài nguyên khác
Để biết thêm thông tin về cấp quyền, đọc những bài viết sau :
Để tìm hiểu thêm về cách yêu cầu cấp quyền, hãy xem mẫu về quyền
Bạn cũng có thể hoàn thành lớp học lập trình này để minh hoạ các phương pháp hay nhất về quyền riêng tư .