Android搞定权限申请
0x00 前言
使用EasyPermissions库进行申请权限
打开App时就申请权限,如果用户拒绝权限后,会循环申请
如果永久拒绝后,会跳转到设置里继续申请
效果图:
注:不讲原理,先教你怎么实现
0x01 引入依赖
在app的build.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搞定权限申请的更多相关文章
- Android 6.0 权限申请辅助 ----PermissionsHelper
Android 6.0 权限申请辅助 ----PermissionsHelper 项目地址:https://github.com/didikee/PermissionsHelper Android 的 ...
- ## Android 6.0 权限申请 ##
Android 6.0 权限申请 1. 以前的权限申请(sdk<23) 直接在AndroidManifest.xml中申明即可: <uses-permission android:name ...
- 「踩坑记」Android API 判断权限申请结果的闪退问题
这几天尝试着用Android Studio写一个小工具的时候遇到了一个动态权限申请的问题.权限的申请使用的语句为: ActivityCompat.requestPermissions(this, ne ...
- 问题二:appium 搞定权限弹框的一个小办法
public void permission() { for (int i=0; i <= 10; i++) { if (getPageSource().contains("允许&qu ...
- Android 6.0 超级简单的权限申请2 (Permission)
代码地址如下:http://www.demodashi.com/demo/13506.html 写在前面 上次写了一个权限申请的例子Android 6.0 超级简单的权限申请 (Permission) ...
- 企业sudo权限规划详解 (实测一个堆命令搞定)
简述问题: 随着公司的服务器越来越多,人员流动性也开始与日俱增,以往管理服务器的陈旧思想应当摒弃,公司需要有 更好更完善的权限体系,经过多轮沟通和协商,公司一致决定重新整理规划权限体系 ...
- 【Unity游戏开发】Android6.0以上的动态权限申请问题
一.引子 最近公司的游戏在做安全性测试,期间也暴露出了不少安全上的问题.虽然我们今天要说的权限申请和安全性相关不大,但是也会影响到游戏的使用体验等,所以本篇博客中马三就想和大家谈谈Android6.0 ...
- Android权限申请完全解析(一):Android自带的权限申请
1.为什么要权限申请 6.0以上就需要了,别问为什么.(不是重点,自行搜索) 2.如何进行权限申请 Android自带的权限申请 EasyPermission权限申请 Ps:EasyPermissio ...
- Android 100多个Styles快速开发布局XML,一行搞定View属性,一键统一配置UI...
Android开发中大量使用XML代码作为界面的布局,使用styles能大幅精简XML代码. 比如下面这个界面从AlertDialog至PlacePickerWindow有19个样式相同的跳转Item ...
随机推荐
- CSAPP shell Lab 详细解答
Shell Lab的任务为实现一个带有作业控制的简单Shell,需要对异常控制流特别是信号有比较好的理解才能完成.需要详细阅读CS:APP第八章异常控制流并理解所有例程. Slides下载:https ...
- centos7升级openssh8.7&openssl1.1.1l脚本
脚本下载地址或首页联系本人获取 https://files.cnblogs.com/files/blogs/705493/update_ssh.sh 需搭配openssh8.7和openssl1.1. ...
- 嵌入式linux驱动开发 笔记
@ 目录 首个驱动hellodrv 1.编写源码 2.编译模块 3.加载驱动 首个驱动hellodrv 3.如果下载不到,就自己编写,并编译驱动. 1.编写源码 2.编译模块 1.先写makefile ...
- python+pytest接口自动化(10)-session会话保持
在接口测试的过程中,经常会遇到有些接口需要在登录的状态下才能请求,否则会提示请登录,那么怎样解决呢? 上一篇文章我们介绍了Cookie绕过登录,其实这就是保持登录状态的方法之一. 另外一种方式则是通过 ...
- python 命令行参数学习(一)
用了这么久,还没怎么学习python的命令行参数,是在惭愧. 参考文章地址:http://www.cnblogs.com/jianboqi/archive/2013/01/10/2854726.htm ...
- 开源三轴云台EVVGC(simple BGC)分析
一. 主程序分析 主程序结构清晰,流程如图所示,下面将对每个部分做详细分析 二. 系统初始化 系统初始化部分的流程如上图所示,下面对每部分做具体分析 1. 时钟初始化 该部分主要是使能DWT,用DWT ...
- const char * 组合理解
1 . const char *ptr 从char *ptr 可以理解为指向字符常量的指针,ptr是一个指向char *的常量,*ptr的值为const,不能修改. 2. char const *pt ...
- Intellij IDEA实现SpringBoot项目多端口启动的两种方法
有时候使用springboot项目时遇到这样一种情况,用一个项目需要复制很多遍进行测试,除了端口号不同以外,没有任何不同.遇到这种情况怎么办呢?这时候可以使用Intellij IDEA解决 前言 有时 ...
- 怎样查看一个 linux 命令的概要与用法?假设你在/bin 目录中偶然看到一个你从没见过的的命令,怎样才能知道它的作用和用法呢?
使用命令 whatis 可以先出显示出这个命令的用法简要,比如,你可以使用 whatiszcat 去查看'zcat'的介绍以及使用简要. [root@localhost ~]# whatis zcat ...
- Java并发机制(5)--同步容器与并发容器
Java并发编程:同步容器整理自:博客园-海子-http://www.cnblogs.com/dolphin0520/p/3933404.html1.同步容器出现原因 常用的ArrayList,Lin ...