android申请权限一次性申请多个,android 6.0以上动态一次申请多个权限-最美解决方案...

目录

背景

危险权限

申请权限思路

申请权限流程

干货

后续

一.背景

android23 API新增危险权限校验,需要手动获取:

二.危险权限:

日历数据

android.permission-group.CALENDAR

android.permission.READ_CALENDAR

android.permission.WRITE_CALENDAR

相机

android.permission-group.CAMERA

android.permission.CAMERA

联系人

android.permission-group.CONTACTS

android.permission.READ_CONTACTS

android.permission.WRITE_CONTACTS

android.permission.GET_ACCOUNTS

位置

android.permission-group.LOCATION

android.permission.ACCESS_FINE_LOCATION

android.permission.ACCESS_COARSE_LOCATION

麦克风

android.permission-group.MICROPHONE

android.permission.RECORD_AUDIO

电话

android.permission-group.PHONE

android.permission.READ_PHONE_STATE

android.permission.CALL_PHONE

android.permission.READ_CALL_LOG

android.permission.WRITE_CALL_LOG

com.android.voicemail.permission.ADD_VOICEMAIL

android.permission.USE_SIP

android.permission.PROCESS_OUTGOING_CALLS

传感器

android.permission-group.SENSORS

android.permission.BODY_SENSORS

短信

android.permission-group.SMS

android.permission.SEND_SMS

android.permission.RECEIVE_SMS

android.permission.READ_SMS

android.permission.RECEIVE_WAP_PUSH

android.permission.RECEIVE_MMS

android.permission.READ_CELL_BROADCASTS

存储

android.permission-group.STORAGE

android.permission.READ_EXTERNAL_STORAGE

android.permission.WRITE_EXTERNAL_STORAGE

三.申请权限思路

Android6.0 运行时权限,相关的方法主要有四个:

1、检查是否授予权限

ContextCompat.checkSelfPermission(mContext, permissions[i])

返回的结果为PackageManager.PERMISSION_GRANTED(0)表示授予权限

2、请求权限

ActivityCompat.requestPermissions(WelcomeActivity.this, permissions, 1);

注:permissions为数组,单个的权限,传new String[]{permission}参数, 1为requestCode,在权限回调中需要使用。

3、请求权限后的回调

public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {

4、判断用户拒绝权限是是否勾选don't ask again选项,若勾选需要客户手动打开权限

ActivityCompat.shouldShowRequestPermissionRationale(WelcomeActivity.this, permissions[i])

注:ActivityCompat.shouldShowRequestPermissionRationale(activity,permission) 这个方法是在用户拒绝权限后返回true。也就是说:用户第一次点击一个需要权限的地方,该方法返回false(因为用户没拒绝~),当用户拒绝掉该权限,下次点击此权限处,该方法会返回true。为true的时候,显示对话框对该权限说明,并让用户选择是否再次申请权限。当用户拒绝权限并勾选don't ask again选项后,会一直返回false,并且 ActivityCompat.requestPermissions 不会弹出对话框,系统直接deny,并执行 onRequestPermissionsResult 方法

5、总结

①、检查需要申请的权限状态,将未授权的单独保存到集合中;

②、集合为空,进入首页(已全都授予权限),不为空,请求权限;

③、当用户拒绝时,判断是否勾选don't ask again,未勾选,重新申请权限,已勾选,跳过欢迎界面,进入主界面。

四.申请权限流程

A、在实际项目中,为了开发的方便,在欢迎界面,将常用的权限申请一次性申请,一般申请写存储卡、定位等权限。

申请权限分为两类: ① 直接弹出权限框,允许或禁止操作 ② 到手机具体某个页面设置。

B、在某个具体操作的时候(如:悬浮窗权限)再单独进行权限判断。

C、具体操作权限申请流程:

①、请求权限;

②、在请求回调中,当用户拒绝时,需判断是否勾选don't ask again,

未勾选,重新申请权限,

已勾选,跳转到设置界面。

五、干货

用户是否禁止权限

private boolean mShowRequestPermission = true;

申请权限 -- 进入登录页面时申请权限

private void init_permission() {

if (getSdkVersionSix()) {

String[] permissions = new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_PHONE_STATE, Manifest.permission.RECORD_AUDIO};

List mPermissionList = new ArrayList<>();

for (int i = 0; i < permissions.length; i++) {

if (ContextCompat.checkSelfPermission(LogInAct.this, permissions[i]) != PackageManager.PERMISSION_GRANTED) {

mPermissionList.add(permissions[i]);

}

}

if (mPermissionList.isEmpty()) {// 全部允许

mShowRequestPermission = true;

} else {//存在未允许的权限

String[] permissionsArr = mPermissionList.toArray(new String[mPermissionList.size()]);

ActivityCompat.requestPermissions(LogInAct.this, permissionsArr, 101);

}

}

}

