Android动态申请权限(运行时申请权限)

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

目录

1.需要动态申请权限的原因

2.Android权限动态申请


1.需要动态申请权限的原因

  首先,Android权限分为大致两类,一类是普通权限,一类是危险权限,准确地讲其实还有一些特殊的权限,不过这些权限使用得相对较少,我们大致跳过.对于普通权限,系统会自动帮我们进行授权,由于Android对用户的保护,我们通常在进行涉及到危险权限的时候,需要进行动态声明,不然无法通过,会对程序终止,且发出异常

例子如下:

我已经在清单文件中进行权限申请了,但是仍然会出现如下的异常,这是因为>=Android6.0认为打电话是一个危险的权限需要我们进行动态声明

Android动态申请权限(运行时申请权限),android,android studio,kotlin,开发语言

Android动态申请权限(运行时申请权限),android,android studio,kotlin,开发语言

2.Android权限动态申请

package com.quick.testmyphone

import android.Manifest
import android.content.Intent
import android.content.pm.PackageManager
import android.net.Uri
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.view.View
import android.widget.Button
import android.widget.Toast
import androidx.core.app.ActivityCompat
import androidx.core.content.ContextCompat

class MainActivity : AppCompatActivity() {
    private lateinit var mBtn: Button
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        mBtn = findViewById(R.id.call)
        mBtn.setOnClickListener {
            /**
             * 判断用户是否已经给过了对应的权限:
             *   利用ContextCompat.checkSelfPermission方法  (参数一:上下文,参数二:对应的权限名称) 的返回值与
             * PackageManager.PERMISSION_GRANTED 做比较,相等代表已经声明权限
             */
            if (ContextCompat.checkSelfPermission(MainActivity@this, Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED ) {
                /**
                 * 如果不相等,那么调用ActivityCompat.requestPermissions 方法进行权限申明 参数一:上下文, 参数二: string数组用于填写权限名, 参数三: 请求码,唯一值即可
                 */
                ActivityCompat.requestPermissions(
                    MainActivity@this,
                    arrayOf(Manifest.permission.CALL_PHONE),
                    1
                )
            } else {
                // 如果已经声明了权限那么直接就进行打电话操作
                callPhone()
            }

        }
    }

    override fun onRequestPermissionsResult(
        requestCode: Int,
        permissions: Array<out String>,
        grantResults: IntArray
    ) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults)
        when(requestCode) {
            1 -> {
                /**
                 * 由于授权的结果会封装在grantResults 数组中,我们可以进行非空判断后 取出 与 PackageManager.PERMISSION_GRANTED作对比
                 */
                if (grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    callPhone()
                } else {
                    /**
                     * 当用户拒绝的话,显示一个吐司的效果,提醒用户
                     */
                    Toast.makeText(
                        MainActivity@this,
                        "You denied the perssion",
                        Toast.LENGTH_SHORT
                    ).show()
                }
            }
        }
    }

    fun callPhone() {
        /**
         * 进行打电话操作
         */
        val mIntent = Intent(Intent.ACTION_CALL).apply {
            data = Uri.parse("tel:10086")
        }
        startActivity(mIntent)
    }
}

上述代码运行后的效果:

Android动态申请权限(运行时申请权限),android,android studio,kotlin,开发语言文章来源地址https://www.toymoban.com/news/detail-828634.html

到了这里,关于Android动态申请权限(运行时申请权限)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • android 12 SD动态申请读写权限

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

    2024年02月11日
    浏览(42)
  • Android 在程序运行时申请权限——以自动拨打电话为例

    Android 6.0及以上系统在使用危险权限时必须进行运行时权限处理。 main_activity.xml Manifest.xml MainActivity 第一步要先判断用户是不是已经给过我们授权了,借助的是ContextCompat.checkSelfPermission()方法。checkSelfPermission()方法接收两个参数: 第一个参数是Context; 第二个参数是具体的权限

    2024年02月15日
    浏览(36)
  • Android初学之android studio运行java/kotlin程序

    第一步骤: File — New — New Module ,然后弹出一个框,(左边)选择 Java or Kotlin Library ,(右边)编辑自己的图书馆名、包名、类名,选择 Java 一个语言,然后 Finish 如下图: 然后,就可以看见我新建的 java Library 了,如下图: 第二步骤:马上写个测试程序 看看能不能运行

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

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

    2024年02月09日
    浏览(55)
  • 蓝牙开发之-Android12及以下权限申请 及蓝牙详细流程图

    一、蓝牙开发之-权限申请, 直接上代码 第一步、在 AndroidManifest.xml 中 声明下需要的权限 第三步、权限拿到了,就扫描、连接、进行通信 吧 附上流程图

    2024年04月13日
    浏览(54)
  • Android申请权限(相机权限和读写权限)

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

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

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

    2024年02月04日
    浏览(45)
  • Android11及以上 文件读写权限申请

    Android11 读写权限申请 Android11系统对应用写入权限做了严格的限制。本文介绍如何获取文件读写权限。项目中 build.gradle 的 targetSdkVersion = 29 ,会出现读写问题。 当 targetSdkVersion = 29,通过设置requestLegacyExternalStorage=“true”,还能解决。 当 targetSdkVersion = 30后,需要申请所有文件

    2023年04月10日
    浏览(60)
  • android 11后文件读写访问权限申请

    android 11后对文件读写访问权限管理 与 android 10又有了新的要求,导致在读写或者访问时出现error:java.io.FileNotFoundException: /storage/emulated/0/file_path open failed: EACCES (Permission denied),以下为android 11文件管理权限申请办法 回忆android 10 文件访问权限申请 step 1: AndroidManifest中添加权限申

    2024年02月05日
    浏览(47)
  • Android 获取SIM卡号码权限申请

    在AndroidManifest.xml中添加如下权限 uses-permission android:name=\\\"android.permission.READ_PHONE_STATE\\\"/ 如果你只在清单文件中添加权限却没有在代码中获取权限,代码还是会报错的。 报错原因: android 6.0以上增加了动态获取权限api,需要动态获取手机的权限。弹出对话框询问用户,请求用户

    2024年02月08日
    浏览(43)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包