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

这篇具有很好参考价值的文章主要介绍了Android Permission 权限申请,EasyPermission和其他三方库。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

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

一、基本介绍和流程

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

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

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

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

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

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

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

manifest文件:

    <uses-permission android:name="android.permission.CAMERA" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"
        tools:ignore="ScopedStorage" />

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<out String>, 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,实现起来很简单

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

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

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




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<out String>, grantResults: IntArray
    ) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults)

            //将结果转发到EasyPermissions
            EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this)

    }

    override fun onPermissionsGranted(requestCode: Int, perms: MutableList<String>) {
        ToastUtils.showShort("onPermissionsGranted")
    }

    override fun onPermissionsDenied(requestCode: Int, perms: MutableList<String>) {
        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://www.toymoban.com/news/detail-637088.html

到了这里,关于Android Permission 权限申请,EasyPermission和其他三方库的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Android申请权限(相机权限和读写权限)

    开发一个相机应用,需要申请三个权限:相机、读文件、写文件。 初步授权成功

    2024年02月11日
    浏览(54)
  • Android运行时权限Runtime Permission源码分析

    Android 8.1.0 应用使用requestPermissions申请权限时,系统会弹出一个选择窗口,可进行允许。 源码在packages/apps/PackageInstaller/文件下 GrantPermissionsActivity.java是进行权限分配的弹出窗口,通过GrantPermissionsDefaultViewHandler来控制GrantPermissionsActivity的ui视图, 按钮的点击事件是通过GrantPerm

    2024年02月06日
    浏览(40)
  • Android 给广播接收器增加权限(permission)或signature签名权限

    一. 普通权限 1.添加权限         当普通广播接收器需要增加权限时,需要在广播接收器所在的AndroidManifest.xml 文件中添加权限: 注:我查到的资料是 在广播接收器所在的AndroidManifest.xml 文件中添加permission 就行了,uses-permission是添加在广播发送方的,但在我实际调试中我发

    2024年02月07日
    浏览(63)
  • Android之动态申请权限

    Android 6.0 (API 23) 之前应用的权限在安装时全部授予,运行时应用不再需要询问用户。在 Android 6.0 或更高版本对权限进行了分类,对某些涉及到用户隐私的权限可在运行时根据用户的需要动态授予。 Android 6.0以下,在AndroidManifest.xml文件中注册权限即可。 Android 6.0及其以后,既

    2024年02月04日
    浏览(47)
  • Android动态申请权限

    一、在AndroidManifest清单文件中声明要开启的权限 二、代码中动态申请相关权限

    2024年02月06日
    浏览(42)
  • Android 开发中的权限申请

            我们都知道,从 Android 6.0 开始,部分危险权限在 xml 注册的同时,还需要动态申请。 1、需要动态申请的权限         需要动态申请的权限主要分为这 9 类,当然每类中可能不止一个权限,但只要动态申请一个就默认获取整个类别的权限。 2、申请单个权限   

    2024年02月09日
    浏览(55)
  • android11 申请所有文件访问权限

    Android 11 引入了强制执行分区存储的限制,导致应用默认不能访问外部文件。 针对以前涉及较多文件的操作,可采用申请所有文件访问权限的方式来解决这一问题,实现方式如下。 (虽然这样做安全性低,官方并不推荐这样,但确实最快适配原有应用程序的方式) 1. Android

    2024年02月04日
    浏览(45)
  • 【Android从零单排系列四十四】《聊一下Android数据权限permission》

    目录 前言 一.Android 数据权限基本介绍 二 Android 权限分类 三 Android 权限清单 四 Android 动态申请权限DEMO 小伙伴们,在前面的几篇文章中,我们谈到了Android开发中的几种数据存储方式及数据持久化,本文我们介绍下Android开发中的另一部分内容,权限管理。 在Android中,权限管

    2024年02月12日
    浏览(74)
  • Android 10以上出现的 android Permission denied 读写权限问题解决方法

    原因: 从Android 10 开始,应用即使申请了权限,也只能读写自己外部存储的私有目录,就是Android/data/对应应用包名 下的相关目目录。除此之外任何目录的读写都会被拒绝,并提示 android Permission denied。 解决方案 在 AndroidManifest.xml 文件中,在application标签中添加如下属性 and

    2024年02月03日
    浏览(66)
  • android 12 SD动态申请读写权限

    android 12不仅需要在AndroidManifest.xml申请读写权限也需要在代码中动态的申请 关于如何动态申请读写权限仅需要两步 在AndroidManifest.xml文件中申请读写权限 在代码的启动MainActivity中动态申请方法 下面是关于动态权限申请的Manifest.class类大家有兴趣可以去了解下

    2024年02月11日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包