博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android 权限管理
阅读量:6290 次
发布时间:2019-06-22

本文共 6106 字,大约阅读时间需要 20 分钟。

1. 危险权限

img_94ab78976d7295ddb5b11b21fe84e29d.png
图1.png
请求获取到Permission Group中的任一权限,则该组内其他权限自动被允许.

2. 系统Api使用

1). 创建界面布局
2). 点击按钮打开相机
/**   * 拍照按钮   */  fun takePicture(view: View) {    // 检测权限    if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {      // 用户拒绝了权限,并且点击了不再提醒      if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.CAMERA)) {        // 已经禁止提示        AlertDialog.Builder(this)                .setTitle("提示")                .setMessage("权限已拒绝,是否需要重新开启")                .setPositiveButton("确定") { dialog: DialogInterface?, which: Int ->                  // 设置防止出现不再提示页面,进入权限管理页面                  val intent = Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS)                  val uri = Uri.fromParts("package", packageName, null)                  intent.data = uri                  startActivityForResult(intent, REQUEST_PERMISSION_SETTING)                }                .setNegativeButton("取消", null)                .create()                .show()      } else {        // 无权限        ActivityCompat.requestPermissions(                this,                arrayOf(Manifest.permission.CAMERA),                REQUEST_PERMISSION        )      }    } else {      // 有权限      openCamera()    }  }    /**   * 打开相机   */  private fun openCamera() {    val openCameraIntent = Intent(MediaStore.ACTION_IMAGE_CAPTURE)    startActivity(openCameraIntent)  }
3). 权限结果回调
override fun onRequestPermissionsResult(requestCode: Int, permissions: Array
, grantResults: IntArray) { super.onRequestPermissionsResult(requestCode, permissions, grantResults) // 判断请求码 if (REQUEST_PERMISSION == requestCode) { // 判断grantResults数组不为空 if (grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) { // 用户同意授权 openCamera() } else { // 用户拒绝授权 Toast.makeText(this, "用户拒绝了授权", Toast.LENGTH_SHORT).show() } } }
4). 完整代码
class MainActivity1: AppCompatActivity() {    // 存储静态量  companion object {    /**权限请求*/    val REQUEST_PERMISSION = 0x100    /**权限设置页返回*/    val REQUEST_PERMISSION_SETTING = 0x101  }    override fun onCreate(savedInstanceState: Bundle?) {    super.onCreate(savedInstanceState)    setContentView(R.layout.activity_main)  }      /**   * 拍照按钮   */  fun takePicture(view: View) {    // 检测权限    if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {      // 用户拒绝了权限,并且点击了不再提醒      if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.CAMERA)) {        // 已经禁止提示        AlertDialog.Builder(this)                .setTitle("提示")                .setMessage("权限已拒绝,是否需要重新开启")                .setPositiveButton("确定") { dialog: DialogInterface?, which: Int ->                  // 设置防止出现不再提示页面,进入权限管理页面                  val intent = Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS)                  val uri = Uri.fromParts("package", packageName, null)                  intent.data = uri                  startActivityForResult(intent, REQUEST_PERMISSION_SETTING)                }                .setNegativeButton("取消", null)                .create()                .show()      } else {        // 无权限        ActivityCompat.requestPermissions(                this,                arrayOf(Manifest.permission.CAMERA),                REQUEST_PERMISSION        )      }    } else {      // 有权限      openCamera()    }  }    /**   * 打开相机   */  private fun openCamera() {    val openCameraIntent = Intent(MediaStore.ACTION_IMAGE_CAPTURE)    startActivity(openCameraIntent)  }    override fun onRequestPermissionsResult(requestCode: Int, permissions: Array
, grantResults: IntArray) { super.onRequestPermissionsResult(requestCode, permissions, grantResults) // 判断请求码 if (REQUEST_PERMISSION == requestCode) { // 判断grantResults数组不为空 if (grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) { // 用户同意授权 openCamera() } else { // 用户拒绝授权 Toast.makeText(this, "用户拒绝了授权", Toast.LENGTH_SHORT).show() } } }}
5). 示例效果
img_c046697adc8322e71ec2066ee7b7ca16.gif
图2.gif

3.

1). 添加依赖

// 动态权限管理    implementation 'com.tbruyelle.rxpermissions2:rxpermissions:0.9.5@aar'    implementation 'io.reactivex.rxjava2:rxandroid:2.0.2'
2). 示例代码
class MainActivity : AppCompatActivity() {  // 定义权限类  private lateinit var mRxPermission: RxPermissions    // 存储静态量  companion object {    /**权限设置页返回*/    val REQUEST_PERMISSION_SETTING = 0x101  }    override fun onCreate(savedInstanceState: Bundle?) {    super.onCreate(savedInstanceState)    setContentView(R.layout.activity_main)    mRxPermission = RxPermissions(this)  }      /**   * 拍照按钮   */  fun takePicture(view: View) {    mRxPermission            .requestEachCombined(                    Manifest.permission.CAMERA,                    Manifest.permission.WRITE_EXTERNAL_STORAGE            )            .subscribe { permission ->              when {                permission.granted -> openCamera()                permission.shouldShowRequestPermissionRationale -> showSetting()                else -> {                  Toast.makeText(this, "被拒绝", Toast.LENGTH_SHORT).show()                  showSetting()                }              }            }  }    /**   * 显示权限设置页   */  private fun showSetting() {    // 已经禁止提示    AlertDialog            .Builder(this)            .setTitle("提示")            .setMessage("权限已拒绝,是否需要重新开启")            .setPositiveButton("确定") { dialog: DialogInterface?, which: Int ->              // 设置防止出现不再提示页面,进入权限管理页面              val intent = Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS)              val uri = Uri.fromParts("package", packageName, null)              intent.data = uri              startActivityForResult(intent, REQUEST_PERMISSION_SETTING)            }            .setNegativeButton("取消", null)            .create()            .show()  }    /**   * 打开相机   */  private fun openCamera() {    val openCameraIntent = Intent(MediaStore.ACTION_IMAGE_CAPTURE)    startActivity(openCameraIntent)  }}
3). 效果演示
img_c31d109feafe16f8e0891ee369e4d6ed.gif
图3.gif

转载地址:http://fuuta.baihongyu.com/

你可能感兴趣的文章
聊聊elasticsearch的RoutingService
查看>>
让人抓头的Java并发(一) 轻松认识多线程
查看>>
从源码剖析useState的执行过程
查看>>
地包天如何矫正?
查看>>
中间件
查看>>
Android SharedPreferences
查看>>
css面试题
查看>>
Vue组建通信
查看>>
用CSS画一个带阴影的三角形
查看>>
前端Vue:函数式组件
查看>>
程鑫峰:1.26特朗.普力挺美元力挽狂澜,伦敦金行情分析
查看>>
safari下video标签无法播放视频的问题
查看>>
01 iOS中UISearchBar 如何更改背景颜色,如何去掉两条黑线
查看>>
对象的继承及对象相关内容探究
查看>>
Spring: IOC容器的实现
查看>>
Serverless五大优势,成本和规模不是最重要的,这点才是
查看>>
Nginx 极简入门教程!
查看>>
iOS BLE 开发小记[4] 如何实现 CoreBluetooth 后台运行模式
查看>>
Item 23 不要在代码中使用新的原生态类型(raw type)
查看>>
为网页添加留言功能
查看>>