Dưới đây là ví dụ chi tiết với nhiều yêu cầu cấp phép: -
Ứng dụng cần 2 quyền khi khởi động. SEND_SMS và ACCESS_FINE_LOCATION (cả hai đều được đề cập trong tệp kê khai).
Tôi đang sử dụng Thư viện hỗ trợ v4 được chuẩn bị để xử lý Android trước Marshmallow và do đó không cần kiểm tra các phiên bản xây dựng.
Ngay khi ứng dụng khởi động, nó sẽ yêu cầu nhiều quyền cùng nhau. Nếu cả hai quyền được cấp, luồng bình thường đi.
public static final int REQUEST_ID_MULTIPLE_PERMISSIONS = 1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if(checkAndRequestPermissions()) {
// carry on the normal flow, as the case of permissions granted.
}
}
private boolean checkAndRequestPermissions() {
int permissionSendMessage = ContextCompat.checkSelfPermission(this,
Manifest.permission.SEND_SMS);
int locationPermission = ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION);
List<String> listPermissionsNeeded = new ArrayList<>();
if (locationPermission != PackageManager.PERMISSION_GRANTED) {
listPermissionsNeeded.add(Manifest.permission.ACCESS_FINE_LOCATION);
}
if (permissionSendMessage != PackageManager.PERMISSION_GRANTED) {
listPermissionsNeeded.add(Manifest.permission.SEND_SMS);
}
if (!listPermissionsNeeded.isEmpty()) {
ActivityCompat.requestPermissions(this, listPermissionsNeeded.toArray(new String[listPermissionsNeeded.size()]),REQUEST_ID_MULTIPLE_PERMISSIONS);
return false;
}
return true;
}
ContextCompat.checkSelfPermission (), ActivityCompat.requestPermissions (), ActivityCompat.shouldShowRequestPermissionRationale () là một phần của thư viện hỗ trợ.
Trong trường hợp một hoặc nhiều quyền không được cấp, ActivityCompat.requestPermissions () sẽ yêu cầu quyền và điều khiển chuyển sang phương thức gọi lại onRequestPermissionsResult ().
Bạn nên kiểm tra giá trị của cờ ShouldShowRequestPermissionRationale () trong phương thức gọi lại onRequestPermissionsResult ().
Chỉ có hai trường hợp: -
Trường hợp 1: -Bất cứ khi nào người dùng nhấp vào Quyền từ chối (kể cả lần đầu tiên), nó sẽ trả về đúng. Vì vậy, khi người dùng từ chối, chúng tôi có thể hiển thị thêm lời giải thích và tiếp tục hỏi lại
Trường hợp 2: -Chỉ khi người dùng chọn thì không bao giờ hỏi lại, nó sẽ trả về false. Trong trường hợp này, chúng tôi có thể tiếp tục với chức năng giới hạn và hướng dẫn người dùng kích hoạt các quyền từ cài đặt để có nhiều chức năng hơn hoặc chúng tôi có thể hoàn tất cài đặt, nếu quyền đó không quan trọng đối với ứng dụng.
TRƯỜNG HỢP 1
TRƯỜNG HỢP-2
@Override
public void onRequestPermissionsResult(int requestCode,
String permissions[], int[] grantResults) {
Log.d(TAG, "Permission callback called-------");
switch (requestCode) {
case REQUEST_ID_MULTIPLE_PERMISSIONS: {
Map<String, Integer> perms = new HashMap<>();
// Initialize the map with both permissions
perms.put(Manifest.permission.SEND_SMS, PackageManager.PERMISSION_GRANTED);
perms.put(Manifest.permission.ACCESS_FINE_LOCATION, PackageManager.PERMISSION_GRANTED);
// Fill with actual results from user
if (grantResults.length > 0) {
for (int i = 0; i < permissions.length; i++)
perms.put(permissions[i], grantResults[i]);
// Check for both permissions
if (perms.get(Manifest.permission.SEND_SMS) == PackageManager.PERMISSION_GRANTED
&& perms.get(Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) {
Log.d(TAG, "sms & location services permission granted");
// process the normal flow
//else any one or both the permissions are not granted
} else {
Log.d(TAG, "Some permissions are not granted ask again ");
//permission is denied (this is the first time, when "never ask again" is not checked) so ask again explaining the usage of permission
// // shouldShowRequestPermissionRationale will return true
//show the dialog or snackbar saying its necessary and try again otherwise proceed with setup.
if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.SEND_SMS) || ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.ACCESS_FINE_LOCATION)) {
showDialogOK("SMS and Location Services Permission required for this app",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
switch (which) {
case DialogInterface.BUTTON_POSITIVE:
checkAndRequestPermissions();
break;
case DialogInterface.BUTTON_NEGATIVE:
// proceed with logic by disabling the related features or quit the app.
break;
}
}
});
}
//permission is denied (and never ask again is checked)
//shouldShowRequestPermissionRationale will return false
else {
Toast.makeText(this, "Go to settings and enable permissions", Toast.LENGTH_LONG)
.show();
// //proceed with logic by disabling the related features or quit the app.
}
}
}
}
}
}
private void showDialogOK(String message, DialogInterface.OnClickListener okListener) {
new AlertDialog.Builder(this)
.setMessage(message)
.setPositiveButton("OK", okListener)
.setNegativeButton("Cancel", okListener)
.create()
.show();
}