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 ...
随机推荐
- Open Babel的安装与使用
技术背景 Open Babel是化学领域常用的一个文件格式转换工具,它可以支持xyz的坐标格式.SMILES表达式.InChI表达式和mol以及mol2等格式之间的互相转化.比如说,你只有一个甲烷的S ...
- 基于Drone+Gogs流水线-全面认识轻量级云原生CI引擎Drone
1. 介绍 Drone by Harness 是一个基于Docker容器技术的可扩展的持续集成引擎,用于自动化测试.构建.发布.每个构建都在一个临时的Docker容器中执行,使开发人员能够完全控制其构 ...
- Spring Data ElasticSearch的使用
1.什么是Spring Data Spring Data是一个用于简化数据库访问,并支持云服务的开源框架.其主要目标是使得对数据的访问变得方便快捷,并支持map-reduce框架和云计算数据服务. S ...
- Ubuntu20.04服务器+Anaconda上创建Python3.6虚拟环境并
镜像下载.域名解析.时间同步请点击 阿里巴巴开源镜像站 前言 由于服务器已安装Anaconda,包含的Python版本为3.8,为使用3.6版本同时避免和其他人互相影响,我选择创建虚拟环境,并在其中安 ...
- 使用 Docker 部署 LNMP 并搭建 wordpress
准备 系统版本:CentOS Linux release 7.4.1708 (Core) 内核版本:3.10.0-693.el7.x86_64 IP:192.168.31.43 可访问 ...
- ansible 三配置和命令集
一.Ansible配置 Ansible安装好之后的配置文件有如下两种: 1.yum安装,配置文件默认路径为: /etc/ansible/ansible.cfg 2.源码包安装,配置文件路径需要从软件包 ...
- docker基础命令,常用操作
docker基础命令 使用docker镜像 获取镜像 从docker registry获取镜像的命令是docker pull.命令格式是: docker pull [选项][docker regist ...
- 4月17日 python学习总结 反射、object内置方法、元类
一.反射 下述四个函数是专门用来操作类与对象属性的,如何操作? 通过字符串来操作类与对象的属性,这种操作称为反射 class People: country="China" def ...
- [FromBody]List<string> 用PostMan如何请求
在MVC项目,写了一个API方法,如下: /// <summary>/// 测试/// </summary>/// <param name="idList&qu ...
- 一台 Linux 系统初始化环境后需要做一些什么安全工作?
1.添加普通用户登陆,禁止 root 用户登陆,更改 SSH 端口号. 修改 SSH 端口不一定绝对哈.当然,如果要暴露在外网,建议改下.l 2.服务器使用密钥登陆,禁止密码登陆. ...