权限提示框 ,如果点击禁止且不勾选禁止访问,则无线循环弹出申请框,哈哈,就是这么任性。

如果全部允许则正常操作。如果全部禁止且禁止访问,点击登录按钮时再校验一遍,

@Override

public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {

super.onRequestPermissionsResult(requestCode, permissions, grantResults);

switch (requestCode) {

case 101:

for (int i = 0; i < grantResults.length; i++) {

if (grantResults[i] != PackageManager.PERMISSION_GRANTED) {

//判断是否勾选禁止后不再询问

boolean showRequestPermission = ActivityCompat.shouldShowRequestPermissionRationale(LogInAct.this, permissions[i]);

if (showRequestPermission) {

init_permission();

return;

} else { // false 被禁止了,不在访问

mShowRequestPermission = false;//已经禁止了

}

}

}

break;

}

}

点击登录按钮时 ,获取申请权限的结果 并且这里动态申请了“悬浮窗”的权限

1. 如何小于6.0 直接登陆

2. 申请悬浮窗权限,如果没有,直接跳转到具体页面进行设置,完成后在onActivityResult 中判断是否允许该权限

如果允许再次动态申请一次权限,上面如果点击了全部禁止且勾选了禁止访问请调用 getRequestPermission()方法,

自动跳转到应用程序列表中让用户手动设置权限

if (getSdkVersionSix()) {

if (Settings.canDrawOverlays(LogInAct.this)) {

if (getRequestPermission().equals("1")) { // 如果等于1则登录

init_IntentLogIn(getAccount(), getPwd());

}

} else {

Toast.makeText(this, R.string.login_canDrawOverlays, Toast.LENGTH_SHORT).show();

Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION);

startActivityForResult(intent, 2);

}

} else {

init_IntentLogIn(getAccount(), getPwd()); // 6.0以下直接登录

}

判断SDK是否在6.0以上

public boolean getSdkVersionSix() {

return Build.VERSION.SDK_INT >= Build.VERSION_CODES.M;

}

处理申请的悬浮窗和其他权限

@RequiresApi(api = Build.VERSION_CODES.M)

@Override

protected void onActivityResult(int requestCode, int resultCode, Intent data) {

super.onActivityResult(requestCode, resultCode, data);

if (requestCode == 2) {

if (Settings.canDrawOverlays(LogInAct.this)) {

init_permission();

} else {

Toast.makeText(this, R.string.login_canDrawOverlays, Toast.LENGTH_SHORT).show();

}

} else if (requestCode == 3) {

init_permission();

}

}

申请权限后的操作

public String getRequestPermission() {

if (mShowRequestPermission) {

return "1";

} else {// 被禁止后提示用户必须到设置中授权,跳转到应用程序列表页面

Toast.makeText(this, R.string.login_permission, Toast.LENGTH_SHORT).show();

Intent intent = new Intent(Settings.ACTION_APPLICATION_SETTINGS);

startActivityForResult(intent, 3);

return "-1";

}

}

六、后续

工具类已出 ,代码传送门

七、远程依赖

1.gradle

allprojects {

repositories {

...

maven { url 'https://jitpack.io' }

}

}

dependencies {

implementation 'com.github.stf-android:Permissions:-SNAPSHOT'

}

