android代码判断权限,安卓权限检测代码

Android 23 以后加入了新的权限检查机制,对一些危险权限,进行了新的授权管理,以让用户明确app都是用了哪些权限,这也让我们的开发多做了一些工作。

public class BaseActivity extends Activity {

protected static final int REQ_CODE_REQUEST_OPEN_PERMISSION = 0x9001;

// 危险权限的列表

private static Map sPermissionMap;

static {

sPermissionMap = new LinkedHashMap<>();

sPermissionMap.put(Manifest.permission.READ_PHONE_STATE, "读取手机信息");

sPermissionMap.put(Manifest.permission.READ_CONTACTS, "读取联系人");

sPermissionMap.put(Manifest.permission.WRITE_EXTERNAL_STORAGE, "读写外部存储空间");

sPermissionMap.put(Manifest.permission.CAMERA, "相机");

sPermissionMap.put(Manifest.permission.RECORD_AUDIO, "录音");

sPermissionMap.put(Manifest.permission.ACCESS_FINE_LOCATION, "访问位置");

}

// 检测权限

protected void checkPermission() {

Observable.fromIterable(sPermissionMap.keySet()).filter(new Predicate() {

@Override

public boolean test(String permission) throws Exception {

return ActivityCompat.checkSelfPermission(BaseActivity.this, permission) != PackageManager.PERMISSION_GRANTED;

}

}).toList().subscribe(new Consumer>() {

@Override

public void accept(List permissions) throws Exception {

requestPermissions(permissions.toArray(new String[0]));

}

});

}

// 判断是否需要显示为什么要申请权限

private void shouldShowRequestPermissionRationale(final List permissions) {

Observable.fromIterable(permissions).filter(new Predicate() {

@Override

public boolean test(String permission) throws Exception {

return ActivityCompat.shouldShowRequestPermissionRationale(BaseActivity.this, permission);

}

}).toList().subscribe(new Consumer>() {

@Override

public void accept(final List showRequestPermissions) throws Exception {

if (showRequestPermissions.size() > 0) {

getPermissionRationale(showRequestPermissions).subscribe(new Consumer() {

@Override

public void accept(String permissionRationale) throws Exception {

showRequestPermissionRationaleDialog(permissions, permissionRationale);

}

});

} else {

/**

* // 下面的代码可以强制用户打开所有的权限。

* getPermissionRationale(permissions).subscribe(new Consumer() {

* @Override

* public void accept(String permissionRationale) throws Exception {

* showPermissionRefusedDialog(permissionRationale);

* }

* });

*/

onPermissionGranted();

}

}

});

}

// 获取权限的提示

private Observable getPermissionRationale(List permissions) {

return Observable.fromIterable(permissions).toList().map(new Function, String>() {

@Override

public String apply(List permissions) throws Exception {

StringBuilder builder = new StringBuilder();

if (permissions != null && permissions.size() > 0) {

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

builder.append(sPermissionMap.get(permissions.get(i)));

if (i != permissions.size() - 1) {

builder.append(",");

}

}

}

return builder.toString();

}

});

}

// 显示为什么要申请权限的对话框

private void showRequestPermissionRationaleDialog(final List permissions, String permissionRationale) {

// 显示权限请求对话框

DialogUtils.showAlert(BaseActivity.this, "申请权限", "应用需要申请" + permissionRationale + "的权限", new DialogInterface.OnClickListener() {

@Override

public void onClick(DialogInterface dialog, int which) {

requestPermissions(permissions.toArray(new String[0]));

}

});

}

// 申请权限

private void requestPermissions(String[] permissions) {

if (permissions == null || permissions.length == 0) {

onPermissionGranted();

return;

}

ActivityCompat.requestPermissions(BaseActivity.this, permissions, Config.REQUEST_ASK_PERMISSIONS);

}

// 权限授权后

protected void onPermissionGranted() {

}

// 提供给子类检查权限,如果没有权限,提示用户打开相应的权限。

@Override

public void checkPermissions(String... permissions) {

Observable.fromArray(permissions).filter(new Predicate() {

@Override

public boolean test(String permission) throws Exception {

return ActivityCompat.checkSelfPermission(BaseActivity.this, permission) != PackageManager.PERMISSION_GRANTED;

}

}).toList().subscribe(new Consumer>() {

@Override

public void accept(List notGrantPermissions) throws Exception {

getPermissionRationale(notGrantPermissions).subscribe(new Consumer() {

@Override

public void accept(String permissionRationale) throws Exception {

if (!TextUtils.isEmpty(permissionRationale)) {

showPermissionRefusedDialog(permissionRationale);

}

}

});

}

});

}

@Override

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

if (requestCode == Config.REQUEST_ASK_PERMISSIONS) {

if (grantResults == null || grantResults.length == 0) return;

List notGrantedPermissions = new ArrayList<>();

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

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

notGrantedPermissions.add(permissions[i]);

}

}

if (notGrantedPermissions.size() == 0) {

onPermissionGranted();

} else {

shouldShowRequestPermissionRationale(notGrantedPermissions);

}

}

}

// 显示权限拒绝对话框

protected void showPermissionRefusedDialog(String permissionRationale) {

DialogUtils.showConfirm(this, "申请权限", "应用需要申请" + permissionRationale + "的权限,但已被拒绝,请手动设置。", getString(R.string.sure), new DialogInterface.OnClickListener() {

@Override

public void onClick(DialogInterface dialog, int which) {

SystemCompat.startPermissionSettingActivityForResult(BaseActivity.this, REQ_CODE_REQUEST_OPEN_PERMISSION);

}

}, getString(R.string.cancel), null);

}

}

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

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

相关文章

burpsuite小米手机抓包_使用burpsuite实现Android APP的HTTPS抓包

0x00 序在对app做安全测试时&#xff0c;通常会需要对app的网络通信进行抓包&#xff0c;但是面对app使用了https包时&#xff0c;由于手机没有burp的证书&#xff0c;因此可能会导致该次通信失败&#xff0c;所以下面的文章主要讲述如何通过burp抓取app的https包。0x01 获取bu…

android fragment framelayout,framelayout中fragment的切换

我们在android开发中经常会用到fragment&#xff0c;例如侧拉栏的切换&#xff0c;viewPager的切换。而我们切换fragment无非就两种方法&#xff1a;1.replace()&#xff1b;2.add()&#xff0c;hide()&#xff0c;show()&#xff1b;两种发方法相比较而言&#xff0c;我更加推…

透明大页相关内核参数_透明大内存页Hugepage支持

目标在linux2.6.38之前&#xff0c;处理大容量内存工作集的高性能关键计算应用是运行在libhugetlbfs之上&#xff0c;必须依赖于hugetlbfs&#xff0c;。透明Hugepage支持是一种替代手段&#xff0c;它使用大内存页&#xff0c;并且虚拟内存页的大小可以动态变化&#xff0c;没…

c语言五子棋斜向判断,c语言 五子棋危险判断 求大神解释啊

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼代码#include #define right r#define lower l#define lower_right i#define lower_left e#define none oint table[19][19];int hit_space(int x, int y, char vec){if (vec right){if (x - 1 > 0 && table[x - 1][y]…

vue项目接口地址暴露_vue组件暴露和.js文件暴露接口操作

1、将同一类型的组件放在一个文件夹下2、在此文件夹下创建一个index.js3、在index.js中导入组件&#xff0c;并把他们暴露出去1、写法一import studentCourse1 from ./studentCourse.vueimport studentInfo1 from ./studentInfo.vueexport var studentCoursestudentCourse1expo…

linux编译lnx文件命令_linux命令dd

dd使用dd这个linux命令可以创建一定大小文件。linux创建文件命令&#xff1a;dd命令把指定的输入文件拷贝到指定的输出文件中&#xff0c;并且在拷贝的过程中可以进行格式转换。语法&#xff1a;CODE:[Copy to clipboard]dd 〔选项〕QUOTE:if 输入文件(或设备名称)。of 输出文件…

android opencv 水印,关于opencv对图片添加水印

有一段时间没有写博客了&#xff0c;最近因为自己需要给图片添加水印&#xff0c;就写了个简单的图片添加水印python:3.6.7pycharmopencv是一个开源的库&#xff0c;是有c编写&#xff0c;支持c &#xff0c;python&#xff0c;java和matlab接口&#xff0c;并支持windows&…

python做一个窗口样式_python3+PyQt5 自定义窗口部件--使用窗口部件样式表的方法...

本文借用HTML的css语法&#xff0c;将样式表应用到窗口部件。这里只是个简单的例子&#xff0c;实际上样式表的语法很丰富。以下类似于css&#xff1a;StyleSheet """QComboBox { color: darkblue; }QLineEdit { color: darkgreen; }QLineEdit[mandatory"…

华为开发微信鸿蒙版,HUAWEI DevEco Studio

华为鸿蒙2.0开发平台为开发者在PC上面所提供的的开发平台&#xff0c;这个平台能够让用户在PC和Mac上面完成对鸿蒙相关开发内容&#xff0c;开发者能够在这个官方的平台当中开发属于自己的应用内容&#xff0c;更好的开发属于自己的应用并且在上面进行全面的调试&#xff0c;感…

linux安装python3.6 setuptools_linux下安装Python3.6.1

linux下安装Python3.6.1Python-3.6.1下载wget https://www.python.org/ftp/python/3.6.1/Python-3.6.1.tar.xz解压、编译、安装tar Jxvf Python-3.6.1.tar.xzcd Python-3.6.1./configure --prefix/usr/local/python3make && make install最终显示下面代码表示python3…

function里面可以写function吗_和田玉不戴的时候,可以长时间泡在水里面吗?

叶子珠宝翡翠批发商城数百万玉石好友聚集地翡翠行业最活跃的领军&#xff0c;实力收藏家都在关注新朋友请点击叶子珠宝翡翠批发商城关注&#xff01;抢购源头翡翠&#xff01;请加1号店微信号&#xff1a;stchenchuye(←长按复制请加2号店微信号&#xff1a;feicui1236(←长按复…

shell判定一个变量等于-n_Shell test命令:条件判断,检查某条件是否成立

test 命令是 Bash 中重要的判断命令&#xff0c;也是 Shell 脚本中条件判断的重要辅助工具。当我们需要让程序自动判断哪些事情是成立的时&#xff0c;test 命令就派上用场了。按照文件类型进行判断根据表 1&#xff0c;我们先来看看 test 可以进行哪些文件类型的判断。表 1 文…

android智能老人机系统,国产老人机也可以变智能!可运行Android

原标题&#xff1a;国产老人机也可以变智能&#xff01;可运行Android相信很多用户对老人机的认知都是大电池、小屏幕、高音量以及功能少。看完下边这个老年机&#xff0c;你的认知可能会被颠覆。微博用户极客村长今天在微博上放出了一张来自国内厂商TETC的老人机图片&#xff…

android时间最大,Android TimePickerDialog设置最大时间

对于lolipop和更高版本的android&#xff0c;您可以使用此修改过的RangeTimePickerDialog类(从lolipop&#xff0c;Timepicker默认使用时钟模式(材料设计)&#xff0c;因此旧的自定义类将无法使用。我们可以将模式更改为Spinner以获取最新版本&#xff0c;并可以重用该类)publi…

css毛玻璃效果白边_css3毛玻璃效果白边问题_html/css_WEB-ITnose

注&#xff1a;css3毛玻璃效果应该很多人都知道怎么实现&#xff0c;但是有个问题是图片模糊了之后相当于缩小了&#xff0c;所以颜色深的图片会出现白边&#xff0c;这里说下我参考网上的解决方式吧&#xff01;1、毛玻璃实现方法&#xff1a;CSS3 blur滤镜实现如下测试代码&a…

如何把html转换cad,Tab2Xls插件(捷克版)将AutoCAD表格转换为XLS、CSV或HTML。

一、插件简介Tab2Xls-将表导出到XLS、CSV或HTMLTab2Xls是一个用于AutoCAD的LISP实用程序&#xff0c;用于导出将AutoCAD表格转换为XLS、CSV或HTML。启动TAB2XLS命令并选择一个table对象-Excel应用程序将启动&#xff0c;表格将以选定的名称保存(默认情况下&#xff1a;绘图路径…

python问卷调查数据分析_如何用excel统计调查问卷

有些人可能经常要对调查问卷进行统计&#xff0c;使用手写的方法(就是在纸上写正字的方法)虽然很方便&#xff0c;不过不方便在一定条件下进行统计&#xff0c;如在男士的条件下&#xff0c;使用诺基亚的手机有多少人。而用excel可以很方便得出此类统计结果&#xff0c;并且由于…

html中什么是语义,html – “语义正确”是什么意思?

标签正确这意味着你正在调用它实际上是什么。典型的例子是&#xff0c;如果某个表是一个表&#xff0c;它应该包含行和数据列。要用于布局语义上是不正确的 – 你不是说“这是一个表”。另一个例子&#xff1a;通常应该使用列表(< ul> or< ol>)来对相似的项目(<…

golang商城_Golang——简单是终极的成熟

Google的Rob Pike在2012年的主题演讲中说&#xff1a;“ Go的目的不是要对编程语言设计进行研究&#xff1b; 这是为了为其设计师及其同事改善工作环境。 与编程语言研究相比&#xff0c;Go不仅仅是软件工程。 换一句话&#xff0c;它与软件工程服务中的语言设计有关。” 演讲揭…

android 换行模式,Android进阶之自定义View(1)实现可换行的TextView

今天来一起学习一下最简单的自定义view,自己动手写一个MyTextView,当然不会像系统的TextView那么复杂&#xff0c;只是实现一下TextView的简单功能&#xff0c;包括分行显示及自定义属性的处理&#xff0c;主要目的是介绍自定义view的实现的基本思路和需要掌握的一些基础知识。…