1. 程式人生 > >Android 6.0動態許可權框架EasyPermissions的使用

Android 6.0動態許可權框架EasyPermissions的使用

在6.0下新的許可權機制分為兩類,Normal Permissions,這類許可權是不需要使用者授權,不會觸及使用者的隱私,只需要在manefest裡面申請即可;還有一類是Dangerous Permissions,這類許可權需要動態的去申請。

Normal Permission如下:

[java] view plain copy print?在CODE上檢視程式碼片派生到我的程式碼片
  1. android.permission.ACCESS_LOCATION_EXTRA_COMMANDS  
  2. android.permission.ACCESS_NETWORK_STATE  
  3. android.permission.ACCESS_NOTIFICATION_POLICY  
  4. android.permission.ACCESS_WIFI_STATE  
  5. android.permission.ACCESS_WIMAX_STATE  
  6. android.permission.BLUETOOTH  
  7. android.permission.BLUETOOTH_ADMIN  
  8. android.permission.BROADCAST_STICKY  
  9. android.permission.CHANGE_NETWORK_STATE  
  10. android.permission.CHANGE_WIFI_MULTICAST_STATE  
  11. android.permission.CHANGE_WIFI_STATE  
  12. android.permission.CHANGE_WIMAX_STATE  
  13. android.permission.DISABLE_KEYGUARD  
  14. android.permission.EXPAND_STATUS_BAR  
  15. android.permission.FLASHLIGHT  
  16. android.permission.GET_ACCOUNTS  
  17. android.permission.GET_PACKAGE_SIZE  
  18. android.permission.INTERNET  
  19. android.permission.KILL_BACKGROUND_PROCESSES  
  20. android.permission.MODIFY_AUDIO_SETTINGS  
  21. android.permission.NFC  
  22. android.permission.READ_SYNC_SETTINGS  
  23. android.permission.READ_SYNC_STATS  
  24. android.permission.RECEIVE_BOOT_COMPLETED  
  25. android.permission.REORDER_TASKS  
  26. android.permission.REQUEST_INSTALL_PACKAGES  
  27. android.permission.SET_TIME_ZONE  
  28. android.permission.SET_WALLPAPER  
  29. android.permission.SET_WALLPAPER_HINTS  
  30. android.permission.SUBSCRIBED_FEEDS_READ  
  31. android.permission.TRANSMIT_IR  
  32. android.permission.USE_FINGERPRINT  
  33. android.permission.VIBRATE  
  34. android.permission.WAKE_LOCK  
  35. android.permission.WRITE_SYNC_SETTINGS  
  36. com.android.alarm.permission.SET_ALARM  
  37. com.android.launcher.permission.INSTALL_SHORTCUT  
  38. com.android.launcher.permission.UNINSTALL_SHORTCUT  
  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