2.maven

jitpack.io

https://jitpack.io

com.github.stf-android

Permissions

-SNAPSHOT

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/333378.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

IntelliJ IDEA for Mac 直接将模块硬盘上的根目录删除会怎么样

不通过 IDEA 删除模块文件&#xff0c;而是直接手动从硬盘删除模块文件&#xff0c;造成的结果如下图所示&#xff1a; 【模块内容导航窗格】的内容是根据以下两个配置文件的信息从硬盘中加载进来的&#xff1a; 项目根目录/.idea/modules.xml 这个文件记载了配置文件【模块名…

java 谓词_谓词::不适合Java

java 谓词Jim Laskey在OpenJDK core-libs-dev邮件列表上最近的消息“ RFR&#xff1a;CSR – JDK-8203428 Predicate :: not ”指出了JDK Bug JDK-8203428 [“ Predicate :: not”]。 JDK-8203428的“摘要”指出&#xff1a;“引入新的静态方法Predicate :: not&#xff0c;这将…

android root权限函数,android 4.4下app永久获取root权限的方法

本帖最后由 jackson 于 2017-4-16 20:55 编辑通过参照[FAQ11414]android KK 4.4 版本后&#xff0c;user 版本su 权限严重被限制问题说明http://www.voidcn.com/blog/wds1181977/article/p-6157006.html明确要修改三个地方&#xff1a;(1)把dalvik/vm/native/dalvik_system_Zyg…

IntelliJ IDEA 项目开发中各个目录的关系

项目根目录&#xff08;Project Root&#xff09;&#xff1a;本地硬盘中存放项目内容的根目录 项目名称&#xff08;Project Name&#xff09;&#xff1a;IDEA 保存的项目名称&#xff0c;默认和项目根目录的名称相同&#xff0c;可以修改。有啥作用&#xff1f;通过 IDEA 部…

apache spark_Apache Spark中的自定义日志

apache spark您是否曾经对运行了几个小时的Spark作业感到沮丧&#xff0c;但由于基础设施问题而失败了。 您会很晚才知道此故障&#xff0c;并浪费了数小时的时间&#xff0c;当Spark UI日志也无法进行事后检查时&#xff0c;它会更加痛苦。 你不是一个人&#xff01; 在本文…

android中暂停服务,Android 装逼技术之暗码启动应用

前言喜欢的小伙伴欢迎关注&#xff0c;我会定期分享Android知识点及解析&#xff0c;还会不断更新的BATJ面试专题&#xff0c;欢迎大家前来探讨交流&#xff0c;如有好的文章也欢迎投稿。什么是暗码&#xff1f;在拨号盘中输入*#*##*#*后&#xff0c;APP 可以监控到这些输入&am…

JShell 详解

文章目录一、简介二、为什么使用 JShell三、参考示例启动 JShell退出 JShell声明定义基本类型的变量声明定义一个方法覆盖已存在的变量、方法、类的定义查看 JShell 默认导入的包自动补全功能列出所有键入的源列出已声明方法及其签名加载外部的源代码查看 JShell 提供的所有指令…

graphql_GraphQL在Wildfly群上

graphql“ GraphQL是API的查询语言&#xff0c;是用于使用现有数据完成这些查询的运行时。 GraphQL为您的API中的数据提供了完整且易于理解的描述&#xff0c;使客户能够准确地询问他们所需的内容&#xff0c;仅此而已&#xff0c;使随着时间的推移更容易开发API并启用强大的开…

android中有哪些utils的作用,AndroidUtils

多年开发Android积攒下来好多常用的工具方法&#xff0c;保存在随笔中&#xff0c;持续更新。TimeUtil/*** 获取距当前时刻的时间戳** param createTime* return*/public static String getTimestamp(long createTime) {long currrentMillis System.currentTimeMillis();// if…

Java中的关键字this_super

文章目录要点错误的理解正确的理解演示代码要点 1.在类的构造器中&#xff0c;可以使用 this() 调用本类的其它构造器&#xff0c;调用的时候根据构造器声明的参数列表传递参数值 2.super() 调用父类的无参构造器 3.super.method() 调用父类的 method() 方法 4.super.name …

