Thứ Ba, 20 tháng 3, 2018

Cơ chế kiểm quyền Android 6

Từ khi Android M(Android 6) phát hành Google đã thay đổi cơ chế cấp quyền sử dụng cho các ứng dụng (các phiên bản trước thì chúng ta không cần kiểm tra quyền khi chạy mà quyền được cấp khi cài đặt phần mềm):
  1. Các quyền sẽ không cần phải xác nhận khi cài đặt phần mềm mà xác nhận với người dùng khi họ chạy các chức năng cần quyền (Runtime Permission).
  2. Chúng ta có thể thu hồi quyền đã cấp cho ứng dụng mà không cần gỡ ứng dụng.
Hệ thống phân chia thành 02 dạng quyền:
Các quyền thống thường sẽ được cấp tự động cho ứng dụng. Các quyền này chúng ta chỉ việc khai báo ở Manifest khi chạy hệ thống sẽ tự cấp phát
android.permission.ACCESS_LOCATION_EXTRA_COMMANDS
android.permission.ACCESS_NETWORK_STATE
android.permission.ACCESS_NOTIFICATION_POLICY
android.permission.ACCESS_WIFI_STATE
android.permission.ACCESS_WIMAX_STATE
android.permission.BLUETOOTH
android.permission.BLUETOOTH_ADMIN
android.permission.BROADCAST_STICKY
android.permission.CHANGE_NETWORK_STATE
android.permission.CHANGE_WIFI_MULTICAST_STATE
android.permission.CHANGE_WIFI_STATE
android.permission.CHANGE_WIMAX_STATE
android.permission.DISABLE_KEYGUARD
android.permission.EXPAND_STATUS_BAR
android.permission.FLASHLIGHT
android.permission.GET_ACCOUNTS
android.permission.GET_PACKAGE_SIZE
android.permission.INTERNET
android.permission.KILL_BACKGROUND_PROCESSES
android.permission.MODIFY_AUDIO_SETTINGS
android.permission.NFC
android.permission.READ_SYNC_SETTINGS
android.permission.READ_SYNC_STATS
android.permission.RECEIVE_BOOT_COMPLETED
android.permission.REORDER_TASKS
android.permission.REQUEST_INSTALL_PACKAGES
android.permission.SET_TIME_ZONE
android.permission.SET_WALLPAPER
android.permission.SET_WALLPAPER_HINTS
android.permission.SUBSCRIBED_FEEDS_READ
android.permission.TRANSMIT_IR
android.permission.USE_FINGERPRINT
android.permission.VIBRATE
android.permission.WAKE_LOCK
android.permission.WRITE_SYNC_SETTINGS
com.android.alarm.permission.SET_ALARM
com.android.launcher.permission.INSTALL_SHORTCUT
com.android.launcher.permission.UNINSTALL_SHORTCUT

Các quyền có khả năng gây hại cho hệ thống cần phải cấp quyền và có xác nhận của người dùng (các quyền còn lại).

Ví dụ: Chúng ta có chức năng cần sử dụng 03 quyền là: Truy cập Internet(quyền bình thường hệ thống tự cấp chỉ cần khai báo trong Manifest), Quyền đọc/ghi thông tin vào bộ nhớ ngoài 02 quyền này cần phải đăng ký và có sự xác nhận của người dùng là cho phép hay không ?
Nội dung đăng ký ở Manifest như sau:
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
Khi mở ứng dung chúng ta kiểm tra nếu chưa cấp quyền thì hỏi người dùng có đồng ý cấp quyền để chạy hay không?
// Android 6 hoặc cao hơn
if (Build.VERSION.SDK_INT >= 23) {
    // Kiem tra quyen
    if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED
            || ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
        // Should we show an explanation?
        if (ActivityCompat.shouldShowRequestPermissionRationale(MainActivity.this, Manifest.permission.READ_EXTERNAL_STORAGE)
                || ActivityCompat.shouldShowRequestPermissionRationale(MainActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
        } else {
            // Hien thi hop thoai cap quyen va cho nguoi dung xac nhan cho phep hay khong.
            ActivityCompat.requestPermissions(MainActivity.this,
                    new String[]{Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE}, 113);
        }
    }
    else
    {
        permissionGrant = true;
    }
}
Khi chúng ta sử dụng phương thức
ActivityCompat.requestPermissions
đề yều cần quyền thì hệ thống sẽ hiển thị hộp thoại để người dùng chọn là đồng ý cấp quyền hay là không
co che kiem duyet
Tại đây cho dù người cho phép hay không thì hệ thống cũng sẽ trả về thống tin cho ứng dụng, để đón nhận kết quả chúng ta định nghĩa lại hàm
@Override
public void onRequestPermissionsResult(int requestCode,
                 String permissions[], int[] grantResults) {
    switch (requestCode) {
        case 113: {
            // If request is cancelled, the result arrays are empty.
            if (grantResults.length > 0
                    && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                permissionGrant = true;
            } else {
                permissionGrant = false;
            }
            return;
        }
    }
}
Như vậy nếu chúng ta cập quyền thì thông tin về quyền người dùng sẽ đc ghi nhớ và không hỏi lại ở lần sử dụng tiếp theo. Tuy nhiên chúng ta cũng  có thể thu hồi quyền đã cấp qua giao diện quản lý ứng dụng của Android.
permissions
Đây cũng là điểm khắc biệt cần phải lưu ý khi phát triển ứng dụng Android.
Previous Post
Next Post

post written by:

0 nhận xét: