自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;
}
}