Android开发学习日记--运行时动态申请应用权限

本文详细介绍了如何在Android应用中动态请求READ_CONTACTS、WRITE_CONTACTS和SMS权限,包括使用Manifest文件配置、ContextCompat和ActivityCompat进行权限检查和请求,以及处理用户权限选择的回调。

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

一、效果展示

 

 二、实现步骤

1.使用时在申请权限

        首先想要应用拥有权限,那么一开始就要在清单文件Manifest中添加相关语句:

    <uses-permission android:name="android.permission.READ_CONTACTS"/>
    <uses-permission android:name="android.permission.WRITE_CONTACTS"/>
    <uses-permission android:name="android.permission.READ_SMS"/>
    <uses-permission android:name="android.permission.SEND_SMS"/>

        如果是Android6.0以上才用动态申请权限,也就是下面要讲的。

        第一步,检查APP是否开启了指定权限,这里使用ContextCompat的checkSelfPermission方法,该方法的第一个参数为活动实例,第二个参数为待检查的权限名称。

        第二步,请求系统弹窗,以便用户选择是否开启权限。调用ActivityCompat的requestPermissions方法,即可命令系统自动弹出权限申请窗口,该方法的第一个参数为活动实例,第二个参数为待申请的权限名称数组,第三个参数为本次操作的请求代码。

        第三步,判断用户的权限选择结果。回调方法onRequestPermissionsResult,如果当前页面请求弹出权限申请窗口,那么该页面的Java代码必须重写onRequestPermissionsResult方法,并在该方法内部处理用户的权限选择结果。

完整代码:

先写个工具类PermissionUtil

public class PermissionUtil {

    //判断是否所有权限都被批准
    public static boolean checkGrant(int[] grantResults){
        if(grantResults!=null){
            for(int grant:grantResults){
                if(grant==PackageManager.PERMISSION_DENIED)
                    return false;
            }
        }
        return true;
    }

    public static boolean checkPermission(Activity activity,String permission,int requestCode){
        return checkPermissions(activity,new String[]{permission},requestCode);
    }

    public static boolean checkPermissions(Activity activity,String[] permissions,int requestCode)
    {
        //在Android6.0之后才需要获取动态权限
        if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.M){
            int check= PackageManager.PERMISSION_GRANTED;
            for(String permission:permissions){
                //监测permission权限是否批准
                check=ContextCompat.checkSelfPermission(activity,permission);
                if(check!=PackageManager.PERMISSION_GRANTED){  //当前权限没开启
                    //请求系统弹窗,申请权限
                    ActivityCompat.requestPermissions(activity,permissions,requestCode);
                    return false;
                }
            }
        }
        return true;
    }
}

Activity代码:

public class applyPermission extends AppCompatActivity implements View.OnClickListener {

    //通讯录所需要的权限
    private final String[] PERMISSION_CONTACTS=new String[]{
            Manifest.permission.READ_CONTACTS,
            Manifest.permission.WRITE_CONTACTS,
    };

    //短信所需要的权限
    private final String[] PERMISSION_SMS=new String[]{
            Manifest.permission.READ_SMS,
            Manifest.permission.SEND_SMS,
    };

    private final int REQUEST_CONTACTS=1;      //获取通讯录权限的请求代码
    private final int REQUEST_SMS=2;           //获取短信全权限的请求代码


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_apply_permission);
        findViewById(R.id.bt_contacts).setOnClickListener(this);
        findViewById(R.id.bt_sms).setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()){
            case R.id.bt_contacts:
                PermissionUtil.checkPermissions(this,PERMISSION_CONTACTS,REQUEST_CONTACTS);
                break;
            case R.id.bt_sms:
                PermissionUtil.checkPermissions(this,PERMISSION_SMS,REQUEST_SMS);
                break;
        }
    }

    //ActivityCompat.requestPermissions的回调函数
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        switch (requestCode)
        {
            case REQUEST_CONTACTS:
                if(PermissionUtil.checkGrant(grantResults))
                    Toast.makeText(this, "通讯录权限获取成功!", Toast.LENGTH_SHORT).show();
                else {
                    Toast.makeText(this, "通讯录权限获取失败!", Toast.LENGTH_SHORT).show();
                    jumpToSettings();     //跳转到应用设置界面
                }
                    break;
            case REQUEST_SMS:
                if(PermissionUtil.checkGrant(grantResults))
                    Toast.makeText(this, "短信权限获取成功!", Toast.LENGTH_SHORT).show();
                else {
                    Toast.makeText(this, "短信权限获取失败!", Toast.LENGTH_SHORT).show();
                    jumpToSettings();
                }
        }
    }

    //跳转到应用设置页面
    public void jumpToSettings(){
        Intent intent=new Intent();
        intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
        intent.setData(Uri.fromParts("package", getPackageName(), null));
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        startActivity(intent);
    }
}

2.启动时申请权限

这种情况大多出现在刚安装完软件,进入软件的时候。

这种情况只用稍微修改下上面的代码即可:

 private final int REQUEST_ALL=3;

 private final String[] PERMISSION_ALL=new String[]{
            Manifest.permission.READ_CONTACTS,
            Manifest.permission.WRITE_CONTACTS,
            Manifest.permission.READ_SMS,
            Manifest.permission.SEND_SMS
    };   //这个是所有用到的权限,全部放到这里

在activity 的onCreate方法中加入下面的语句:

        PermissionUtil.checkPermissions(this,PERMISSION_ALL,REQUEST_ALL);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值