Dangerous Permissions: [java] view plain copy print?在CODE上檢視程式碼片派生到我的程式碼片
  1. group:android.permission-group.CONTACTS  
  2.   permission:android.permission.WRITE_CONTACTS  
  3.   permission:android.permission.GET_ACCOUNTS      
  4.   permission:android.permission.READ_CONTACTS  
  5. group:android.permission-group.PHONE  
  6.   permission:android.permission.READ_CALL_LOG  
  7.   permission:android.permission.READ_PHONE_STATE   
  8.   permission:android.permission.CALL_PHONE  
  9.   permission:android.permission.WRITE_CALL_LOG  
  10.   permission:android.permission.USE_SIP  
  11.   permission:android.permission.PROCESS_OUTGOING_CALLS  
  12.   permission:com.android.voicemail.permission.ADD_VOICEMAIL  
  13. group:android.permission-group.CALENDAR  
  14.   permission:android.permission.READ_CALENDAR  
  15.   permission:android.permission.WRITE_CALENDAR  
  16. group:android.permission-group.CAMERA  
  17.   permission:android.permission.CAMERA  
  18. group:android.permission-group.SENSORS  
  19.   permission:android.permission.BODY_SENSORS  
  20. group:android.permission-group.LOCATION  
  21.   permission:android.permission.ACCESS_FINE_LOCATION  
  22.   permission:android.permission.ACCESS_COARSE_LOCATION  
  23. group:android.permission-group.STORAGE  
  24.   permission:android.permission.READ_EXTERNAL_STORAGE  
  25.   permission:android.permission.WRITE_EXTERNAL_STORAGE  
  26. group:android.permission-group.MICROPHONE  
  27.   permission:android.permission.RECORD_AUDIO  
  28. group:android.permission-group.SMS  
  29.   permission:android.permission.READ_SMS  
  30.   permission:android.permission.RECEIVE_WAP_PUSH  
  31.   permission:android.permission.RECEIVE_MMS  
  32.   permission:android.permission.RECEIVE_SMS  
  33.   permission:android.permission.SEND_SMS  
  34.   permission:android.permission.READ_CELL_BROADCASTS  
  group:android.permission-group.CONTACTS
    permission:android.permission.WRITE_CONTACTS
    permission:android.permission.GET_ACCOUNTS    
    permission:android.permission.READ_CONTACTS

  group:android.permission-group.PHONE
    permission:android.permission.READ_CALL_LOG
    permission:android.permission.READ_PHONE_STATE 
    permission:android.permission.CALL_PHONE
    permission:android.permission.WRITE_CALL_LOG
    permission:android.permission.USE_SIP
    permission:android.permission.PROCESS_OUTGOING_CALLS
    permission:com.android.voicemail.permission.ADD_VOICEMAIL

  group:android.permission-group.CALENDAR
    permission:android.permission.READ_CALENDAR
    permission:android.permission.WRITE_CALENDAR

  group:android.permission-group.CAMERA
    permission:android.permission.CAMERA

  group:android.permission-group.SENSORS
    permission:android.permission.BODY_SENSORS

  group:android.permission-group.LOCATION
    permission:android.permission.ACCESS_FINE_LOCATION
    permission:android.permission.ACCESS_COARSE_LOCATION

  group:android.permission-group.STORAGE
    permission:android.permission.READ_EXTERNAL_STORAGE
    permission:android.permission.WRITE_EXTERNAL_STORAGE

  group:android.permission-group.MICROPHONE
    permission:android.permission.RECORD_AUDIO

  group:android.permission-group.SMS
    permission:android.permission.READ_SMS
    permission:android.permission.RECEIVE_WAP_PUSH
    permission:android.permission.RECEIVE_MMS
    permission:android.permission.RECEIVE_SMS
    permission:android.permission.SEND_SMS
    permission:android.permission.READ_CELL_BROADCASTS
可以看到Dangerous Permissions是按照組來分類的,如果申請了一組的其中一個許可權,那麼預設會獲得該組的所有許可權的使用。

申請的流程

1.在AndroidManifest裡面配置需要的許可權,無論是普通的還是特殊的許可權都需要在這裡配置。

2.檢查許可權,如果沒有許可權則申請

3.給使用者申請許可權的解釋,這個方法只會在第一次使用者拒絕授權,再次去申請這個的許可權時會用到

4.申請相應的許可權

5.處理申請許可權的回撥,在這裡獲得哪些授權成功哪些失敗,處理需要的邏輯

具體的例子

下面的例子是獲取使用者的寫外部儲存器和打電話的許可權

[java] view plain copy print?在CODE上檢視程式碼片派生到我的程式碼片
  1. publicclass Main2Activity extends AppCompatActivity {  
  2.     @Override
  3.     protectedvoid onCreate(Bundle savedInstanceState) {  
  4.         super.onCreate(savedInstanceState);  
  5.         setContentView(R.layout.activity_main2);  
  6.         if (ContextCompat.checkSelfPermission(this, Manifest.permission.CALL_PHONE)  
  7.                 != PackageManager.PERMISSION_GRANTED) {//未獲取許可權
  8.             if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.CALL_PHONE)) {  
  9.                 //當用戶第一次申請拒絕時,再次申請該許可權呼叫
  10.                 Toast.makeText(this“撥打電話許可權”, Toast.LENGTH_SHORT).show();  
  11.             }  
  12.             //申請許可權
  13.             ActivityCompat.requestPermissions(thisnew String[]{Manifest.permission.CALL_PHONE}, 0x01);  
  14.         } else {//已經獲得了許可權
  15.             call();  
  16.         }  
  17.     }  
  18.     privatevoid call() {  
  19.         Toast.makeText(this“打電話”, Toast.LENGTH_SHORT).show();  
  20.     }  
  21.     @Override
  22.     publicvoid onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNullint[] grantResults) {  
  23.         super.onRequestPermissionsResult(requestCode, permissions, grantResults);  
  24.         if (requestCode == 0x01) {  
  25.             if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {//授權成功
  26.                 call();  
  27.             } else {//授權失敗
  28.                 Toast.makeText(this“獲取許可權失敗”, Toast.LENGTH_SHORT).show();  
  29.             }  
  30.         }  
  31.     }  
  32. }  
