权限流程图:
第一次弹出 选择拒绝-》弹出提醒对话框改权限功能-》 确定拒绝是 关闭当前页面
                                -》 确定拒绝否 --》继续申请该权限
第二次弹出 选择绝对不允许-》 弹出设置告诉用户需要在设置中打开权限-》 点击确定跳入设置中
第三次: 弹出跳入设置对话框,用户手动在设置中打开

compile 'com.yanzhenjie:permission:1.0.5'

========================================================================

package com.denganzhi.permission;

import com.yanzhenjie.permission.AndPermission;
import com.yanzhenjie.permission.PermissionNo;
import com.yanzhenjie.permission.PermissionYes;

public class PermissionActivity extends AppCompatActivity {
    ImageView permission_bitmap;

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_permission);
        permission_bitmap = (ImageView)findViewById(R.id.permission_bitmap);
    // 开始
        sendPermeission();
    }

 // 权限测试使用
    private  String iMei="";
    public  void readImg(View view){
        if (ActivityCompat.checkSelfPermission(PermissionActivity.this, Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED) {
            //没有权限
            Toast.makeText(PermissionActivity.this,"imei:没有权限",Toast.LENGTH_SHORT).show();
        }else {
            //有权限
            iMei = ((TelephonyManager) getSystemService(TELEPHONY_SERVICE)).getDeviceId();
            Toast.makeText(PermissionActivity.this,"imei:"+iMei,Toast.LENGTH_SHORT).show();

}

}
  // 1.第一次弹出
    private  void sendPermeission(){
        AndPermission.with(this).requestCode(100).permission(Manifest.permission.WRITE_EXTERNAL_STORAGE) .send();
    }

// 2.第一次弹出选择允许,继续申请其他权限
    // 成功回调的方法,用注解即可,里面的数字是请求时的requestCode。
    @PermissionYes(100)
    private void getLocationYes(List<String> grantedPermissions) {
        // TODO 申请权限成功。
        AndPermission.with(this).requestCode(101).permission(Manifest.permission.READ_PHONE_STATE) .send();
    }
// 申请第二个权限
    @PermissionYes(101)
    private void gePhoneStatYes(List<String> grantedPermissions) {
        // TODO 申请权限成功。
        Toast.makeText(PermissionActivity.this,"读取手机卡状态!!!",Toast.LENGTH_SHORT).show();
       // AndPermission.with(this).requestCode(102).permission(Manifest.permission.WRITE_EXTERNAL_STORAGE).send();

}   // 成功回调的方法,用注解即可,里面的数字是请求时的requestCode。

// 第一个权限申请选择拒绝,或者第二次弹出选择永久拒绝处理
    // 失败回调的方法,用注解即可,里面的数字是请求时的requestCode。
    @PermissionNo(100)
    private void getLocationNo(List<String> deniedPermissions) {
        // 用户否勾选了不再提示并且拒绝了权限,那么提示用户到设置中授权。
        Log.e("getLocationNo: ","1111" );
        // 第二次 用户否勾选复选框了不再提示并且永久拒绝了权限,那么弹出对话框提示用户到设置中授权,用户点击确定跳入设置中
        if (AndPermission.hasAlwaysDeniedPermission(this, deniedPermissions)) {
            // 第一种:用默认的提示语。如果用户选择了绝对不允许,那么对话框不会弹出来了,只能拿到设置中打开
            AndPermission.defaultSettingDialog(this, 100).show();
        }else {
            //   finish();
            // 3.第一次 弹出权限,用户选择拒绝, 弹出权限解释对话框
            sendAgain(100,Manifest.permission.WRITE_EXTERNAL_STORAGE);
        }
    }    // 失败回调的方法,用注解即可,里面的数字是请求时的requestCode。

// 第二次选择拒绝

@PermissionNo(101)
    private void getPhoneStateNo(List<String> deniedPermissions) {
        // 用户否勾选了不再提示并且拒绝了权限,那么弹出只能到设置中打开权限对话框,用户点击,跳入设置中
        if (AndPermission.hasAlwaysDeniedPermission(this, deniedPermissions)) {
            // 第一种:用默认的提示语。
            AndPermission.defaultSettingDialog(this, 101).show();
        }else {
            //   finish();
            sendAgain(101,Manifest.permission.READ_PHONE_STATE);
        }
    }    // 失败回调的方法,用注解即可,里面的数字是请求时的requestCode。

@Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        // 只需要调用这一句,第一个参数是当前Acitivity/Fragment,回调方法写在当前Activity/Framgent。
        AndPermission.onRequestPermissionsResult(this, requestCode, permissions, grantResults);
    }
