Bản xem trước dành cho nhà phát triển 2 mang đến một số thay đổi về cách yêu cầu quyền của ứng dụng (xem thêm http://developer.android.com/preview/support.html#preview2-notes ).
Hộp thoại đầu tiên bây giờ trông như thế này:
Không có hộp kiểm "Không bao giờ hiển thị lại" (không giống như bản xem trước của nhà phát triển 1). Nếu người dùng từ chối quyền và nếu quyền là cần thiết cho ứng dụng, thì người dùng có thể đưa ra một hộp thoại khác để giải thích lý do ứng dụng yêu cầu quyền đó, ví dụ như sau:
Nếu người dùng từ chối một lần nữa, ứng dụng sẽ tắt nếu nó thực sự cần sự cho phép đó hoặc tiếp tục chạy với chức năng hạn chế. Nếu người dùng xem xét lại (và chọn thử lại), quyền lại được yêu cầu. Lần này lời nhắc trông như thế này:
Lần thứ hai hộp kiểm "Không bao giờ hỏi lại" được hiển thị. Nếu người dùng từ chối một lần nữa và hộp kiểm được đánh dấu thì không có gì xảy ra nữa. Việc hộp kiểm có được đánh dấu hay không có thể được xác định bằng cách sử dụng Activity.shouldShowRequestPermissionRationale (Chuỗi), ví dụ như sau:
if (shouldShowRequestPermissionRationale(Manifest.permission.WRITE_CONTACTS)) {...
Đó là những gì tài liệu Android nói ( https://developer.android.com/training/permissions/requesting.html ):
Để giúp tìm các tình huống mà bạn cần cung cấp giải thích thêm, hệ thống cung cấp phương thức Activity.shouldShowRequestPermissionRationale (Chuỗi). Phương thức này trả về true nếu ứng dụng đã yêu cầu quyền này trước đó và người dùng từ chối yêu cầu. Điều đó chỉ ra rằng bạn có thể nên giải thích cho người dùng lý do tại sao bạn cần sự cho phép.
Nếu trước đây người dùng đã từ chối yêu cầu cấp phép và chọn tùy chọn Không hỏi lại trong hộp thoại hệ thống yêu cầu quyền, phương thức này trả về sai. Phương thức cũng trả về false nếu chính sách thiết bị cấm ứng dụng có quyền đó.
Để biết liệu người dùng có từ chối "không bao giờ hỏi lại" hay không, bạn có thể kiểm tra lại phương thức ShouldShowRequestPermissionRationale trong onRequestPermissionsResult khi người dùng không cấp quyền.
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
if (requestCode == REQUEST_PERMISSION) {
// for each permission check if the user granted/denied them
// you may want to group the rationale in a single dialog,
// this is just an example
for (int i = 0, len = permissions.length; i < len; i++) {
String permission = permissions[i];
if (grantResults[i] == PackageManager.PERMISSION_DENIED) {
// user rejected the permission
boolean showRationale = shouldShowRequestPermissionRationale( permission );
if (! showRationale) {
// user also CHECKED "never ask again"
// you can either enable some fall back,
// disable features of your app
// or open another dialog explaining
// again the permission and directing to
// the app setting
} else if (Manifest.permission.WRITE_CONTACTS.equals(permission)) {
showRationale(permission, R.string.permission_denied_contacts);
// user did NOT check "never ask again"
// this is a good place to explain the user
// why you need the permission and ask if he wants
// to accept it (the rationale)
} else if ( /* possibly check more permissions...*/ ) {
}
}
}
}
}
Bạn có thể mở cài đặt ứng dụng của mình bằng mã này:
Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
Uri uri = Uri.fromParts("package", getPackageName(), null);
intent.setData(uri);
startActivityForResult(intent, REQUEST_PERMISSION_SETTING);
Không có cách nào để gửi người dùng trực tiếp đến trang Ủy quyền.