【Android】Android 申请动态权限

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

权限组 权限
CALENDAR READ_CALENDAR
  WRITE_CALENDAR
CAMERA CAMERA
CONTACTS READ_CONTACTS
  WRITE_CONTACTS
  GET_ACCOUNTS
LOCATION ACCESS_FINE_LOCATION
  ACCESS_COARSE_LOCATION
MICROPHONE RECORD_AUDIO
PHONE READ_PHONE_STATE
  CALL_PHONE
  READ_CALL_LOG
  WRITE_CALL_LOG
  ADD_VOICEMAIL
  USE_SIP
  PROCESS_OUTGOING_CALLS
SENSORS BODY_SENSORS
SMS SEND_SMS
  RECEIVE_SMS READ_SMS
  RECEIVE_WAP_PUSH
  RECEIVE_MMS
STORAGE READ_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;
    }
}

猜你喜欢

转载自blog.csdn.net/HuaLingPiaoXue/article/details/82492758
今日推荐