Android 申请权限如何判断点击过拒绝

在Android应用中,有些功能需要获取用户的权限才能正常运行。当应用需要访问敏感权限时,我们通常需要在运行时动态申请权限。在用户拒绝权限请求后,我们可能需要根据用户的选择采取不同的逻辑处理。本文将介绍如何判断用户是否点击过拒绝权限请求,并提供相关代码示例。

检查权限状态

在动态申请权限之前,我们可以先检查权限的状态。Android提供了checkSelfPermission()方法来检查权限是否已经被授予。

int permissionCheck = ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE);

上述代码中,我们通过checkSelfPermission()方法检查了WRITE_EXTERNAL_STORAGE权限的状态。如果返回值是PackageManager.PERMISSION_GRANTED,表示权限已经被授予。如果返回值是PackageManager.PERMISSION_DENIED,则表示权限被拒绝。

请求权限

如果权限被拒绝,我们需要向用户请求权限。Android提供了requestPermissions()方法来请求权限。

String[] permissions = {Manifest.permission.WRITE_EXTERNAL_STORAGE};
int requestCode = 1;
requestPermissions(permissions, requestCode);

上述代码中,我们通过requestPermissions()方法请求WRITE_EXTERNAL_STORAGE权限。第一个参数是一个权限数组,第二个参数是请求代码。请求代码用于在onRequestPermissionsResult()方法中识别不同的权限请求。

处理权限请求结果

当用户对权限请求做出响应后,系统会调用onRequestPermissionsResult()方法。我们可以在该方法中处理权限请求的结果,并判断用户是否点击过拒绝。

@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
    if (requestCode == 1) {
        if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            // 用户授予权限
            // 在这里处理授权后的逻辑
        } else {
            // 用户拒绝了权限请求
            // 在这里处理拒绝权限后的逻辑
        }
    }
}

上述代码中,我们首先检查请求代码是否匹配,然后判断权限请求的结果。如果grantResults数组中的第一个元素等于PackageManager.PERMISSION_GRANTED,表示权限已被授予。如果用户拒绝了权限请求,则grantResults数组为空。

判断点击过拒绝逻辑

要判断用户是否点击过拒绝权限请求,我们可以使用shouldShowRequestPermissionRationale()方法。该方法用于判断是否应该显示权限请求的解释。

boolean shouldShowRequestPermissionRationale = shouldShowRequestPermissionRationale(Manifest.permission.WRITE_EXTERNAL_STORAGE);

上述代码中,我们通过shouldShowRequestPermissionRationale()方法来判断是否需要解释权限请求。如果返回值为true,表示用户曾经拒绝过权限请求,但尚未勾选“不再询问”选项。如果返回值为false,表示用户要么从未拒绝过权限请求,要么勾选了“不再询问”选项。

完整示例代码

下面是一个完整的示例代码,演示如何判断用户是否点击过拒绝权限请求:

import android.Manifest;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AppCompatActivity;

public class MainActivity extends AppCompatActivity {

    private static final int PERMISSION_REQUEST_CODE = 1;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
            if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
                // 用户曾经拒绝过权限请求
                // 在这里处理拒绝权限后的逻辑
            } else {
                // 用户从未拒绝过权限请求,或者勾选了“不再询问”选项
                ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, PERMISSION_REQUEST_CODE);
            }
        } else {
            // 权限已经被授予
            // 在这里处理授权后的逻辑
        }
    }

    @Override
    public void onRequestPermissionsResult(int