Android动态权限

Android6.0推出了动态权限管理。动态权限管理的添加方便了用户隐私的保护,同时也让开发者添加了多一些代码。

动态权限的使用前提

动态权限管理的使用首先用户的手机系统必须是Android6.0及以上。以及应用程序build.gradle的compileSdkVersion和targetSdkVersion都要设置为23

compileSdkVersion 23
buildToolsVersion "24.0.1"
defaultConfig {
applicationId "com.honso.visitcustomer"
minSdkVersion 15
targetSdkVersion 23
versionCode 1
versionName "1.0"
}

动态权限实用类

public class MPermissionUtils {
private static final MPermissionUtils instance = new MPermissionUtils();
public static MPermissionUtils getInstance() {
return MPermissionUtils.instance;
}
/**
* 申请多个权限
*
* @param context Activity对象
* @param permissions 权限列表
* @param requestCode 请求码
*/
@TargetApi(Build.VERSION_CODES.M)
public void addPermissionsCheck(Activity context, String[] permissions, int requestCode, onPermissionAgreeListener listener) {
//检测是否拥有权限
if (ContextCompat.checkSelfPermission(context, permissions[0]) != PackageManager.PERMISSION_GRANTED) {
//申请权限
ActivityCompat.requestPermissions(context, permissions, requestCode);
} else {
listener.onAgree(requestCode, permissions);
}
}
/**
* 申请多个权限
*
* @param context Activity对象
* @param permissions 权限列表
* @param requestCode 请求码
*/
@TargetApi(Build.VERSION_CODES.M)
public void addPermissionsCheck(Fragment context, String[] permissions, int requestCode, onPermissionAgreeListener listener) {
for (int i = 0; i < permissions.length; i++) {
//检测是否拥有权限
if (context.getActivity().checkSelfPermission(permissions[i]) != PackageManager.PERMISSION_GRANTED) {
//申请权限
context.requestPermissions(permissions, requestCode);
} else {
listener.onAgree(requestCode, permissions);
}
}
}
public interface onPermissionAgreeListener {
void onAgree(int requestCode, String[] permissions);
}

动态权限应用

//申请动态权限,这些属于危险权限就需要通过动态权限申请。并且在Manifest.xml也要声明。
private void checkPermission() {
MPermissionUtils.getInstance().addPermissionsCheck(
this, new String[]{
Manifest.permission.ACCESS_FINE_LOCATION,
Manifest.permission.ACCESS_COARSE_LOCATION,
Manifest.permission.READ_PHONE_STATE,
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.CAMERA,
Manifest.permission.CALL_PHONE
},
PERMISSION_LOCATION_CODE,
new MPermissionUtils.onPermissionAgreeListener() {
@Override
public void onAgree(int requestCode, String[] permissions) {
bindService(new Intent(MainActivity.this, LocationService.class), MainActivity.this, Context.BIND_AUTO_CREATE);
}
});
}
//重写这个方法
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
switch (requestCode) {
case PERMISSION_LOCATION_CODE:
if (grantResults.length > 0) {
for (int i = 0; i < grantResults.length; i++) {
if (grantResults[i] == PackageManager.PERMISSION_GRANTED) {
bindService(new Intent(MainActivity.this, LocationService.class), this, Context.BIND_AUTO_CREATE);
} else {
checkPermission();
}
}
} else {
checkPermission();
}
break;
}
}
坚持原创技术分享,您的支持将鼓励我继续创作!