public class Main2Activity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main2);

        if (ContextCompat.checkSelfPermission(this, Manifest.permission.CALL_PHONE)
                != PackageManager.PERMISSION_GRANTED) {//未獲取許可權
            if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.CALL_PHONE)) {
                //當用戶第一次申請拒絕時,再次申請該許可權呼叫
                Toast.makeText(this, "撥打電話許可權", Toast.LENGTH_SHORT).show();
            }
            //申請許可權
            ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CALL_PHONE}, 0x01);
        } else {//已經獲得了許可權
            call();
        }
    }

    private void call() {
        Toast.makeText(this, "打電話", Toast.LENGTH_SHORT).show();
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if (requestCode == 0x01) {
            if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {//授權成功
                call();
            } else {//授權失敗
                Toast.makeText(this, "獲取許可權失敗", Toast.LENGTH_SHORT).show();
            }
        }
    }
}

封裝的三方庫——EasyPermissions

這個用於許可權的申請,使用起來十分的簡單

匯入

[java] view plain copy print?在CODE上檢視程式碼片派生到我的程式碼片
  1. compile ‘pub.devrel:easypermissions:0.1.5’
compile 'pub.devrel:easypermissions:0.1.5'
使用很簡單,程式碼中都有註釋,都能看懂 [java] view plain copy print?在CODE上檢視程式碼片派生到我的程式碼片
  1. publicclass MainActivity extends AppCompatActivity implements EasyPermissions.PermissionCallbacks {  
  2.     privatestaticfinal String TAG = “lzy”;  
  3.     @Override
  4.     protectedvoid onCreate(Bundle savedInstanceState) {  
  5.         super.onCreate(savedInstanceState);  
  6.         setContentView(R.layout.activity_main);  
  7.         //所要申請的許可權
  8.         String[] perms = {Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.CALL_PHONE};  
  9.         if (EasyPermissions.hasPermissions(this, perms)) {//檢查是否獲取該許可權
  10.             Log.i(TAG, ”已獲取許可權”);  
  11.         } else {  
  12.             //第二個引數是被拒絕後再次申請該許可權的解釋
  13.             //第三個引數是請求碼
  14.             //第四個引數是要申請的許可權
  15.             EasyPermissions.requestPermissions(this“必要的許可權”0, perms);  
  16.         }  
  17.     }  
  18.     @Override
  19.     publicvoid onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNullint[] grantResults) {  
  20.         super.onRequestPermissionsResult(requestCode, permissions, grantResults);  
  21.         //把申請許可權的回撥交由EasyPermissions處理
  22.         EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this);  
  23.     }  
  24.     //下面兩個方法是實現EasyPermissions的EasyPermissions.PermissionCallbacks介面
  25.     //分別返回授權成功和失敗的許可權
  26.     @Override
  27.     publicvoid onPermissionsGranted(int requestCode, List<String> perms) {  
  28.         Log.i(TAG, ”獲取成功的許可權” + perms);  
  29.     }  
  30.     @Override
  31.     publicvoid onPermissionsDenied(int requestCode, List<String> perms) {  
  32.         Log.i(TAG, ”獲取失敗的許可權” + perms);  
  33.     }  
  34. }  
public class MainActivity extends AppCompatActivity implements EasyPermissions.PermissionCallbacks {

    private static final String TAG = "lzy";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //所要申請的許可權
        String[] perms = {Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.CALL_PHONE};

        if (EasyPermissions.hasPermissions(this, perms)) {//檢查是否獲取該許可權
            Log.i(TAG, "已獲取許可權");
        } else {
            //第二個引數是被拒絕後再次申請該許可權的解釋
            //第三個引數是請求碼
            //第四個引數是要申請的許可權
            EasyPermissions.requestPermissions(this, "必要的許可權", 0, perms);
        }
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        //把申請許可權的回撥交由EasyPermissions處理
        EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this);
    }

    //下面兩個方法是實現EasyPermissions的EasyPermissions.PermissionCallbacks介面
    //分別返回授權成功和失敗的許可權
    @Override
    public void onPermissionsGranted(int requestCode, List<String> perms) {
        Log.i(TAG, "獲取成功的許可權" + perms);
    }

    @Override
    public void onPermissionsDenied(int requestCode, List<String> perms) {
        Log.i(TAG, "獲取失敗的許可權" + perms);
    }
}