动态权限
6.0
- 权限体系
- AppLinking
- 直接分享
- 企业用户特性
RxPermissions
RxPermissions,API23以上Android 6.0项目分为普通权限和危险权限,该库在项目运行时动态进行权限请求,支持RxJava2。
PermissionX
EasyPermissions
dependencies {
// For developers using AndroidX in their applications
implementation 'pub.devrel:easypermissions:3.0.0'
// For developers using the Android Support Library
implementation 'pub.devrel:easypermissions:2.0.1'
}
在BaseActivity中设置
abstract class BaseActivity : AppCompatActivity(), EasyPermissions.PermissionCallbacks, IBaseView {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(layoutId())
// 不自动弹出键盘
window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN)
immersionBar {
statusBarColor(R.color.white)
autoStatusBarDarkModeEnable(true)
}
}
/**
* 打卡软键盘
*/
fun openKeyBoard(mEditText: EditText, mContext: Context) {
val imm = mContext.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
imm.showSoftInput(mEditText, InputMethodManager.RESULT_SHOWN)
imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, InputMethodManager.HIDE_IMPLICIT_ONLY)
}
/**
* 关闭软键盘
*/
fun closeKeyBoard(mEditText: EditText, mContext: Context) {
val imm = mContext.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
imm.hideSoftInputFromWindow(mEditText.windowToken, 0)
}
/**
* 重写要申请权限的Activity或者Fragment的onRequestPermissionsResult()方法,
* 在里面调用EasyPermissions.onRequestPermissionsResult(),实现回调。
*
* @param requestCode 权限请求的识别码
* @param permissions 申请的权限
* @param grantResults 授权结果
*/
override fun onRequestPermissionsResult(requestCode: Int, @NonNull permissions: Array<String>, @NonNull grantResults: IntArray) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults)
EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this)
}
/**
* 当权限被成功申请的时候执行回调
*
* @param requestCode 权限请求的识别码
* @param perms 申请的权限的名字
*/
override fun onPermissionsGranted(requestCode: Int, perms: List<String>) {
Log.e("EasyPermissions", "获取成功的权限$perms")
}
/**
* 当权限申请失败的时候执行的回调
*
* @param requestCode 权限请求的识别码
* @param perms 申请的权限的名字
*/
override fun onPermissionsDenied(requestCode: Int, perms: List<String>) {
//处理权限名字字符串
val sb = StringBuffer()
for (str in perms) {
sb.append(str)
sb.append("\n")
}
sb.replace(sb.length - 2, sb.length, "")
//用户点击拒绝并不在询问时候调用
if (EasyPermissions.somePermissionPermanentlyDenied(this, perms)) {
Toast.makeText(this, "已拒绝权限" + sb + "并不再询问", Toast.LENGTH_SHORT).show()
AppSettingsDialog.Builder(this)
.setRationale("此功能需要" + sb + "权限,否则无法正常使用,是否打开设置")
.setPositiveButton("好")
.setNegativeButton("不行")
.build()
.show()
}
}
open fun showSystemBar(isFullScreen: Boolean) {
//显示
SystemBarUtils.showUnStableStatusBar(this)
if (isFullScreen) {
SystemBarUtils.showUnStableNavBar(this)
}
}
open fun hideSystemBar(isFullScreen: Boolean) {
//隐藏
SystemBarUtils.hideStableStatusBar(this)
if (isFullScreen) {
SystemBarUtils.hideStableNavBar(this)
}
}
}
继承BaseActivity的页面中使用
/**
* 检查禅语图片权限
*/
private fun checkZenPerm() {
val params = arrayOf(
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.CAMERA
)
if (EasyPermissions.hasPermissions(this, *params)) {
ZenPublishActivity.open(this)
} else {
EasyPermissions.requestPermissions(
this,
"需要相机、读写文件权限",
PermissionCode.ZEN,
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.CAMERA
)
}
}
/**
* 检查小视频权限
*/
private fun checkSmallVideoPerm() {
val params = arrayOf(
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.CAMERA,
Manifest.permission.RECORD_AUDIO
)
if (EasyPermissions.hasPermissions(this, *params)) {
SmallVideoRecordNewActivity.open(this)
} else {
EasyPermissions.requestPermissions(
this,
"需要相机、录音、读写文件权限",
PermissionCode.SMALL_VIDEO,
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.CAMERA,
Manifest.permission.RECORD_AUDIO
)
}
}
override fun onPermissionsGranted(requestCode: Int, perms: List<String>) {
super.onPermissionsGranted(requestCode, perms)
if (requestCode == PermissionCode.ZEN && EasyPermissions.hasPermissions(
this,
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.CAMERA
)
) {
ZenPublishActivity.open(this)
}
if (requestCode == PermissionCode.SMALL_VIDEO && EasyPermissions.hasPermissions(
this,
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.CAMERA,
Manifest.permission.RECORD_AUDIO
)
) {
SmallVideoRecordNewActivity.open(this)
}
}