Android的权限机制从系统的第一个版本就存在了,但是那时候的权限机制对于保护用的安全和隐私起到的作用有限,需要一些权限都是写在AndroidManifest.xml中,用户安装应用的实现提示必须同意这些权限,为此在android 6.0系统中提出了运行时权限的功能,更好的保护了用的安全和隐私。
区别:在系统6.0以前会在安装界面提示需要哪些权限,同意了就可以安装,不同意就拒绝安装,但是日常中离开不了的软件也有我们不需要的权限也开启了,用到用不到不管先申请了再说。而在6.0和之后的版本中,加入了运行时权限,用户不需要在安装时候一次性授权所有的权限,可以在使用应用的时候某些功能需要这些权限在授权。
但是一些普通的权限用户反复的授权也很麻烦,所以android就把所有的权限分为俩大类:普通权限和危险权限。
危险权限 9组
权限组名 | 权限名 |
CONTACTS | WRITE_CONTACTS GET_ACCOUNTS READ_CONTACTS |
PHONE | |
CALENDAR | READ_CALENDAR WRITE_CALENDAR |
CAMERA | CAMERA |
SENSORS | BODY_SENSORS |
LOCATION | ACCESS_FINE_LOCATION ACCESS_COARSE_LOCATION |
STORAGE | READ_EXTERNAL_STORAGE WRITE_EXTERNAL_STORAGE |
MICROPHONE | RECORD_AUDIO |
SMS | READ_SMS RECEIVE_WAP_PUSH RECEIVE_MMS RECEIVE_SMS SEND_SMS READ_CELL_BROADCASTS |
代码权限申请:
public class DynamicPermissionsActivity extends AppCompatActivity {
Button btnP;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_dynamic_permissions);
btnP = (Button) findViewById(R.id.btnP);
btnP.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
getCameraPhoto();
}
});
}
public void getCameraPhoto() {
if (Build.VERSION.SDK_INT>=23) {
int request=ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA);
if (request != PackageManager.PERMISSION_GRANTED)//缺少权限,进行权限申请
{
ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.CAMERA},123);
}
else
{
openCamera();
//已经有权限了 使用相机
Toast.makeText(this,"权限同意",Toast.LENGTH_SHORT).show();
}
}
else{
//低于23 使用相机
openCamera();
}
}
public void openCamera(){
//调用相机
}
/**
*
* @param requestCode 申请权限的时候使用的唯一的申请码
* @param permissions 权限列表
* @param grantResults 户的操作响应 授权结果
*/
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode==123)
{ //当然权限多了,使用Switch 循环
if (grantResults.length > 0 && grantResults[0]==PackageManager.PERMISSION_GRANTED)
{
openCamera();
//可以使用相机
Toast.makeText(this, "权限申请成功",Toast.LENGTH_SHORT).show();
}else if (grantResults[0]== PackageManager.PERMISSION_DENIED)
{
Toast.makeText(this, "权限申请失败,用户拒绝权限", Toast.LENGTH_SHORT).show();
}
}
}
第一步首先判断用户是否已经授权了,使用ContextCompat.checkSelfPermission()方法判断,接收两个参数,第一个参数
Context,第二个参数是具体的权限名。相等就是已经授权了,不相等就是没有授权。
如果已经授权就直接可以打开相机,如果没有授权,就要调用ActivityCompat.requestPermissions()方法来向用户申请授权,requestPermissions()方法接收三个参数,第一个是Context,要求是Activity实例,第二个参数是一个数据,把我们要申请的权限放进去,第三个是请求码,请求可以随便 写,但是必须唯一。
之后会弹出一个权限申请的对话框,让用户选择同意或者不同意,到那会无论永婚选择哪一种都会返回到onRequestPermissionsResult()方法中,而用户授权的结果会封装到grantResults中,我们只需判断一下授权的结果就行,如果同意就调用openCamera()打开相机,不同意就弹出失败提示。