動態批量獲取權限的擴展函數
簡介
每個app必定都需要使用到獲取權限的功能,所以把這個做成擴展函數是必要的,方便,而且隨時可以調用。
這篇文章是關於批量的獲取用戶權限的功能。
運行圖片:
代碼
manifest.xml
<!-- 錄像 -->
<uses-feature android:name="android.hardware.camera"/>
<uses-feature android:name="android.hardware.camera.autofocus"/>
<uses-permission android:name="android.permission.CAMERA" />
<!--錄音-->
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<!--存儲-->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<!--位置-->
.
.
.
.
.
.
Activity中調用:
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
rxRequestPermissions(Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.RECORD_AUDIO, Manifest.permission.ACCESS_FINE_LOCATION,describe = "相機、存儲、錄音、位置") {
//此處可以寫跳轉到另一個activity的代碼
// startActivityForResult(Intent(this@MainActivity, VideoRecordActivity::class.java), REQUEST_VIDEO)
}
}
}
.
.
.
.
.
.
.
.
重點來了:
在activity上添加擴展函數
//傳入權限與權限描述,在需要權限的功能打開之前調用,vararg代表的是可變參數
fun Activity.rxRequestPermissions(vararg permissions: String, describe: String, onGranted:()->Unit) {//onGranted是回調
val keylistener = DialogInterface.OnKeyListener { _, keyCode, event ->
keyCode == KeyEvent.KEYCODE_BACK && event.repeatCount == 0
}
//有一項權限用戶不允許的話就進入到這裏對話框
var dialog = AlertDialog.Builder(this)
.setTitle("權限申請")
.setMessage("${describe}爲必選項,開通後方可正常使用APP,請在設置中開啓。")
.setOnKeyListener(keylistener)
.setCancelable(false)
.setPositiveButton("去開啓") { _, _ ->
// JumpPermissionManagement.GoToSetting(this)
finish()
}
.setNegativeButton("結束") { _, _ ->
Toast.makeText(this, "${describe}權限未開啓,不能使用該功能!", Toast.LENGTH_SHORT).show()
finish()
}
.create()
val rxPermissions = RxPermissions(this)
//傳遞kotlin的可變長參數給Java的可變參數的時候需要使用修飾符 * ;這個修飾符叫做Speread Operator
// 它只支持展開的Array 數組,不支持List集合,它只用於變長參數列表的實參,不能重載,它也不是運算符;
rxPermissions.request(*permissions)
.subscribe {granted ->
if (granted) {
onGranted()
} else {
dialog.show()
}
}
}
demo的下載地址爲: