運用場景
- 谷歌在Android M版本之后,為了用戶安全,提出了權限機制,所以開發(fā)者需要在代碼層進行基本的系統(tǒng)權限邏輯編碼
- 開發(fā)者在基本的系統(tǒng)權限開發(fā)中,處理的邏輯有點繁瑣
這里介紹一個處理權限的庫-easypermissions,這個庫主要功能就是在系統(tǒng)權限的邏輯上面封裝了一些我們經(jīng)常用到的邏輯,更方便我們的使用,接下來我們一起去了解一下吧
結構介紹

jar包結構圖.png
1.activity和fragment頁面權限的申請
2.自定義的dialog
3.彈出系統(tǒng)設置頁面
簡單使用
依賴 implementation 'pub.devrel:easypermissions:2.0.0'
申請權限
這里舉個栗子,申請相機權限和地理位置權限
@AfterPermissionGranted(Constant.RC_CAMERA_AND_LOCATION)
private fun methodRequiresTwoPermission() {
val perms = arrayOf(Manifest.permission.CAMERA, Manifest.permission.ACCESS_FINE_LOCATION)
if (EasyPermissions.hasPermissions(this, *perms)) {
// Already have permission, do the thing
// ...
} else {
// Do not have permissions, request them now
//這個方法是用戶在拒絕權限之后,再次申請權限,才會彈出自定義的dialog,詳情可以查看下源碼 shouldShowRequestPermissionRationale()方法
EasyPermissions.requestPermissions(
PermissionRequest.Builder(this, RC_CAMERA_AND_LOCATION, *perms)
.setRationale(R.string.camera)
.setPositiveButtonText(R.string.yes)
.setNegativeButtonText(R.string.no)
.build())
}
}
//接受系統(tǒng)權限的處理,這里交給EasyPermissions來處理,回調(diào)到 EasyPermissions.PermissionCallbacks接口
override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults)
EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults,this)//注意這個this,內(nèi)部對實現(xiàn)該方法進行了查詢,所以沒有this的話,回調(diào)結果的方法不生效
}
實現(xiàn) EasyPermissions.PermissionCallbacks ,重寫以下兩個方法 (彈出系統(tǒng)框時,用戶點擊接受和拒絕按鈕)
override fun onPermissionsDenied(requestCode: Int, perms: MutableList<String>) {
// Check if at least one permission in the list of denied permissions has been permanently
// denied (user clicked "Never ask again").
// This will display a dialog directing them to enable the permission in app settings.
//如果用戶點擊永遠禁止,這個時候就需要跳到系統(tǒng)設置頁面去手動打開了
if (EasyPermissions.somePermissionPermanentlyDenied(this, perms)) {
AppSettingsDialog.Builder(this).build().show()
}
}
override fun onPermissionsGranted(requestCode: Int, perms: MutableList<String>) {
}
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
//設置頁面跳轉(zhuǎn)需要處理的邏輯
if (requestCode == AppSettingsDialog.DEFAULT_SETTINGS_REQ_CODE) {
// Do something after user returned from app settings screen, like showing a Toast.
Toast.makeText(this, R.string.returned_from_app_settings_to_activity, Toast.LENGTH_SHORT)
.show()
}
}
實現(xiàn) EasyPermissions.RationaleCallbacks,重寫以下兩個方法 (彈出自定義dialog時,用戶點擊接受和拒絕按鈕)
override fun onRationaleDenied(requestCode: Int) {
}
override fun onRationaleAccepted(requestCode: Int) {
}
好啦,大概這個權限庫就這么簡單的介紹完了,可以github上看看,多學學別人寫的代碼也是蠻不錯的,里面有些設計模式也可以學習一下