【Android】如何申请定位|存储|运动健康的动态权限+申请权限不弹窗的问题

本文详细介绍了在Android应用中如何申请定位、存储、卫星和运动健康权限,包括在AndroidManifest.xml中添加权限声明、检查权限状态并处理用户许可结果。同时,讨论了在不同Android版本中弹窗请求权限的规则变化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1 如何申请权限的相关代码

定位权限为例

  1. AndroidManifest.xml 中添加用户权限申明,这一步必须写,不然会不弹窗,直接默认拒绝
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <!-- 如果需要精确定位的话请加上此权限 -->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <!-- 如果需要粗略定位的话请加上此权限 -->
  1. 发出请求确认本地是否有权限
ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) 

返回结果为PackageManager.PERMISSION_GRANTED(同意)或者PackageManager.DENIED(不同意)

  1. 如果请求结果为不允许,则需手动发出请求
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, PERMISSION_REQUEST_CODE_1);
  1. 接收请求结果,进行解析与后续操作,可以用来输出log、分析问题所在或者自定义的操作
    注意,这个代码是在继承了AppCompatActivity的类(如MainActivity.java)中直接重写的
 @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
             // 用户已授予权限,执行您的逻辑
             Logd("PERMISSION", "位置权限已赋予");
         } else {
             // 用户拒绝了权限,您可以在这里处理拒绝权限的逻辑
             Logd("PERMISSION", "位置权限已拒绝");
         }
    }

2 申请权限的demo(包括定位、存储、卫星、运动健康)

 private void requestPermissions() {
        // 请求位置权限
        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED
                && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION}, PERMISSION_REQUEST_CODE_1);
        }
        // 申请计步器权限
        if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACTIVITY_RECOGNITION) != PackageManager.PERMISSION_GRANTED
                && android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.Q) {
            ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACTIVITY_RECOGNITION}, PERMISSION_REQUEST_CODE_2);
        }

        // 请求读写文件权限
        if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED
                || ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
            //多个权限一起申请
            ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE}, PERMISSION_REQUEST_CODE_4);
        }
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
            if (!Environment.isExternalStorageManager()) {
                Intent intent = new Intent(Settings.ACTION_MANAGE_ALL_FILES_ACCESS_PERMISSION);
                startActivity(intent);
            }
        }
    }
    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        switch (requestCode){
            case PERMISSION_REQUEST_CODE_1:
                if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    // 用户已授予权限,执行您的逻辑
                    Logd("PERMISSION", "位置权限已赋予");
                } else {
                    // 用户拒绝了权限,您可以在这里处理拒绝权限的逻辑
                    Logd("PERMISSION", "位置权限已拒绝");
                }
                break;
            case PERMISSION_REQUEST_CODE_2:
                if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    // 用户已授予权限,执行您的逻辑
                    Logd("PERMISSION", "运动权限已赋予");
                } else {
                    // 用户拒绝了权限,您可以在这里处理拒绝权限的逻辑
                    Logd("PERMISSION", "运动权限已拒绝");
                }
                break;
            case PERMISSION_REQUEST_CODE_3:
                if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    // 用户已授予权限,执行您的逻辑
                    Logd("PERMISSION", "卫星权限已赋予");
                } else {
                    // 用户拒绝了权限,您可以在这里处理拒绝权限的逻辑
                    Logd("PERMISSION", "卫星权限已拒绝");
                }
                break;
            case PERMISSION_REQUEST_CODE_4:
                if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    // 用户已授予权限,执行您的逻辑
                    Logd("PERMISSION", "存储权限已赋予");
                } else {
                    // 用户拒绝了权限,您可以在这里处理拒绝权限的逻辑
                    Logd("PERMISSION", "存储权限已拒绝");
                }
                break;
        }
    }

在这里插入图片描述

3 申请权限却没有弹窗的一些原因

  • 在AndroidManifest.xml中没有加入显式的权限说明
  • Android版本比较新,有一些新的要求
    如:在Android 10(29)之后,申请文件存储要求在AndroidManifest.xml中的下面增加一句代码
    xml android:requestLegacyExternalStorage="true"
  • 记得在使用某项具体功能之前,加入申请权限的以上代码。(比如可以在app刚启动时申请)
    在这里插入图片描述

一般来说,不弹窗基本上可以确定是AndroidManifest.xml里面的权限少写了拼错了或者漏了某些最新的要求

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值