之前一直没有详细全面的了解整个android6.0之后权限的划分和处理,今天抽出些时间整理一下
首先需要了解一下6.0以后权限的分类,分为普通权限和危险权限,普通权限不用说,只需要在清单文件中进行配置即可;对于危险权限就需要我们去动态配置了,如果不进行配置,就会出现崩溃,下面是危险权限
如果是同一组的权限不用重复授权,也就是说,同一组的权限只要有一个授权了,那么同一组的其它权限也都就授权了
那么危险权限我们已经了解了,下一步如何配置呢
首先需要在清单文件中声明我们需要的应用权限,然后就是在需要申请权限的地方进行动态的配置了,以下是详细的配置过程,咱们以获取相机权限为例,首先需要保证您的手机是android6.0以上,同时项目的targetSdkVersion的版本在23以上
首先在清单文件中注册
<uses-permission android:name="android.permission.CAMERA" />
然后就是动态的配置,下边是封装的BaseActivity
/**
* 封装动态权限
*/
public class BaseActivity extends AppCompatActivity{
private PermissionListener mListener;
private static final int PERMISSION_REQUESTCODE = 100;
@Override
public void onCreate(Bundle savedInstanceState, PersistableBundle persistentState) {
super.onCreate(savedInstanceState, persistentState);
}
public void requestRunPermisssion(String[] permissions, PermissionListener listener){
mListener = listener;
List<String> permissionLists = new ArrayList<>();
for(String permission : permissions){
if(ContextCompat.checkSelfPermission(this, permission) != PackageManager.PERMISSION_GRANTED){
permissionLists.add(permission);
}
}
if(!permissionLists.isEmpty()){
ActivityCompat.requestPermissions(this, permissionLists.toArray(new String[permissionLists.size()]), PERMISSION_REQUESTCODE);
}else{
//表示全都授权了
mListener.onGranted();
}
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
switch (requestCode){
case PERMISSION_REQUESTCODE:
if(grantResults.length > 0){
//存放没授权的权限
List<String> deniedPermissions = new ArrayList<>();
for(int i = 0; i < grantResults.length; i++){
int grantResult = grantResults[i];
String permission = permissions[i];
if(grantResult != PackageManager.PERMISSION_GRANTED){
deniedPermissions.add(permission);
}
}
if(deniedPermissions.isEmpty()){
//说明都授权了
mListener.onGranted();
}else{
mListener.onDenied(deniedPermissions);
}
}
break;
default:
break;
}
}
}
调用的地方只需要这样写
initPermission();
private void initPermission() {
requestRunPermisssion(new String[]{Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.READ_PHONE_STATE, Manifest.permission.CHANGE_WIFI_STATE}, new PermissionListener() {
@Override
public void onGranted() {
Toast.makeText(MyMemoryActivity.this, "授权通过", Toast.LENGTH_SHORT).show();
init();
initLocation();
}
@Override
public void onDenied(List<String> deniedPermission) {
for(String permission : deniedPermission){
Toast.makeText(MyMemoryActivity.this, "权限被拒绝:" + permission, Toast.LENGTH_SHORT).show();
}
}
});
}
以上就是我整理的内容,仅限参考
</div>
之前一直没有详细全面的了解整个android6.0之后权限的划分和处理,今天抽出些时间整理一下
首先需要了解一下6.0以后权限的分类,分为普通权限和危险权限,普通权限不用说,只需要在清单文件中进行配置即可;对于危险权限就需要我们去动态配置了,如果不进行配置,就会出现崩溃,下面是危险权限
如果是同一组的权限不用重复授权,也就是说,同一组的权限只要有一个授权了,那么同一组的其它权限也都就授权了
那么危险权限我们已经了解了,下一步如何配置呢
首先需要在清单文件中声明我们需要的应用权限,然后就是在需要申请权限的地方进行动态的配置了,以下是详细的配置过程,咱们以获取相机权限为例,首先需要保证您的手机是android6.0以上,同时项目的targetSdkVersion的版本在23以上
首先在清单文件中注册
<uses-permission android:name="android.permission.CAMERA" />
然后就是动态的配置,下边是封装的BaseActivity
/**
* 封装动态权限
*/
public class BaseActivity extends AppCompatActivity{
private PermissionListener mListener;
private static final int PERMISSION_REQUESTCODE = 100;
@Override
public void onCreate(Bundle savedInstanceState, PersistableBundle persistentState) {
super.onCreate(savedInstanceState, persistentState);
}
public void requestRunPermisssion(String[] permissions, PermissionListener listener){
mListener = listener;
List<String> permissionLists = new ArrayList<>();
for(String permission : permissions){
if(ContextCompat.checkSelfPermission(this, permission) != PackageManager.PERMISSION_GRANTED){
permissionLists.add(permission);
}
}
if(!permissionLists.isEmpty()){
ActivityCompat.requestPermissions(this, permissionLists.toArray(new String[permissionLists.size()]), PERMISSION_REQUESTCODE);
}else{
//表示全都授权了
mListener.onGranted();
}
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
switch (requestCode){
case PERMISSION_REQUESTCODE:
if(grantResults.length > 0){
//存放没授权的权限
List<String> deniedPermissions = new ArrayList<>();
for(int i = 0; i < grantResults.length; i++){
int grantResult = grantResults[i];
String permission = permissions[i];
if(grantResult != PackageManager.PERMISSION_GRANTED){
deniedPermissions.add(permission);
}
}
if(deniedPermissions.isEmpty()){
//说明都授权了
mListener.onGranted();
}else{
mListener.onDenied(deniedPermissions);
}
}
break;
default:
break;
}
}
}
调用的地方只需要这样写
initPermission();
private void initPermission() {
requestRunPermisssion(new String[]{Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.READ_PHONE_STATE, Manifest.permission.CHANGE_WIFI_STATE}, new PermissionListener() {
@Override
public void onGranted() {
Toast.makeText(MyMemoryActivity.this, "授权通过", Toast.LENGTH_SHORT).show();
init();
initLocation();
}
@Override
public void onDenied(List<String> deniedPermission) {
for(String permission : deniedPermission){
Toast.makeText(MyMemoryActivity.this, "权限被拒绝:" + permission, Toast.LENGTH_SHORT).show();
}
}
});
}
</div>