动态申请权限
用于安卓6.0以上
位置
动态权限的申请基本在初始化页面数据的时调用
数据的初始化应避免写在oncreate(),而是写在onResume(),因为每次回到该页面,都会执行这个onResume()方法。可以实时地更新数据
//@Override
protected void onResume() {
super.onResume();
initData();
}
将一些需要用到的常量写成属性。
private String[] contactPermissions = new String[]{
Manifest.permission.READ_CONTACTS,
Manifest.permission.WRITE_CONTACTS
};
private static final int CONTACT_REQUEST_CODE =100;
在initData()方法中先进行动态申请
private void initData() {
int readContacts = ContextCompat.checkSelfPermission(this, Manifest.permission.READ_CONTACTS);
int writeContacts = ContextCompat.checkSelfPermission(this,Manifest.permission.WRITE_CONTACTS);
if (readContacts == PackageManager.PERMISSION_GRANTED && writeContacts ==
PackageManager.PERMISSION_GRANTED){
//开始获取数据
getData();
}else {
ActivityCompat.requestPermissions(this,contactPermissions,CONTACT_REQUEST_CODE);
}
}
private void getData() {
}
最后执行回调方法
/**
* 用户回复后,都会回调这个函数
* @param requestCode
* @param permissions
* @param grantResults 授权的结果保存在此
*/
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
switch (requestCode){
case CONTACT_REQUEST_CODE:
int length = contactPermissions.length;
boolean flag = true;
for (int i=0; i< length;i ++){
//PERMISSION_DENIED为被拒绝的权限集
if (grantResults[i] ==PackageManager.PERMISSION_DENIED){
flag = false;
break;
}
if (flag){
getData();
}
}
}
}