安卓中除了大部分的普通权限外,还有小部分的危险权限,如图:
这些危险权限需要在程序运行所用到时进行动态绑定,普通权限则不需要。
访问http://developer.android.com/reference/android/Manifest.permission.html可以查看Android系统中完整的权限列表。
如何动态申请权限:
1.需要用到ContextCompat.checkSelfPermission()函数来判断是否用户已经授权,此函数有两个参数(第一个参数为context,第二个参数为权限名),然后该函数的返回值与PackageManager.PERMISSION_GRANTED做比较,相同则已经授权,反之没有。
2.如果已经授权按逻辑写代码即可,假设没有授权,则需要通ActivityCompat.requestPermissions()函数来请求授权,该函数有三个参数(第一个参数为activity,第二个参数为权限名,第三个参数为一个固定值)。
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(ContextCompat.checkSelfPermission(getContext(), Manifest.permission.CALL_PHONE)
!= PackageManager.PERMISSION_GRANTED){
ActivityCompat.requestPermissions(getActivity(),new String[]{Manifest.permission.CALL_PHONE},1);
}else {
editText = (EditText) view.findViewById(R.id.edittext);
String number = editText.getText().toString();
callPhone(number);
}
}
});
3.在请求授权后,会回调到onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) 函数中,grantResults保存在授权结果,requestCode保存在刚才申请函数中的固定值。
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
switch (requestCode){
case 1:{
if(grantResults.length > 0&& grantResults[0] == PackageManager.PERMISSION_GRANTED){
editText = (EditText) view.findViewById(R.id.edittext);
String number = editText.getText().toString();
callPhone(number);
}else {
Toast.makeText(getContext(), "授权失败!!!", Toast.LENGTH_SHORT).show();
}
break;
}
}
}
示范结果: