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. Open Babel的安装与使用

    技术背景 Open Babel是化学领域常用的一个文件格式转换工具,它可以支持xyz的坐标格式.SMILES表达式.InChI表达式和mol以及mol2等格式之间的互相转化.比如说,你只有一个甲烷的S ...

  2. 基于Drone+Gogs流水线-全面认识轻量级云原生CI引擎Drone

    1. 介绍 Drone by Harness 是一个基于Docker容器技术的可扩展的持续集成引擎,用于自动化测试.构建.发布.每个构建都在一个临时的Docker容器中执行,使开发人员能够完全控制其构 ...

  3. Spring Data ElasticSearch的使用

    1.什么是Spring Data Spring Data是一个用于简化数据库访问,并支持云服务的开源框架.其主要目标是使得对数据的访问变得方便快捷,并支持map-reduce框架和云计算数据服务. S ...

  4. Ubuntu20.04服务器+Anaconda上创建Python3.6虚拟环境并

    镜像下载.域名解析.时间同步请点击 阿里巴巴开源镜像站 前言 由于服务器已安装Anaconda,包含的Python版本为3.8,为使用3.6版本同时避免和其他人互相影响,我选择创建虚拟环境,并在其中安 ...

  5. 使用 Docker 部署 LNMP 并搭建 wordpress

    准备 系统版本:CentOS Linux release 7.4.1708 (Core)   内核版本:3.10.0-693.el7.x86_64    IP:192.168.31.43    可访问 ...

  6. ansible 三配置和命令集

    一.Ansible配置 Ansible安装好之后的配置文件有如下两种: 1.yum安装,配置文件默认路径为: /etc/ansible/ansible.cfg 2.源码包安装,配置文件路径需要从软件包 ...

  7. docker基础命令,常用操作

    docker基础命令 使用docker镜像 获取镜像 从docker registry获取镜像的命令是docker pull.命令格式是: docker pull [选项][docker regist ...

  8. 4月17日 python学习总结 反射、object内置方法、元类

    一.反射 下述四个函数是专门用来操作类与对象属性的,如何操作? 通过字符串来操作类与对象的属性,这种操作称为反射 class People: country="China" def ...

  9. [FromBody]List<string> 用PostMan如何请求

    在MVC项目,写了一个API方法,如下: /// <summary>/// 测试/// </summary>/// <param name="idList&qu ...

  10. 一台 Linux 系统初始化环境后需要做一些什么安全工作?

    1.添加普通用户登陆,禁止 root 用户登陆,更改 SSH 端口号.        修改 SSH 端口不一定绝对哈.当然,如果要暴露在外网,建议改下.l    2.服务器使用密钥登陆,禁止密码登陆. ...