Android 权限管理
1. 危险权限
请求获取到Permission Group中的任一权限,则该组内其他权限自动被允许.
2. 系统Api使用
1). 创建界面布局
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.mazaiting.permissiondemo.MainActivity">
<Button
android:onClick="takePicture"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="拍照"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"/>
</android.support.constraint.ConstraintLayout>
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<out String>, 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<out String>, 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). 示例效果
3. RxPermissions
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). 效果演示
代码下载

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
-
上一篇
魔法秀,让你的 H5 页面秒变 Hybrid APP(混合应用)
原文地址:https://wangfanggang.com/Mobile/native-apex/ 引言 很多时候我们也想要有自己的移动端APP,怎奈还要兼容 iOS、Android 不同平台,开发成本太高。昨天刷 twitter,无意中发现一个好玩的网站 https://gonative.io/,输入任意网址,就可以快速帮你创建好可以部署在 iOS 和 Android 平台上的代码(当然不是免费的,价目表在这里),用来测试移动端效果还不错,有类似需求的同学可以关注一下。 配置步骤 整个配置过程非常简单,只需要填你要生成的网址和你的邮箱,点击生成按钮,稍等几分钟,你的邮箱会收到一封邮件,打开里面的地址,就可以在线体验了。 演示效果 我用 apex.oracle.com 上自带的 demo 应用简单尝试了一下,效果很好,感兴趣的小伙伴也可以直接打开这个网址来体验:https://gonative.io/share/jezbmd username:demopassword:demo 以下是一些截图: iOS 平台 Android 平台 结尾 原理虽然跟微信小程序 WebView 内嵌 H5...
-
下一篇
Android Camera2使用
1. 相机使用流程 图1.jpg 2. SurfaceView /** * Android 5.0 使用Camera2 照相 * 使用SurfaceView显示 * 主要步骤: * 1. 获得摄像头管理器CameraManager mCameraManager,mCameraManager.openCamera()来打开摄像头 * 2. 指定要打开的摄像头,并创建openCamera()所需要的CameraDevice.StateCallback stateCallback * 3. 在CameraDevice.StateCallback stateCallback中调用takePreview(),这个方法中,使用CaptureRequest.Builder创建预览需要的CameraRequest,并初始化了CameraCaptureSession,最后调用了setRepeatingRequest(previewRequest, null, childHandler)进行了预览 * 4. 点击拍照按钮,调用takePicture(),这个方法内,最终调用了capture(mCaptur...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- Linux系统CentOS6、CentOS7手动修改IP地址
- CentOS8编译安装MySQL8.0.19
- CentOS6,CentOS7官方镜像安装Oracle11G
- CentOS关闭SELinux安全模块
- SpringBoot2全家桶,快速入门学习开发网站教程
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- MySQL8.0.19开启GTID主从同步CentOS8
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作