[摘]android6.0运行时动态申请权限

Android  2020年3月17日 pm10:49发布5年前 (2020)更新 城堡大人
126 0 0

Android6.0以后,Android是不会主动获取需要权限,改为了需要提示用户手动获取,系统应用除外。

1. 运行时获得权限:

从androi 6.0开始,不再是安装应用时用户确定获得全部的权限.而是在使用软件过程中需要该权限时,弹出对话框让用户选择权限.不仅如此,用户选择权限后还可以关闭。

2. 检查是否获得权限:

通过 ContextCompat.checkSelfPermission(context,permission)方法,方法返回值为 PackageManager.PERMISSION_GRANTED or PackageManager.PERMISSION_DENIED

int permissionCheck = ContextCompat.checkSelfPermission(this,
                Manifest.permission.WRITE_CALENDAR);
        if (permissionCheck == PackageManager.PERMISSION_GRANTED) {
            Toast.makeText(PermissionActivity.this, "hava this permission", Toast.LENGTH_SHORT).show();
        }else {
            Toast.makeText(PermissionActivity.this, "no this permission", Toast.LENGTH_SHORT).show();
        }

3. 请求权限:

通过ActivityCompat.requestPermissions(activity,permissions,requestCode)第二个参数是一个String数组,第三个参数是请求码便于在onRequestPermissionsResult 方法中根据requestCode进行判断.

 ActivityCompat.requestPermissions(PermissionActivity.this,
                        new String[]{Manifest.permission.READ_CONTACTS},
                        MY_PERMISSIONS_REQUEST_READ_CONTACTS);

4. 请求权限后的回调:

请求权限后会回调onRequestPermissionsResult方法,在activity中重写onRequestPermissionsResult(requestCode,permissions,grantResults)方法 grantResults是int类型的数组每个值为PackageManager.PERMISSION_GRANTED or PackageManager.PERMISSION_DENIED 分别对应permissions的每个请求。

     @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {

        switch (requestCode) {
            case MY_PERMISSIONS_REQUEST_READ_CONTACTS: {
                // If request is cancelled, the result arrays are empty.
                if (grantResults.length > 0
                        && grantResults[0] == PackageManager.PERMISSION_GRANTED) {


                } else {

                }

            }
        }

    }

5、动态请求权限

  //6.0之后要动态获取权限,重要!!!
    protected void judgePermission() {

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            // 检查该权限是否已经获取
            // 权限是否已经 授权 GRANTED---授权  DINIED---拒绝

            // sd卡权限
            String[] SdCardPermission = {Manifest.permission.WRITE_EXTERNAL_STORAGE};
            if (ContextCompat.checkSelfPermission(this, SdCardPermission[0]) != PackageManager.PERMISSION_GRANTED) {
                // 如果没有授予该权限,就去提示用户请求
                ActivityCompat.requestPermissions(this, SdCardPermission, 100);
            }

            //手机状态权限
            String[] readPhoneStatePermission = {Manifest.permission.READ_PHONE_STATE};
            if (ContextCompat.checkSelfPermission(this, readPhoneStatePermission[0]) != PackageManager.PERMISSION_GRANTED) {
                // 如果没有授予该权限,就去提示用户请求
                ActivityCompat.requestPermissions(this, readPhoneStatePermission, 200);
            }

            //定位权限
            String[] locationPermission = {Manifest.permission.ACCESS_FINE_LOCATION};
            if (ContextCompat.checkSelfPermission(this, locationPermission[0]) != PackageManager.PERMISSION_GRANTED) {
                // 如果没有授予该权限,就去提示用户请求
                ActivityCompat.requestPermissions(this, locationPermission, 300);
            }

            String[] ACCESS_COARSE_LOCATION = {Manifest.permission.ACCESS_COARSE_LOCATION};
            if (ContextCompat.checkSelfPermission(this, ACCESS_COARSE_LOCATION[0]) != PackageManager.PERMISSION_GRANTED) {
                // 如果没有授予该权限,就去提示用户请求
                ActivityCompat.requestPermissions(this, ACCESS_COARSE_LOCATION, 400);
            }


            String[] READ_EXTERNAL_STORAGE = {Manifest.permission.READ_EXTERNAL_STORAGE};
            if (ContextCompat.checkSelfPermission(this, READ_EXTERNAL_STORAGE[0]) != PackageManager.PERMISSION_GRANTED) {
                // 如果没有授予该权限,就去提示用户请求
                ActivityCompat.requestPermissions(this, READ_EXTERNAL_STORAGE, 500);
            }

            String[] WRITE_EXTERNAL_STORAGE = {Manifest.permission.WRITE_EXTERNAL_STORAGE};
            if (ContextCompat.checkSelfPermission(this, WRITE_EXTERNAL_STORAGE[0]) != PackageManager.PERMISSION_GRANTED) {
                // 如果没有授予该权限,就去提示用户请求
                ActivityCompat.requestPermissions(this, WRITE_EXTERNAL_STORAGE, 600);
            }

        }else{
            //doSdCardResult();
        }
        //LocationClient.reStart();
    }