Spring Hibernate教程

1.简介 在本文中&#xff0c;我们将演示如何利用最流行的ORM&#xff08;对象关系映射&#xff09;工具之一的Hibernate的功能 &#xff0c;该工具可将面向对象的域模型转换为传统的关系数据库。 Hibernate是目前最流行的Java框架之一。 由于这个原因&#xff0c;我们在Java Co…

百度地图瓦片 android,百度地图自定义瓦片图获取

nodejs代码const request require(request);const fs require(fs);const bagpipe require(bagpipe);const TileLnglatTransform require(tile-lnglat-transform);let [x1, y1] [72.26, 54.57]; // 起始点坐标(左上角)let [x2, y2] [137.31, 17.8]; // 终点坐标(右下角)le…

IntelliJ IDEA for Mac 如何自定义快捷键_设置快捷键

文章目录设置代码补全快捷键设置展开全部的快捷键折叠全部快捷键设置代码补全快捷键 代码自动补全&#xff0c;即智能提示。 打开【系统偏好设置】如下图所示&#xff1a; 在左侧的菜单栏中找到 Keymap → Main Menu → Code → Code Completion → Basic&#xff1a; 设…

android8 老手机,华为多款老旧手机获升安卓8.0,流畅度飙升!

原标题&#xff1a;华为多款老旧手机获升安卓8.0&#xff0c;流畅度飙升&#xff01;一直以来&#xff0c;在手机用户圈都有这么一个共识&#xff0c;那就是安卓手机不如iPhone流畅&#xff0c;之前安卓手机给人的印象就是容易卡顿&#xff0c;而谷歌则一直在为此事苦恼&#x…

java12关键字var_Java 10:“ var”关键字

java12关键字varJava 10使用关键字var引入了局部变量类型推断 。 这意味着无需编写&#xff1a; Map<Department, List<Employee>> map new HashMap<>(); // ... for (Entry<Department, List<Employee>> dept : map.entrySet()) {List<Emp…

IntelliJ IDEA for Mac自定义动态代码模板快捷键(Live Templates Shortcut)

文章目录查看更多的快捷键常用的代码模板自定义代码模板快捷键格式化等号文档注释代码模板快捷键应用示例声明定义引用类型变量数组的 for 循环指定循环次数的 for 循环增强 for 循环倒序 for 循环自动生成普通 for 循环语句自动生成main 方法自动生成输出语句自动生成增强for循…

android udp 设备发现,两台Android设备之间进行UDP连接(使用多播地址)~~求大神指点...

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼首先 发送端&#xff1a;package com.example.multicastclient;import android.support.v7.app.ActionBarActivity;import java.io.IOException;import java.net.DatagramPacket;import java.net.InetAddress;import java.net.Mult…

java serial_Java的@Serial批注

java serialJDK可能正在使用JDK 11 &#xff1a; Serial获得另一个标准&#xff08;预定义&#xff09;注释 。 JDK-8202385 [“标记与序列相关的字段和方法的注释”]的目的是添加“某种“ SerialRelated”注释&#xff0c;以促进对序列字段和方法的声明的自动检查。” 这种想法…

IntelliJ IDEA 选中变量名,高亮显示其它地方的这个变量名,高亮颜色如何设置呢?

选中了一个变量名&#xff0c;会高亮显示位于别的地方的这个变量名&#xff0c;那么怎么修改其他地方的高亮颜色&#xff1f; 按下 Command , 打开偏好设置窗口&#xff0c;接着看下图&#xff1a;

rest和rest ful_还有更多REST技巧

rest和rest ful在以前的博客文章中&#xff0c;我介绍了一些实现REST体系结构的想法和技巧。 在这篇文章中&#xff0c;我将介绍更多的想法和技巧。 快取 缓存是原始论文的很大一部分。 见5.1.4节 策略包括验证&#xff08; 客户端检查它是否具有最新版本 &#xff09;和过期…