0x00 前言

使用EasyPermissions库进行申请权限

打开App时就申请权限,如果用户拒绝权限后,会循环申请

如果永久拒绝后,会跳转到设置里继续申请

效果图:

注:不讲原理,先教你怎么实现

0x01 引入依赖

appbuild.gradle里面,添加EasyPermissions的依赖

implementation 'pub.devrel:easypermissions:2.0.0'

添加后点击 File -> Sync Project with Gradle Files 重新构建一些项目

0x02 创建PermissionActivity

创建一个PermissionActivity用于获取权限,布局随意

可以把它设为启动Activity,也可以由SplashActivity转至PermissionActivity

创建完成后,让PermissionActivity实现EasyPermissions.PermissionCallbacks,并重新下面三个方法

PermissionActivity复制下面的内容即可

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity; import android.os.Bundle; import java.util.List; import pub.devrel.easypermissions.EasyPermissions; public class PermissionActivity extends AppCompatActivity implements EasyPermissions.PermissionCallbacks { @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_permission);
} // 重新下面三个方法 @Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this);
} @Override
public void onPermissionsGranted(int requestCode, @NonNull List<String> perms) { } @Override
public void onPermissionsDenied(int requestCode, @NonNull List<String> perms) { }
}

0x03 三个方法

其中onRequestPermissionsResult是权限申请后执行的方法,默认就写成上面那样就行

onPermissionsGranted是权限授权时的回调

onPermissionsDenied是权限被拒绝时的回调

0x04 申请权限

假如要申请存储权限

首先在AndroidManifest.xml里面加上这两行

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

然后,在PermissionActivity里定义两个常量

// 指定申请存储权限时,一个标识符,用于在成功或失败回调中判断申请成功的或失败的是哪几个权限
static final int STORAGE_CALL_BACK_CODE = 0;
// 存储权限
static final String[] perms_storage = new String[]{Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE};

onCreate里面加上申请权限的代码

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_permission); if (EasyPermissions.hasPermissions(this, perms_storage)) {
Toast.makeText(this, "已经有存储权限", Toast.LENGTH_SHORT).show();
} else {
EasyPermissions.requestPermissions(this, "请给我权限", STORAGE_CALL_BACK_CODE, perms_storage);
}
}

0x05 处理授权成功

onPermissionsGranted方法

@Override
public void onPermissionsGranted(int requestCode, @NonNull List<String> perms) {
//noinspection SwitchStatementWithTooFewBranches
switch (requestCode) {
// 如果存储权限申请通过
case STORAGE_CALL_BACK_CODE:
Toast.makeText(this, "已同意存储权限", Toast.LENGTH_SHORT).show();
// pass为通过后执行的方法,注意下面有个finish(),pass()中就不要再加finish()了
pass();
finish();
break;
}
}

0x06 处理授权失败

onPermissionsDenied方法

@Override
public void onPermissionsDenied(int requestCode, @NonNull List<String> perms) {
//noinspection SwitchStatementWithTooFewBranches
switch (requestCode) {
case STORAGE_CALL_BACK_CODE:
Toast.makeText(this, "已拒绝存储权限", Toast.LENGTH_SHORT).show();
ActivityCompat.requestPermissions(this, perms_storage, STORAGE_CALL_BACK_CODE);
break;
}
// 如果权限被永久拒绝,就提示到设置页面中开启
if (EasyPermissions.somePermissionPermanentlyDenied(this, perms)) {
Toast.makeText(this, "权限已被永久拒绝", Toast.LENGTH_SHORT).show();
new AppSettingsDialog
.Builder(this)
.setTitle("权限已被永久拒绝")
.setRationale("该应用需要此权限,否则无法正常使用,是否打开设置")
.setPositiveButton("确定")
.setNegativeButton("取消")
.build()
.show();
}
}

0x07 完整代码

PermissionActivity

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat; import android.Manifest;
import android.content.Intent;
import android.os.Bundle;
import android.widget.Toast; import java.util.List; import pub.devrel.easypermissions.AppSettingsDialog;
import pub.devrel.easypermissions.EasyPermissions; public class PermissionActivity extends AppCompatActivity implements EasyPermissions.PermissionCallbacks { static final int STORAGE_CALL_BACK_CODE = 0;
static final String[] perms_storage = new String[]{Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE}; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_permission); if (EasyPermissions.hasPermissions(this, perms_storage)) {
Toast.makeText(this, "已经有存储权限", Toast.LENGTH_SHORT).show();
} else {
EasyPermissions.requestPermissions(this, "请给我权限", STORAGE_CALL_BACK_CODE, perms_storage);
}
} void pass() {
startActivity(new Intent(this, MainActivity.class));
} @Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this);
} @Override
public void onPermissionsGranted(int requestCode, @NonNull List<String> perms) {
//noinspection SwitchStatementWithTooFewBranches
switch (requestCode) {
// 如果存储权限申请通过
case STORAGE_CALL_BACK_CODE:
Toast.makeText(this, "已同意存储权限", Toast.LENGTH_SHORT).show();
// pass为通过后执行的方法,注意下面有个finish(),pass()中就不要再加finish()了
pass();
finish();
break;
}
} @Override
public void onPermissionsDenied(int requestCode, @NonNull List<String> perms) {
//noinspection SwitchStatementWithTooFewBranches
switch (requestCode) {
case STORAGE_CALL_BACK_CODE:
Toast.makeText(this, "已拒绝存储权限", Toast.LENGTH_SHORT).show();
ActivityCompat.requestPermissions(this, perms_storage, STORAGE_CALL_BACK_CODE);
break;
}
// 如果权限被永久拒绝,就提示到设置页面中开启
if (EasyPermissions.somePermissionPermanentlyDenied(this, perms)) {
Toast.makeText(this, "权限已被永久拒绝", Toast.LENGTH_SHORT).show();
new AppSettingsDialog
.Builder(this)
.setTitle("权限已被永久拒绝")
.setRationale("该应用需要此权限,否则无法正常使用,是否打开设置")
.setPositiveButton("确定")
.setNegativeButton("取消")
.build()
.show();
}
}
}

