Android申请权限,没有给权限直接finish()结束

本文讲述了在Android12模拟器上测试应用权限请求时遇到的问题,包括权限弹框行为、连续拒绝权限处理和强制申请存储权限的方法,以及在权限被拒绝后的解决策略。

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

android申请权限
可以设置三个函数对整个应用的权限做处理

checkPermissions()

checkPermissions中检查所有权限是否本身就已经给予
使用ContextCompat.checkPermission()

requestPermissions()

发起权限请求弹框
有一个请求码区分 与 OnRequestPermissionsResult()呼应区分出这次的请求

ActivityCompat.shouldShowRequestPermissionRationale(this,
Manifest.permission.CAMERA)
可以检查是否用户已经勾选了不在禁止后不再提示
理论上这句可以不要,刁民都会不给权限了,肯定知道怎么重新打开
如果想考虑这个人笨的情况可以引导去设置重新打开

使用ActivityCompat.requestPermissions()

OnRequestPermissionsResult()

其中OnRequestPermissionsResult()是重写的方法
在ActivityCompat.requestPermissions()点击了允许或不允许之后程序会直接调用此函数,如果深耕为什么会自己回调,
就像OnCreate()在页面被创建时会自己调起一样
原理其实可以去 Ctrl B, 跳去ActivityCompat去分析一下,不过为了节约时间,将时间花到更多美好的地方我们所作的方式基本都是询问AI或者直接请教更加大神的人或者直接放弃我当一个定理记住即可。

grantResults[]就是requestPermissions中String权限组对应的权限响应结果,位置一致
在这里可以做到拦截未赋予权限的情况,以下使用的方式是未赋予权限直接finish完成退出页面。

注意点:

获取相关权限需要在Manifest中声明不同android版本可能权限的属性值可能还会不一样,在Mainfest中声明之后,长按android应用点击-详细信息-权限中就能看到相关的权限了。

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          xmlns:tools="http://schemas.android.com/tools">

    <uses-permission android:name="android.permission.READ_MEDIA_IMAGES"/>
    <uses-permission android:name="android.permission.READ_CONTACTS" />
    <application
            android:allowBackup="true"
            android:dataExtractionRules="@xml/data_extraction_rules"
            android:fullBackupContent="@xml/backup_rules"
            android:icon="@mipmap/ic_launcher"
            android:label="@string/app_name"
            android:roundIcon="@mipmap/ic_launcher_round"
            android:supportsRtl="true"
            android:theme="@style/Theme.Notebook"
            tools:targetApi="31">
        <activity
                android:name=".MainActivity"
                android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>

                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
        </activity>

        <activity android:name=".PicturePickerActivity"
                  android:exported="true">
        </activity>
    </application>

</manifest>
	private static final int PERMISSION_REQUEST_CODE = 1;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.ps_item_grid_image);
        if (checkPermissions()) {
            //做得到权限之后的事情
        } else {
            requestPermissions();
        }


    }

    private boolean checkPermissions() {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
            return ContextCompat.checkSelfPermission(this, Manifest.permission.READ_MEDIA_IMAGES) == PackageManager.PERMISSION_GRANTED &&
                    ContextCompat.checkSelfPermission(this, Manifest.permission.READ_CONTACTS) == PackageManager.PERMISSION_GRANTED;
        } else {
            return ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED &&
                    ContextCompat.checkSelfPermission(this,Manifest.permission.READ_CONTACTS) == PackageManager.PERMISSION_GRANTED;
        }
    }

    private void requestPermissions() {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
            ActivityCompat.requestPermissions(this,
                    new String[]{Manifest.permission.READ_MEDIA_IMAGES, Manifest.permission.READ_CONTACTS},
                    PERMISSION_REQUEST_CODE);
        } else {
            ActivityCompat.requestPermissions(this,
                    new String[]{Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.READ_CONTACTS},
                    PERMISSION_REQUEST_CODE);
        }
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if (requestCode == PERMISSION_REQUEST_CODE) {
            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED && grantResults[1] == PackageManager.PERMISSION_GRANTED) {
                Toast.makeText(this, "所有权限都被赋予", Toast.LENGTH_SHORT).show();
                //做得到权限之后的事情
            } else if(grantResults.length > 0 && grantResults[0] != PackageManager.PERMISSION_GRANTED){
                Toast.makeText(this, "权限被拒绝,无法获取图片", Toast.LENGTH_SHORT).show();
                this.finish();
                //未得到权限 ,将页面结束防止未得到权限还是用权限的情况,会出现anr弹框
            } else if(grantResults.length>0 && grantResults[1] != PackageManager.PERMISSION_GRANTED){
                Toast.makeText(this, "权限被拒绝,无法读取联系人", Toast.LENGTH_SHORT).show();
                this.finish();
            } else{
                this.finish();
            }
        }


    }

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值