// 4. 权限解释对话框,如果用户选择 确定,那么继续申请当前权限
// 用户选择否,不申请,失败对话框
    private void sendAgain(final int code,final String permission){
        AlertDialog.build(PermissionActivity.this)
                .setCancelable(false)
                .setTitle("友好提醒")
                .setMessage("您拒绝该该权限可能会导致应用无法正常使用,您确定要拒绝么?")
                .setPositiveButton("否",new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        AndPermission.with(PermissionActivity.this).requestCode(code).permission(permission) .send();
                    }
                })
                .setNegativeButton("是", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        PermissionActivity.this.finish();
                    }
                }).show();
    }
}
========================================================================

yanzhenjie:permission:1.0.5 使用相关推荐

  1. Error: listen EACCES: permission denied 0.0.0.0:80

    Error: listen EACCES: permission denied 0.0.0.0:80 一.报错如下 二.报错的原因? 端口被系统模块占用 三.解决办法? 端口号已经被占用了,换其他端口 ...

  2. Android踩坑日记:android7.0动态相机权限

    前提: 项目中使用的动态权限开源库github:https://github.com/yanzhenjie/AndPermission. 转载必须注明本文转自严振杰的博客:http://blog.cs ...

  3. android 6.0 数据库权限,Android超清晰6.0权限申请AndPermission

    Android超清晰6.0权限申请AndPermission的具体实现代码,供大家参考,具体内容如下 前言 这是我经常使用的框架,原因: 1.思路清晰 2.实现方便 开始 准备工作 导包 compil ...

  4. android10无法获取ssid,解决Android 8.0和9.0无法获取SSID (unknow ssid)

    一直都在做wifi相关的东西 今天遇到一个问题是8.0的机型无法获取到ssid 然后就查询了一番 终于找到解决方案 wifi名称获取代码 WifiManager my_wifiManager = (( ...

  5. 解决Android 8.0和9.0无法获取SSID (unknow ssid)

    一直都在做wifi相关的东西 今天遇到一个问题是8.0的机型无法获取到ssid 然后就查询了一番 终于找到解决方案 wifi名称获取代码 WifiManager my_wifiManager = (( ...

  6. Android踩坑日记:Android动态权限分析和解决方案

    关于运行时权限 在旧的权限管理系统中,权限仅仅在APP安装时询问一次,用户同意了这些权限App才能安装,APP一旦安装后就可以偷偷做很多不为人知的事情. 我们知道从Android6.0开始,App可以 ...

  7. android动态权限封装,Android 动态权限申请的封装

    此模块基于AndPermission进行二次封装 为AndPermission加入依赖 implementation 'com.yanzhenjie:permission:2.0.3' //添加依赖 ...

  8. android studio 导入项目卡死,AndroidStudio导入新项目一直卡在Building gradle project info...

    对于新手配置Gradle是一件很痛苦的事,记住二句话绝对搞定 1.在Gradle-->gradle-wrapper.properties中配置distributionUrl=https\://s ...

  9. Android之提示Could not find com.android.support:appcompat-v7:25.3.1.

    1 问题 编译第三方项目,错误提示如下 Could not find com.android.support:appcompat-v7:25.3.1. Required by:project :sam ...

最新文章

  1. 圈复杂度本质上就是——分支覆盖率达到100%需要的测试用例数
  2. java学习笔记7--抽象类与抽象方法
  3. Spring的HelloWorld
  4. 浏览器兼容性导致网址显示不完整
  5. 输入输出系统 2--- 中断(未完)
  6. windows下python安装Numpy、Scipy、matplotlib模块
  7. TCP/IP分析(一) 协议概述
  8. python数据结构 树_Python数据结构——AVL树的实现
  9. luci L大_智慧城市大讲堂 l 大咖说5G智慧大交通
  10. java mockserver搭建_mockjs,json-server一起搭建前端通用的数据模拟框架教程
  11. CUDA C编程权威指南 第四章 全局内存
  12. zabbix 自定义监控 排除带报错提示
  13. 职场中相信“付出总有回报”的人,后来都怎么样了?
  14. 基于 CODING 的 Spring Boot 持续集成项目 1
  15. 后期强ps画意大师完美破解版一键打造中国风
  16. java velocity 语法_Velocity初探小结--velocity使用语法详解
  17. 11种免费获取SSL证书的方式
  18. VS Code设置缩进两个字符
  19. 辛东方重组百花园传媒 人员大调整
  20. 基于 Django 使用 qrcode 模块生成二维码

热门文章

  1. UnrealEngine4蓝图功能_关卡切换后的玩家出身点定位功能实现
  2. Opencv c++从影像分帧开始,制作数据集
  3. 计算机电源5VSB只有3V,研华工控机接上电源后5vsb那颗灯闪烁是怎么回事
  4. 新手自主创业需要注意哪些误区?
  5. 在前互联网时代,宜家就有这些“互联网思维”
  6. 《怪诞行为学--丹.艾瑞里》知识点总结
  7. 2021年10个最美的边框效果,CSS实现,可以直接使用
  8. windows php java_Windows下配置 php-java-bridge
  9. 【论文】Mask R-CNN
  10. 孙子兵法与36计(一)