版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Leonidas_Li/article/details/80390702
/**
* Created by Leonidas on 2018/5/14.
* Version: V1.0
* Description:继承了Activity,实现Android6.0的运行时权限检测,
* 需要进行运行时权限检测的Activity可以继承这个类。
* Others: 暂无
* ReviseHistory(Author、Date、RevisePart): 暂无
*/
public class CheckPermissionsActivity extends AppCompatActivity {
/**
* 需要进行检测的权限数组
*/
protected String[] needPermissions = {
Manifest.permission.ACCESS_COARSE_LOCATION,
Manifest.permission.ACCESS_FINE_LOCATION,
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.READ_PHONE_STATE
};
//权限请求码,作为权限请求的标志
private static final int PERMISSIONS_REQUEST_CODE = 0;
/**
* 判断是否需要检测,防止不停的弹框
*/
private boolean isNeedCheck = true;
@Override
protected void onResume() {
super.onResume();
if (isSystemVersionLarge23()) {//判断系统版本是否是Android6.0以上
if (isNeedCheck) {//如果是,则需要检测
checkPermissions(needPermissions);
}
}
}
/**
* 判断系统版本是否是Android6.0以上
* @return
*/
protected boolean isSystemVersionLarge23(){
if (Build.VERSION.SDK_INT >= 23 && getApplicationInfo().targetSdkVersion >= 23)
return true;
else
return false;
}
/**
* 检查权限
* @param permissions
*/
private void checkPermissions(String... permissions) {
try {
if (isSystemVersionLarge23()) {
/*需要请求的权限*/
List<String> needRequestPermissions = findDeniedPermissions(permissions);
if (null != needRequestPermissions && needRequestPermissions.size() > 0) {
requestPermissions(needRequestPermissions.toArray(new String[needRequestPermissions.size()]),PERMISSIONS_REQUEST_CODE);
}
}
} catch (Throwable e) {
}
}
/**
* 获取权限集中需要申请权限的列表
* @param Permissions
* @return
*
*/
private List<String> findDeniedPermissions(String[]Permissions) {
List<String> needRequestPermissionList = new ArrayList<String>();
if (isSystemVersionLarge23()){
try {
for (String perm : Permissions) {
if (checkSelfPermission(perm) != PackageManager.PERMISSION_GRANTED
||shouldShowRequestPermissionRationale(perm)) {//判断权限是否被授予
needRequestPermissionList.add(perm);
}
}
} catch (Throwable e) {
}
}
return needRequestPermissionList;
}
/**
* 检测是否所有的权限都已经授权
* @param grantResults 授权的结果
* @return
*/
private boolean verifyPermissions(int[] grantResults) {
for (int result : grantResults) {
if (result != PackageManager.PERMISSION_GRANTED) {
return false;
}
}
return true;
}
/**
*当进行权限申请,
* 并且用户做出选择后会回调onRequestPermissionsResult这个方法,
* 在这个方法中做相关处理。
* @param requestCode 请求码---要与进行权限申请的requestPermissions方法中的请求码相同,作为权限请求的标志
* @param Permissions 权限
* @param grantResults 权限的“授权结果”
*/
@TargetApi(23)
public void onRequestPermissionsResult(int requestCode, String[] Permissions, int[] grantResults) {
if (requestCode == PERMISSIONS_REQUEST_CODE) {//权限请求码
if (!verifyPermissions(grantResults)) {//判断是否所有需要被授权的权限都被授权了
showMissingPermissionDialog();//有其中一个权限没被授权,显示权限丢失的对话框
isNeedCheck = false;//不需要再进行检查了
}
}
}
/**
* 显示权限丢失的对话框
*/
private void showMissingPermissionDialog() {
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle(R.string.notifyTitle);
builder.setMessage("当前应用缺少必要权限,\n会导致部分功能使用异常。\n\n请点击\"设置\"-\"权限\"-打开所需权限。\n\n");
// 拒绝, 退出应用
builder.setNegativeButton(R.string.cancel,
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
finish();
}
});
builder.setPositiveButton(R.string.setting,
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
startAppSettings();//调用系统的App设置功能
}
});
builder.setCancelable(false);
builder.show();
}
/**
* 启动应用的设置
*/
private void startAppSettings() {
Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
intent.setData(Uri.parse("package:" + getPackageName()));
startActivity(intent);
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if(keyCode == KeyEvent.KEYCODE_BACK){//当按下键盘的回退按钮则退出Activity
this.finish();
return true;
}
return super.onKeyDown(keyCode, event);
}
}
参考:
1.https://www.jianshu.com/p/e1ab1a179fbb
2.http://www.cnblogs.com/zqlxtt/p/4873831.html
3.https://www.jianshu.com/p/b4a8b3d4f587
4.高德地图Demo源码