Android6.0新引进了全新的权限管理方式,不了解的可以先去查看
Android 6.0 新特性之 RunTime Permissions :http://blog.csdn.net/u011068996/article/details/50517869
本文主要讲解在android6.0中的动态权限管理的解决方案。
在6.0中需要动态获取权限,而在动态获取权限的时候,默认提示框包含不在提示按钮,一旦用户勾选了不在提示,那么默认的系统提示框就不会再出现,因此我们需要自定义系统提示框。
在Api 23中, 权限需要动态获取, 核心权限必须满足. 标准流程:
![这里写图片描述](http://upload-images.jianshu.io/upload_images/749674-475b237e6c7edcf4.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
下面我们以读取文件权限为例,演示对动态权限获取的解决方案.
1 、 权限检测工具
public class PermissionHelper {
private Context mContext;
public static final String PACKAGE = "package:";
public PermissionHelper(Context context) {
this.mContext = context;
}
/**
* 判断权限集合
*
* @param permissions 检测权限的集合
* @return 权限已全部获取返回true,未全部获取返回false
*/
public boolean checkPermissions(String... permissions) {
for (String permission : permissions) {
if (!checkPermission(permission)) {
return false;
}
}
return true;
}
/**
* 判断权限是否获取
*
* @param permission 权限名称
* @return 已授权返回true,未授权返回false
*/
public boolean checkPermission(String permission) {
return ContextCompat.checkSelfPermission(mContext, permission) == PackageManager.PERMISSION_GRANTED;
}
/**
* 获取权限
*
* @param resultCode
* @return
*/
public void permissionsCheck(String permission, int resultCode) {
if (ActivityCompat.shouldShowRequestPermissionRationale((Activity) mContext, permission)) {
showMissingPermissionDialog();
} else {
ActivityCompat.requestPermissions((Activity) mContext,
new String[]{permission},
resultCode);
}
}
private void showMissingPermissionDialog() {
AlertDialog.Builder builder = new AlertDialog.Builder(mContext);
final AlertDialog alertDialog = builder.create();
builder.setMessage("当前应用缺少必要权限。\n\n请点击\"设置\"-\"权限\"-打开所需权限。\n\n最后点击两次后退按钮,即可返回。");
builder.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override public void onClick(DialogInterface dialog, int which) {
alertDialog.dismiss();
}
});
builder.setPositiveButton("设置", new DialogInterface.OnClickListener() {
@Override public void onClick(DialogInterface dialog, int which) {
startAppSettings();
}
});
builder.show();
}
public void startAppSettings() {
Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
intent.setData(Uri.parse( PACKAGE + mContext.getPackageName()));
mContext.startActivity(intent);
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
2、主界面
假设进入主界面的时候需要获取到文件访问权限,获取成功的话,进入另一个Activity,在onResume()方法中判断获取权限状态。
public class MainActivity extends AppCompatActivity {
private static final int WRITE_RESULT_CODE = 12;
private static final String WRITE_PERMISSION = Manifest.permission.WRITE_EXTERNAL_STORAGE;
private PermissionHelper mPermissionHelper;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mPermissionHelper = new PermissionHelper(this);
}
@Override
protected void onResume() {
super.onResume();
boolean b = mPermissionHelper.checkPermission(WRITE_PERMISSION);
if (!b){
mPermissionHelper.permissionsCheck(WRITE_PERMISSION,WRITE_RESULT_CODE);
}else{
Intent intent = new Intent(MainActivity.this,PermissionActivity.class);
startActivity(intent);
}
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
switch(requestCode){
case WRITE_RESULT_CODE:
if (grantResults.length > 0
&& grantResults[0] == PackageManager.PERMISSION_GRANTED) {
Intent intent = new Intent(MainActivity.this,PermissionActivity.class);
startActivity(intent);
} else {
mPermissionHelper.startAppSettings();
}
break;
}
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
动态权限授权虽然给程序员带来了一些麻烦,但是Google这样做也是为了Android能有更好的用户体验和更高的安全系数,最后祝愿移动开发越来越好(因为我也是IOS程序员 0.0)。
代码地址:http://download.csdn.net/detail/u011068996/9421242