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