0x08 项目代码

项目在github上面,有用的话,可以给一个star

https://github.com/tanyiqu/android-permission-demo

Android搞定权限申请的更多相关文章

  1. Android 6.0 权限申请辅助 ----PermissionsHelper

    Android 6.0 权限申请辅助 ----PermissionsHelper 项目地址:https://github.com/didikee/PermissionsHelper Android 的 ...

  2. ## Android 6.0 权限申请 ##

    Android 6.0 权限申请 1. 以前的权限申请(sdk<23) 直接在AndroidManifest.xml中申明即可: <uses-permission android:name ...

  3. 「踩坑记」Android API 判断权限申请结果的闪退问题

    这几天尝试着用Android Studio写一个小工具的时候遇到了一个动态权限申请的问题.权限的申请使用的语句为: ActivityCompat.requestPermissions(this, ne ...

  4. 问题二:appium 搞定权限弹框的一个小办法

    public void permission() { for (int i=0; i <= 10; i++) { if (getPageSource().contains("允许&qu ...

  5. Android 6.0 超级简单的权限申请2 (Permission)

    代码地址如下:http://www.demodashi.com/demo/13506.html 写在前面 上次写了一个权限申请的例子Android 6.0 超级简单的权限申请 (Permission) ...

  6. 企业sudo权限规划详解 (实测一个堆命令搞定)

    简述问题:         随着公司的服务器越来越多,人员流动性也开始与日俱增,以往管理服务器的陈旧思想应当摒弃,公司需要有 更好更完善的权限体系,经过多轮沟通和协商,公司一致决定重新整理规划权限体系 ...

  7. 【Unity游戏开发】Android6.0以上的动态权限申请问题

    一.引子 最近公司的游戏在做安全性测试,期间也暴露出了不少安全上的问题.虽然我们今天要说的权限申请和安全性相关不大,但是也会影响到游戏的使用体验等,所以本篇博客中马三就想和大家谈谈Android6.0 ...

  8. Android权限申请完全解析(一):Android自带的权限申请

    1.为什么要权限申请 6.0以上就需要了,别问为什么.(不是重点,自行搜索) 2.如何进行权限申请 Android自带的权限申请 EasyPermission权限申请 Ps:EasyPermissio ...

  9. Android 100多个Styles快速开发布局XML,一行搞定View属性,一键统一配置UI...

    Android开发中大量使用XML代码作为界面的布局,使用styles能大幅精简XML代码. 比如下面这个界面从AlertDialog至PlacePickerWindow有19个样式相同的跳转Item ...

随机推荐

  1. vue轻量进度条

    **### vue------ mode 好玩东西+1: 轻量级进度条: 1.引入 import NProgress from 'nprogress'; // progress bar import ...

  2. LGP7814题解

    lmpp 教你对着样例得到做法.jpg 题意:给定一个长度为 $ n $ 的字符串 A,要求你构造一个字符串 B,使得 A 是 B 的子序列且 A 不是 B 的子串. 首先给出无解的判断方法: if( ...

  3. 在西电使用校内Linux 开源软件镜像

    西电开源社区(linux.xidian.edu.cn)为全校师生提供开源镜像服务,由于其使用校内服务器,因此产生的流量不会计入校园网 打开镜像列表:https://linux.xidian.edu.c ...

  4. table元素使用bug

    一.问题的产生 javaWeb课上老师让我们用表单做一个简单的自我介绍,但是在对表单里的单元格进行合并时出现了变形的情况,这里做个记录. 二.实验 让我们先做一个简单的4*4表格 <!DOCTY ...

  5. Nginx--sub_filter模块

    客户端浏览器访问替换html中的字符: location / { root /web/htdocs; random_index on; index index.html index.htm; subs ...

  6. 4月11日 python学习总结 对象与类

    1.类的定义 #类的定义 class 类名: 属性='xxx' def __init__(self): self.name='enon' self.age=18 def other_func: pas ...

  7. [SPDK/NVMe存储技术分析]012 - 用户态ibv_post_send()源码分析

    OFA定义了一组标准的Verbs,并提供了一个标准库libibvers.在用户态实现NVMe over RDMA的Host(i.e. Initiator)和Target, 少不了要跟OFA定义的Ver ...

  8. MSF基本使用

    MSF 链接数据库 linux查找文件 find / -name dabase.yml 链接数据库 db_connect -y path/database.yml db_status 查询数据库链接状 ...

  9. python 命令行参数学习(一)

    用了这么久,还没怎么学习python的命令行参数,是在惭愧. 参考文章地址:http://www.cnblogs.com/jianboqi/archive/2013/01/10/2854726.htm ...

  10. 实习项目1-串口IP升级调试

    设计目标:设计一个串口IP,要求1:输入时钟频率任意,如0-400M时钟频率:要求2:波特率超过常见的115200,要求达到4M. 设计核心思路:波特率计算公式,divp10x = (10 * fsy ...