动态批量获取权限的扩展函数
简介
每个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" />
<!--位置-->
.
.
.
引入依赖
implementation 'ru.alexbykov:nopermission:1.1.2'
implementation 'com.tbruyelle.rxpermissions2:rxpermissions:0.9.5@aar'
implementation 'io.reactivex.rxjava2:rxandroid:2.0.1'
.
.
.
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的代码
Log.d("WY+","允许了==2") //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) {
Log.d("WY+","允许了==1")
onGranted()
} else {
dialog.show()
}
}
}
demo的下载地址为: