android 6.0 权限动态获取示例
来源:互联网 发布:猴赛雷微信软件 编辑:程序博客网 时间:2024/06/05 20:12
话不多话,直接上代码好啦。
-
-
-
根据所需要申请的权限加以判断。获取需要申请权限的集合并申请权限:
private List<String> findDeniedPermissions(String[] permissions) { List<String> needRequestPermissonList = new ArrayList<String>(); for (String perm : permissions) { if (ContextCompat.checkSelfPermission(this, perm) != PackageManager.PERMISSION_GRANTED || ActivityCompat.shouldShowRequestPermissionRationale( this, perm)) { needRequestPermissonList.add(perm); } } return needRequestPermissonList;}
-
-
private void checkPermissions(String... permissions) { List<String> needRequestPermissonList = findDeniedPermissions(permissions); if (null != needRequestPermissonList && needRequestPermissonList.size() > 0) { ActivityCompat.requestPermissions(this, needRequestPermissonList.toArray( new String[needRequestPermissonList.size()]), PERMISSON_REQUESTCODE); }}
--
权限回调中进行处理:
@Overridepublic void onRequestPermissionsResult(int requestCode, String[] permissions, int[] paramArrayOfInt) { if (requestCode == PERMISSON_REQUESTCODE) { if (!verifyPermissions(paramArrayOfInt)) { showMissingPermissionDialog(); isNeedCheck = false; } }}
-主要逻辑简单明了,下面附上全部代码(此处以位置信息权限组示例):
public class CheckPermissionsActivity extends Activity implements ActivityCompat.OnRequestPermissionsResultCallback{ /** * 需要进行检测的权限数组 */ 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 PERMISSON_REQUESTCODE = 0; /** * 判断是否需要检测,防止不停的弹框 */ private boolean isNeedCheck = true; private long mExitTime; @Override protected void onResume() { super.onResume(); if(Build.VERSION.SDK_INT >= 23) { if (isNeedCheck) { checkPermissions(needPermissions); } } } /** * @since 2.5.0 */ private void checkPermissions(String... permissions) { List<String> needRequestPermissonList = findDeniedPermissions(permissions); if (null != needRequestPermissonList && needRequestPermissonList.size() > 0) { ActivityCompat.requestPermissions(this, needRequestPermissonList.toArray( new String[needRequestPermissonList.size()]), PERMISSON_REQUESTCODE); } } /** * 获取权限集中需要申请权限的列表 * * @param permissions * @return * @since 2.5.0 */ private List<String> findDeniedPermissions(String[] permissions) { List<String> needRequestPermissonList = new ArrayList<String>(); for (String perm : permissions) { if (ContextCompat.checkSelfPermission(this, perm) != PackageManager.PERMISSION_GRANTED || ActivityCompat.shouldShowRequestPermissionRationale( this, perm)) { needRequestPermissonList.add(perm); } } return needRequestPermissonList; } /** * 检测是否说有的权限都已经授权 * * @param grantResults * @return * @since 2.5.0 */ private boolean verifyPermissions(int[] grantResults) { for (int result : grantResults) { if (result != PackageManager.PERMISSION_GRANTED) { return false; } } return true; } @Override public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] paramArrayOfInt) { if (requestCode == PERMISSON_REQUESTCODE) { if (!verifyPermissions(paramArrayOfInt)) { showMissingPermissionDialog(); isNeedCheck = false; } } } /** * 显示提示信息 * * @since 2.5.0 */ private void showMissingPermissionDialog() { AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setTitle("提示"); builder.setMessage("当前应用缺少必要权限。\n请点击\n设置-\n权限-\n打开所需权限"); // 拒绝, 退出应用 builder.setNegativeButton("取消", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { finish(); } }); builder.setPositiveButton("设置", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { startAppSettings(); } }); builder.setCancelable(false); builder.show(); } /** * 启动应用的设置 * * @since 2.5.0 */ 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) { exit(); return true; } return super.onKeyDown(keyCode, event); } public void exit() { if ((System.currentTimeMillis() - mExitTime) > 2000) { Toast.makeText(this, "再按一次退出", Toast.LENGTH_SHORT).show(); mExitTime = System.currentTimeMillis(); } else { finish(); System.exit(0); } }}
-> -> ->
6.0权限的适配 主要逻辑已经贴出来了。还没做过权限适配的小伙伴们 抓紧搞起来吧!!
我一直相信一位名人说过的话:
有价值的事物,
应该受到相应的支持,
这样好的东西才能受到鼓励,发扬光大,不好的东西才可能被人忘记。
转载请注明地址!(*^__^*) http://blog.csdn.net/qq_34062297/article/details/77651375
阅读全文
1 0
- android 6.0 权限动态获取示例
- Android M动态获取权限示例
- android 6.0 动态权限获取
- Android 6.0获取动态权限
- android 6.0权限动态获取
- Android 6.0权限动态获取
- Android动态获取权限
- Android 动态获取权限
- Android动态获取权限
- android 动态权限获取
- Android动态获取权限
- Android 6.0动态权限的获取
- Android新特性 - 6.0动态获取权限
- Android 6.0以上系统动态获取权限
- Android 动态获取权限(6.0 , 7.0)
- android 6.0 7.0动态获取权限
- Android M 动态权限获取
- Android M 动态权限获取
- android 设置控件背景颜色
- CentOS基础命令大全
- YouDay 根据你的名字中日记软件编写开源,主流的技术,Rxjava,mvp 等
- 在 Intellij IDEA 中打开别人的工程也使用自己的 MAVEN 仓库(即 repository)
- 剑指offer(九)变态跳台阶
- android 6.0 权限动态获取示例
- 使用cnpm搭建企业内部私有NPM仓库
- js面向对象,封装、继承、多态、静态方法
- Node中的require和import用法详细介绍
- 对AutoResetEvent和ManualResetEvent的理解
- 设计模式的应用场景(4)--原型模式
- TabLayout的简单使用
- Android 设置渐变左右
- 计算学习理论介绍