我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Android Permission 权限申请,EasyPermission和其他三方库

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Android Permission 权限申请,EasyPermission和其他三方库

在Android的实际开发中,经常会因为需求的实现,需要申请用户权限。

今天总结下Android中常用的权限申请。

一、基本介绍和流程

Android中的权限申请是通过应用程序与操作系统之间的交互实现的。在Android中,每个应用程序都被赋予了一组预定义的权限,这些权限定义了应用程序可以执行的操作范围,例如访问摄像头、读取联系人、发送短信等。

当应用程序需要执行需要特定权限的操作时,它必须在运行时向操作系统请求这些权限。以下是Android中的权限申请流程:

  1. 权限声明:在应用程序的清单文件(AndroidManifest.xml)中,开发者需要声明应用程序所需的权限。这些权限声明描述了应用程序需要的访问级别。例如,如果应用程序需要访问设备的摄像头,开发者需要在清单文件中声明相应的权限。

  2. 运行时权限请求:对于一些敏感权限(如访问设备位置、读取联系人等),Android要求应用程序在运行时动态请求这些权限。当应用程序需要执行需要特定权限的操作时,它会向操作系统发起权限请求。

  3. 用户授权:当应用程序发起权限请求时,操作系统会弹出一个对话框,显示权限请求的详细信息,并询问用户是否同意授予该权限。用户可以选择允许或拒绝权限请求。

  4. 权限回调:一旦用户对权限请求做出了响应,系统会将结果通知给应用程序。应用程序可以处理用户的授权结果并相应地执行相应操作。这通常涉及检查权限是否被授予,如果权限被拒绝,则可以采取其他适当的行动。

二、简单的实现 相机和文件读写权限

manifest文件:

            

kotlin核心方法:

companion object {        private const val RC_CAMERA_AND_LOCATION = 123        const val PERMISSION_REQUEST_CODE = 100    }//在onCreate里定义一个按钮添加点击事件normal.setOnClickListener {            // 请求相机和文件读写权限            if (checkPermissions()) {//检查权限                //返回true 则进行接下来的逻辑                ToastUtils.showShort("已经获得权限normal")            } else {                //没有权限,申请权限                requestPermissions()            }        }    private fun requestPermissions() {        ActivityCompat.requestPermissions(            this,            arrayOf(                Manifest.permission.CAMERA,                Manifest.permission.WRITE_EXTERNAL_STORAGE            ),            PERMISSION_REQUEST_CODE        )    }    private fun checkPermissions(): Boolean {        val cameraPermission = ContextCompat.checkSelfPermission(            this,            Manifest.permission.CAMERA        )        val storagePermission = ContextCompat.checkSelfPermission(            this,            Manifest.permission.WRITE_EXTERNAL_STORAGE        )        return cameraPermission == PackageManager.PERMISSION_GRANTED &&                storagePermission == PackageManager.PERMISSION_GRANTED    }//权限申请回掉 override fun onRequestPermissionsResult(        requestCode: Int, permissions: Array, grantResults: IntArray    ) {        super.onRequestPermissionsResult(requestCode, permissions, grantResults)        if (requestCode == PERMISSION_REQUEST_CODE) {            var allPermissionsGranted = true            for (result in grantResults) {                if (result != PackageManager.PERMISSION_GRANTED) {                    allPermissionsGranted = false                    break                }            }            if (allPermissionsGranted) {                //进行            } else {                // 权限未授予,可以执行一些其他操作,如显示权限被拒绝的提示信息等                Log.d(TAG, "Permissions denied")            }        }}

这是自己实现的,很简单,检查权限,请求权限和权限回调全是用的系统的方法。但是现在的权限申请拒绝了的时候,很多手机会默认不在询问,导致用户一次拒绝过后,第二次进来,我们再次请求权限时用户根本不会看见权限授权弹窗,得写个方法去打开用户手机系统的权限设置页才行。

