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):
- 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).
- 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
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.
Đâ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.
0 nhận xét: