【Android】Android 申请动态权限

本文详细介绍了Android6.0系统中新增的24个危险权限及其分组,如CALENDAR、CAMERA、CONTACTS等,并通过拨打电话权限的具体示例,演示了如何在Android应用中正确申请和使用这些权限。

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

自android 6.0系统后,设定了9组24个危险权限。它们需要在程序运行时申请。

权限组权限
CALENDARREAD_CALENDAR
 WRITE_CALENDAR
CAMERACAMERA
CONTACTSREAD_CONTACTS
 WRITE_CONTACTS
 GET_ACCOUNTS
LOCATIONACCESS_FINE_LOCATION
 ACCESS_COARSE_LOCATION
MICROPHONERECORD_AUDIO
PHONEREAD_PHONE_STATE
 CALL_PHONE
 READ_CALL_LOG
 WRITE_CALL_LOG
 ADD_VOICEMAIL
 USE_SIP
 PROCESS_OUTGOING_CALLS
SENSORSBODY_SENSORS
SMSSEND_SMS
 RECEIVE_SMS READ_SMS
 RECEIVE_WAP_PUSH
 RECEIVE_MMS
STORAGEREAD_EXTERNAL_STORAGE
 WRITE_EXTERNAL_STORAGE

申请权限

这里以拨打电话权限为例,首先将<uses-permission android:name="android.permission.CALL_PHONE" />添加到如下位置。

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.standardlayout">
​
    <uses-permission android:name="android.permission.CALL_PHONE" />
    ...
    <application
       ...
    </application>
​
</manifest>

然后我们在activity中添加button,当点击该button时去拨打电话。

private Button buttonCall;    //呼叫按钮

再为该button设置点击事件,并添加如下代码

buttonCall = findViewById(R.id.id_info_call);
//单击拨打电话
buttonCall.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        //检查权限
        if (checkPermission(InfoActivity.this, Manifest.permission.CALL_PHONE)) {
            callPhone(phoneNum);
        }else {
            //请求权限
            ActivityCompat.requestPermissions(InfoActivity.this,
                    new String[]{Manifest.permission.CALL_PHONE},
                    PERMISSION_REQUEST_CODE);
        }
    }
});

此时,我们看到当点击改button按钮时,会先执行checkPermission()这个自定义函数,用于去判断是否拥有权限。

//检测权限是否授权
private boolean checkPermission(Context context, String permission) {
    //PackageManger 类已安装的应用程序信息
    return PackageManager.PERMISSION_GRANTED == ContextCompat.checkSelfPermission(context,permission);
}

如果checkPermission()返回false的话,则会执行去请求权限

 ActivityCompat.requestPermissions(InfoActivity.this,
                    new String[]{Manifest.permission.CALL_PHONE},
                    PERMISSION_REQUEST_CODE);

如果checkPermission()返回true的话,则会去执行callPhone()这个自定义函数去拨打电话

private void callPhone(String phoneNum) {
    //检查拨打电话权限
    if (ActivityCompat.checkSelfPermission(this, Manifest.permission.CALL_PHONE) == PackageManager.PERMISSION_GRANTED) {
        Intent intent = new Intent(Intent.ACTION_CALL);
        intent.setData(Uri.parse("tel:" + phoneNum));
        startActivity(intent);
    }
}

在第一次请求权限后,会执行下面这个回调函数,我们的授权结果会封装在grantResults当中。

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    switch (requestCode){
        case PERMISSION_REQUEST_CODE:
            if (grantResults.length >0 && grantResults[0] == PackageManager.PERMISSION_GRANTED){
                //请求权限后就拨号
                callPhone(c.getPhone());
                Toast.makeText(this, "授权成功", Toast.LENGTH_SHORT).show();
            }else {
                Toast.makeText(this, "授权失败", Toast.LENGTH_SHORT).show();
            }
            break;
        default:
            break;
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值