思来想去,偷个懒吧,用三方库

三、EasyPermissions

emmmm,实现起来很简单

build.gradle配置三方库(app下的)

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'}

业务代码(很简单,照着官方文档走就是了)

优点就是方便,且权限被拒绝后,下次申请回弹窗,用户点击后跳转设置页

class MainActivity : AppCompatActivity(), EasyPermissions.PermissionCallbacks {    private lateinit var easyPermissionsTv: TextView    private lateinit var permissionsDispatcherTv: TextView    private lateinit var rxPermissionsTv: TextView    private lateinit var dexterTv: TextView    private lateinit var normal: TextView    var perms =        arrayOf(            android.Manifest.permission.CAMERA,            android.Manifest.permission.ACCESS_FINE_LOCATION        )    companion object {        private const val RC_CAMERA_AND_LOCATION = 123        const val PERMISSION_REQUEST_CODE = 100    }    override fun onCreate(savedInstanceState: Bundle?) {        super.onCreate(savedInstanceState)        setContentView(R.layout.activity_main)        normal = findViewById(R.id.normalPermission)        easyPermissionsTv = findViewById(R.id.EasyPermissions)        permissionsDispatcherTv = findViewById(R.id.PermissionsDispatcher)        dexterTv = findViewById(R.id.Dexter)        rxPermissionsTv = findViewById(R.id.RxPermissions)        easyPermissionsTv.setOnClickListener {            requestCameraPermission()        }    }    private fun requestCameraPermission() {        if (EasyPermissions.hasPermissions(this, *perms)) {            // 已经具有权限            ToastUtils.showShort("已经获得权限")            openCamera()        } else {            EasyPermissions.requestPermissions(                PermissionRequest.Builder(this, RC_CAMERA_AND_LOCATION, *perms)                    .setRationale("需要相机权限和位置权限")                    .setPositiveButtonText("给")                    .setNegativeButtonText("就不给")                    .build()            )        }    }    @AfterPermissionGranted(RC_CAMERA_AND_LOCATION)    private fun openCamera() {        // 在此处执行打开相机的逻辑    }    override fun onRequestPermissionsResult(        requestCode: Int, permissions: Array, grantResults: IntArray    ) {        super.onRequestPermissionsResult(requestCode, permissions, grantResults)            //将结果转发到EasyPermissions            EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this)    }    override fun onPermissionsGranted(requestCode: Int, perms: MutableList) {        ToastUtils.showShort("onPermissionsGranted")    }    override fun onPermissionsDenied(requestCode: Int, perms: MutableList) {        ToastUtils.showShort("onPermissionsDenied")        if (EasyPermissions.somePermissionPermanentlyDenied(this, perms)) {            AppSettingsDialog.Builder(this)                .setRationale("老铁,没有相机权限和位置权限这事儿很难办啊")                .setNegativeButton("就不给就不给")                .setPositiveButton("给你给你给你")                .build().show()        }    }    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {        super.onActivityResult(requestCode, resultCode, data)        if (requestCode == AppSettingsDialog.DEFAULT_SETTINGS_REQ_CODE) {            ToastUtils.showShort("申请权限返回")        }    }}

 关于文件读写权限,由于Android各个版本的异同,有些很烦的区别,且看stack overflow大神的讨论:

WRITE_EXTERNAL_STORAGE when targeting Android 10 - Stack Overflow

4、常用的权限申请框架

  1. EasyPermissions: EasyPermissions是一个轻量级的开源库,简化了Android权限申请的过程。它提供了简单的API,用于请求权限、处理权限回调和解释权限的目的。该库还支持批量请求权限和自定义权限弹窗。

  2. TedPermission: TedPermission是一个易于使用的权限申请库,它提供了简洁的API,并具有可自定义的权限弹窗。该库还支持批量请求权限和处理回调。

