Android 6.0RunTime Permission完美解决方案
来源:互联网 发布:mac androidsdk 编辑:程序博客网 时间:2024/05/19 21:15
Android6.0新引进了全新的权限管理方式,不了解的可以先去查看
Android 6.0 新特性之 RunTime Permissions :http://blog.csdn.net/u011068996/article/details/50517869
本文主要讲解在android6.0中的动态权限管理的解决方案。
在6.0中需要动态获取权限,而在动态获取权限的时候,默认提示框包含不在提示按钮,一旦用户勾选了不在提示,那么默认的系统提示框就不会再出现,因此我们需要自定义系统提示框。
在Api 23中, 权限需要动态获取, 核心权限必须满足. 标准流程:
下面我们以读取文件权限为例,演示对动态权限获取的解决方案.
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) { // 注意这里要使用shouldShowRequestPermissionRationale而不要使用requestPermission方法 // 因为requestPermissions方法会显示不在询问按钮 if (ActivityCompat.shouldShowRequestPermissionRationale((Activity) mContext, permission)) { //如果用户以前拒绝过改权限申请,则给用户提示 showMissingPermissionDialog(); } else { //进行权限请求 ActivityCompat.requestPermissions((Activity) mContext, new String[]{permission}, resultCode); }// 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); }}
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{ //如果请求成功,则进行相应的操作,比如我们这里打开一个新的Activity 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) { //如果请求成功,则进行相应的操作,比如我们这里打开一个新的Activity Intent intent = new Intent(MainActivity.this,PermissionActivity.class); startActivity(intent); } else { //如果请求失败 mPermissionHelper.startAppSettings(); } break; } }}
动态权限授权虽然给程序员带来了一些麻烦,但是Google这样做也是为了Android能有更好的用户体验和更高的安全系数,最后祝愿移动开发越来越好(因为我也是IOS程序员 0.0)。
代码地址:http://download.csdn.net/detail/u011068996/9421242
1 0
- Android 6.0RunTime Permission完美解决方案
- Android 6.0RunTime Permission完美解决方案
- Android 6.0 Runtime Permission 机制
- 浅谈Android 6.0之Runtime Permission
- Android 6.0新特性之Runtime Permission
- Android M Runtime Permission
- Android Runtime Permission
- Android runtime permission
- Android M Runtime Permission 介绍
- Android M Runtime Permission 介绍
- Android M Runtime Permission 介绍
- Android 6.0及更高版本Android Runtime Permission(一)
- Android 6.0动态权限 Runtime Permission API使用
- Android动态权限管理:Android Runtime Permission.
- Android RunTime Permission 运行时权限
- Android M权限管理机制:Runtime Permission简介
- 关闭 Android 6.0及更高版本Android Runtime Permission(二)
- android运行时权限(Android Runtime Permission )
- 程序开发路上的历程(中)
- Android事件分发深入分析
- tomcat 配置文件
- java Pattern和Matcher详解
- mysql : The user specified as a definer ('root'@'%') does not exist
- Android 6.0RunTime Permission完美解决方案
- 美术同学最近自己找了个shader用来做动态的草和旗,结果出了一些问题(顶点动画shader)
- Swift 常识篇二
- spark 博客
- Git学习笔记(二)
- 常用Java注释标签
- Volley简介
- 几个必须熟练使用的注解
- spark transform系列__reduceByKey