本文摘抄如下

1、android6.0运行时权限详解 [直通车]

2、Android动态获取权限(读写、获取手机状态、定位)[直通车]

 历史上的今天

  1. 2019: fastboot卡在waiting for device(0条评论)
版权声明 1、 本站名称: 笔友城堡
2、 本站网址: https://www.biumall.com/
3、 本站部分文章来源于网络,仅供学习与参考,如有侵权,请留言

暂无评论

暂无评论...

随机推荐

钱钟书:论快乐

在旧书铺里买回来维尼(vigny)的《诗人日记》(journaldunpote),信手翻开,就看见有趣的一条。他说,在法语里,喜乐(bonheur)一个名词是“好”和“钟点”两字拼成,可见好事多磨,只是个把钟头的玩意儿。我们联想到我们本国话的说法,也同样的意味深长,譬如快活或快乐的快字,就把人生一切...

Android ListView子item高度定长固定值无效问题详解

前言最近做显示音乐列表信息时,发现ListView的Item布局中固定的高度失效了,怎么设置这个高度都失效。参考网用和自己折腾过程,记录一下,防止下次忘记。总结整理一下原因:1. LayoutInflater.inflate(int resource, ViewGroup root)...

Activity的Context介绍

前言对于Application,Activity和Service这几个类,我们是很[熟悉]的。确实[熟悉],作为App开发这基本都要面对这几个类。比较好奇的朋友会发现,他们都拥有Context,但他们的Context有似乎有一点点的不同。今天有空,根据网上大佬的步伐,在这里简单记录一下。正文...

朱自清:背影

那年冬天,祖母死了,父亲的差使也交卸了,正是祸不单行的日子。我从北京到徐州打算跟着父亲奔丧回家。到徐州见着父亲,看见满院狼藉的东西,又想起祖母,不禁簌簌地流下眼泪。父亲说:“事已如此,不必难过,好在天无绝人之路!”回家变卖典质,父亲还了亏空;又借钱办了丧事。这些日子,家中光景很是惨淡,一半为了丧事...

常用的简单monkey测试命令集合

前言Monkey是Android中的一个命令行工具,可以运行在模拟器里或实际设备中。它向系统发送伪随机的用户事件流(如按键输入、触摸屏输入、手势输入等),实现对正在开发的应用程序进行测试。Monkey测试是一种为了测试软件的稳定性、健壮性的快速有效的方法。正文下面整理了一下黑名单和白名单...

List排序简单记录

前言简单整理一下List的集合的排序,简单的记录一下,方便自己后续查阅。正文这里介绍一下使用Comparable和Comparator进行排序Comparable在实现的FileInfo实现Comparable,然后实现排序compareTo()即可。具体如下public class ...