Android权限申请完全解析(一):Android自带的权限申请
1.为什么要权限申请
6.0以上就需要了,别问为什么。(不是重点,自行搜索)
2.如何进行权限申请
- Android自带的权限申请
- EasyPermission权限申请
Ps:EasyPermission还没开始玩,下次玩透了写博客。
3.权限申请的具体写法
3.1 假设有一个需要权限才能运行的方法
/**
* 假设这是一个需要权限才能运行的方法
*/
private void PermissionTest() {
Toast.makeText(this, "这是一个需要权限才能运行的方法!", Toast.LENGTH_SHORT).show();
}
3.2 申请单个权限,比如说:打电话
button1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(MainActivity.this, "You clicked Button1", Toast.LENGTH_SHORT).show();
if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) {
// 不相等 请求授权
ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.CALL_PHONE}, 1);
} else {
PermissionTest();
}
}
});
权限申请的时候,需要判断是否已经有权限了,如果有,则直接运行,没有的话在进入权限申请。单个权限比较简单。Activity.requestPermissions的方法需要三个参数,第一个:Context,第二个:传入需要申请的权限(可多个),第三个:请求代码(用于回调处理)
3.2 申请多个权限
button2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(MainActivity.this, "You clicked Button2", Toast.LENGTH_SHORT).show();
//一次申请两个权限的写法,当然判断的时候有一个权限没有申请的时候无法执行当前方法
if(ContextCompat.checkSelfPermission(MainActivity.this,Manifest.permission.RECORD_AUDIO)!= PackageManager.PERMISSION_GRANTED ||
ContextCompat.checkSelfPermission(MainActivity.this,Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED){
ActivityCompat.requestPermissions(MainActivity.this,new String[]{Manifest.permission.RECORD_AUDIO,Manifest.permission.WRITE_EXTERNAL_STORAGE},2);
}
else{
PermissionTest();
}
}
});
一次申请两个权限的写法(多个权限类似,多加几个恍恍惚惚),当然,判断的时候有一个权限没有申请的时候无法执行当前方法。
ActivityCompat.requestPermissions(MainActivity.this,new String[]{Manifest.permission.RECORD_AUDIO,Manifest.permission.WRITE_EXTERNAL_STORAGE},2);
传入需要申请的权限,这里申请录音和写存储卡的方法。请求代码传入2
3.3 回调处理
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
switch (requestCode) {
case 1:
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
Log.d(TAG, "onRequestPermissionsResult: " +
"电话权限申请成功");
for (int i : grantResults) {
Log.d(TAG, "onRequestPermissionsResult: " + i);
}
PermissionTest();
}
else {
Toast.makeText(this, "You denied the permission", Toast.LENGTH_SHORT).show();
}
break;
case 2:
if(grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED && grantResults[1] == PackageManager.PERMISSION_GRANTED){
Log.d(TAG, "onRequestPermissionsResult: " +
"权限申请成功");
PermissionTest();
}
else{
Toast.makeText(this, "You denied the permission", Toast.LENGTH_SHORT).show();
}
break;
default:
break;
}
}
说明:请求代码的窗口跳出,用户点击之后,每个权限就能够判断是否申请成功了。
分支语句switch(requestCode),每一个case就是之前传入的请求码
case1 说明:
单个权限已经被申请,判断方法,grantResult数组长度大于0,grantResult数组的第一项的值等于PackageManager.PERMISSION_GRANTED (其实就是0,没有被授权的话值等于-1)。然后执行PermissionTest方法。
case2 说明:
和case1一样,先判断grantResult数组长度大于0,grantResult数组的第一二两项是否等于PackageManager.PERMISSION_GRANTED(因为只有两个选项所以我就直接写了),权限申请之完毕之后就能够运行PermissionTest()方法了。
case2的判断语句可改进:定一个isAllGranted,扫一遍grantRsult,就好了
Boolean isAllGranted = true;
for (int permission : grantResults) {
if (permission != PackageManager.PERMISSION_GRANTED){
isAllGranted = false;
}
}
Ps:测试了一下,grantResults.length > 0 好像可以不用写。。。汗。。
结束语
权限申请之前一直懵逼,看了书之后还是不怎么会写,真到要用的时候心里一直怕怕的。今天刚好放假,所以花了一些时间来写这篇博客。这应该是我第一篇真正的Android博客了吧。下次更新Easy的使用。
欢迎大家观看,需要帮助可以留言。相遇就是缘分!
Android权限申请完全解析(一):Android自带的权限申请的更多相关文章
- Android 6.0 运行时权限处理完全解析
一.概述 随着Android 6.0发布以及普及,我们开发者所要应对的主要就是新版本SDK带来的一些变化,首先关注的就是权限机制的变化.对于6.0的几个主要的变化,查看查看官网的这篇文章http:// ...
- Android 6.0 运行时权限处理完全解析 (摘抄)
转载请标明出处: http://blog.csdn.net/lmj623565791/article/details/50709663: 本文出自:[张鸿洋的博客] 一.概述 随着Android 6. ...
- Android 6.0 执行时权限处理全然解析
转载请标明出处: http://blog.csdn.net/lmj623565791/article/details/50709663: 本文出自:[张鸿洋的博客] 一.概述 随着Android 6. ...
- 关于Android安装apk出现解析包异常问题情况总结
原文地址:关于Android安装apk出现解析包异常问题情况总结 | Stars-One的杂货小窝 说之前,可以推荐下各位使用这个开源库AndroidUtilCode,下面提及到的工具类,都是在此库中 ...
- Android权限管理之RxPermission解决Android 6.0 适配问题
前言: 上篇重点学习了Android 6.0的运行时权限,今天还是围绕着Android 6.0权限适配来总结学习,这里主要介绍一下我们公司解决Android 6.0权限适配的方案:RxJava+RxP ...
- Android开发之 Android应用程序详细解析
我们继续的沿用上一篇所建立的应用. Android应用程序可以分为:应用程序源代码(.java),应用程序描述文件(.xml),各种资源. 可以这么理解: 安卓应用程序,通过java代码来实现其业务逻 ...
- Android网络之数据解析----使用Google Gson解析Json数据
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...
- Android网络之数据解析----SAX方式解析XML数据
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/ ...
- Android安全机制(2) Android Permission权限控制机制
http://blog.csdn.net/vshuang/article/details/44001661 版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[+] 1.概述 Andro ...
随机推荐
- 【WePY小程序框架实战四】-使用async&await异步请求数据
[WePY小程序框架实战一]-创建项目 [WePY小程序框架实战二]-页面结构 [WePY小程序框架实战三]-组件传值 async await 是对promise的近一步优化,既解决了promise链 ...
- MVC登录前准备写好cookie
Insus.NET写过一系列的MVC的练习,昨天学习了jQuery的验证<在MVC应用程序中使用jQuery的验证>http://www.cnblogs.com/insus/p/34626 ...
- Redis-其他命令
1.排序 SORT : SORT sourcekey [BY pattern] [LIMIT offset count] [GET pattern [GET pattern ...]] [A ...
- 月赛 && SX_ACM 惨痛教训
1.cnt变量若有多次询问,一定要记得初始化!!! 2.多组数据输出入,区泛~. 3.高性能问题,考虑位运算,
- Java虚拟机--内存模型与线程
Java虚拟机--内存模型与线程 高速缓存:处理器要与内存交互,如读取.存储运算结果,而计算机的存储设备和处理器的运算速度差异巨大,所以加入一层读写速度和处理器接近的高速缓存来作为内存和处理器之间的缓 ...
- 彻底理解ReentrantLock
5.ReentrantLock的介绍 ReenTrantLock重入锁,是实现Lock接口的一个类,也是在实际编程中使用频率很高的一个锁,支持重入性,表示能够对共享资源能够重复加锁,即当前线程获取该锁 ...
- 【JVM】1、java虚拟机参数-X 与 -XX的区别
Options that begin with -X are non-standard (not guaranteed to be supported on all VM implementation ...
- RequestDispatcher.forward转发与HttpServletResponse.sendRedirect重定向
下面是HttpServletResponse.sendRedirect 方法实现的请求重定向与RequestDispatcher.forward 方法实现的请求转发的总结比较:(1)RequestDi ...
- 查看centos操作系统、java_jdk、hadoop位数
1.centos操作系统位数: file /bin/ls 此为64位 2.java jdk 位数: java -version 这个是64为的,若是没有,则默认为32位 3.hadoop位数: 进入h ...
- MVC 、JDBC、SQL、DBMS、RDBMS、DDL、DML、DCL
MVC: 全称:Model View Controller: 解释:模型(model)-视图(view)-控制器(controller) Model(模型)表示应用程序核心(比如数据库记录列表). V ...