  3. RxPermissions: RxPermissions是一个基于RxJava的权限申请库,它提供了使用Observables的方式来请求和处理权限。这使得在响应式编程中更容易处理权限相关的操作。

  4. PermissionsDispatcher: PermissionsDispatcher是一个基于注解的权限申请库,它使用了Java注解处理器技术,通过生成相关代码来简化权限申请过程。使用该库,开发者可以在方法上添加注解来声明所需的权限,并自动生成相关的权限申请和回调代码。

  5. Dexter: Dexter是一个简单而灵活的权限申请库,它通过简洁的API和回调接口来处理权限请求和回调。该库还提供了自定义权限弹窗的功能。

开源库的链接我就不给了,自己去github搜一下,star数都很高,blankj的工具库里面其实也有PermissionUtils.

来源地址:https://blog.csdn.net/LoveFHM/article/details/130836011

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Android Permission 权限申请,EasyPermission和其他三方库

下载Word文档到电脑,方便收藏和打印~

下载Word文档

编程热搜

  • Android:VolumeShaper
    VolumeShaper(支持版本改一下,minsdkversion:26,android8.0(api26)进一步学习对声音的编辑,可以让音频的声音有变化的播放 VolumeShaper.Configuration的三个参数 durati
    Android:VolumeShaper
  • Android崩溃异常捕获方法
    开发中最让人头疼的是应用突然爆炸,然后跳回到桌面。而且我们常常不知道这种状况会何时出现,在应用调试阶段还好,还可以通过调试工具的日志查看错误出现在哪里。但平时使用的时候给你闹崩溃,那你就欲哭无泪了。 那么今天主要讲一下如何去捕捉系统出现的U
    Android崩溃异常捕获方法
  • android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
    系统的设置–>电池–>使用情况中,统计的能耗的使用情况也是以power_profile.xml的value作为基础参数的1、我的手机中power_profile.xml的内容: HTC t328w代码如下:
    android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
  • Android SQLite数据库基本操作方法
    程序的最主要的功能在于对数据进行操作,通过对数据进行操作来实现某个功能。而数据库就是很重要的一个方面的,Android中内置了小巧轻便,功能却很强的一个数据库–SQLite数据库。那么就来看一下在Android程序中怎么去操作SQLite数
    Android SQLite数据库基本操作方法
  • ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
    工作的时候为了方便直接打开编辑文件,一些常用的软件或者文件我们会放在桌面,但是在ubuntu20.04下直接直接拖拽文件到桌面根本没有效果,在进入桌面后发现软件列表中的软件只能收藏到面板,无法复制到桌面使用,不知道为什么会这样,似乎并不是很
    ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
  • android获取当前手机号示例程序
    代码如下: public String getLocalNumber() { TelephonyManager tManager =
    android获取当前手机号示例程序
  • Android音视频开发(三)TextureView
    简介 TextureView与SurfaceView类似,可用于显示视频或OpenGL场景。 与SurfaceView的区别 SurfaceView不能使用变换和缩放等操作,不能叠加(Overlay)两个SurfaceView。 Textu
    Android音视频开发(三)TextureView
  • android获取屏幕高度和宽度的实现方法
    本文实例讲述了android获取屏幕高度和宽度的实现方法。分享给大家供大家参考。具体分析如下: 我们需要获取Android手机或Pad的屏幕的物理尺寸,以便于界面的设计或是其他功能的实现。下面就介绍讲一讲如何获取屏幕的物理尺寸 下面的代码即
    android获取屏幕高度和宽度的实现方法
  • Android自定义popupwindow实例代码
    先来看看效果图:一、布局
  • Android第一次实验
    一、实验原理 1.1实验目标 编程实现用户名与密码的存储与调用。 1.2实验要求 设计用户登录界面、登录成功界面、用户注册界面,用户注册时,将其用户名、密码保存到SharedPreference中,登录时输入用户名、密码,读取SharedP
    Android第一次实验

目录