Android M动态申请获取权限android.permission.READ_PHONE_STATE
来源:互联网 发布:苹果mac官方壁纸 编辑:程序博客网 时间:2024/06/06 02:27
Android M对应用的授权策略做了变动,如果我们想调用getDeviceId()获取手机串码,只在Manifest里添加android.permission.READ_PHONE_STATE权限是不够的,如果不做权限的动态申请和处理,可能会报如下错误:
AndroidRuntime: java.lang.SecurityException: getDeviceId: Neither user 10201 nor current process has android.permission.READ_PHONE_STATE.
那如何在代码中动态申请权限呢?分四步进行:
第一步,在Manifest文件中添加权限:
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
第二步, 要获取权限进行操作的Activity实现 ActivityCompat.OnRequestPermissionsResultCallback接口(这一步貌似不是必须):
public class MainActivity extends Activity implements ActivityCompat.OnRequestPermissionsResultCallback {
第三步,动态申请权限并做处理:
int permissionCheck = ContextCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_STATE); if (permissionCheck != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_PHONE_STATE}, REQUEST_READ_PHONE_STATE); } else { //TODO }
第四步, 重写onRequestPermissionsResult()方法,对权限申请结果做处理:
@Overridepublic void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) { switch (requestCode) { case REQUEST_READ_PHONE_STATE: if ((grantResults.length > 0) && (grantResults[0] == PackageManager.PERMISSION_GRANTED)) { //TODO } break; default: break; }}
下面对关键方法做一个解释:
1、检查是否有权限:
ActivityCompat.checkSelfPermission
eg:检查是否有读取联系人权限
ActivityCompat.checkSelfPermission(this,Manifest.permission.READ_CONTACTS)!= PackageManager.PERMISSION_GRANTED
2、是否重新请求授权(用户之前拒绝过,并且勾选了“不再提示”):
ActivityCompat.shouldShowRequestPermissionRationale(this,Manifest.permission.READ_CONTACTS)
Android原生系统中,如果第二次弹出权限申请的对话框,会出现“以后不再弹出”的提示框,如果用户勾选了,你再申请权限,则shouldShowRequestPermissionRationale会返回true,意思是说要给用户一个 解释,告诉用户为什么要这个权限。
然而,在实际开发中,很多手机对原生系统做了修改,比如小米4的6.0的shouldShowRequestPermissionRationale 就一直返回false,而且在申请权限时,如果用户选择了拒绝,则不会再弹出对话框了。如果是这样,我们可以在回调里面处理,如果用户拒绝了这个权限,则打开本应用信息界面,由用户自己手动开启这个权限。
3、请求授权:
ActivityCompat.requestPermissions
注意的是,调用此方法后,系统会弹出一个权限申请框,供用户选择,这个选择框我们无法更改:
而且此时activity会调用onPause()方法,用户做了选择之后,此对话框消失,onResume()方法又会执行。
4、搜权结果,通过 ActivityCompat.OnRequestPermissionsResultCallback 回调获取授权结果,判断是否授权。
@Override public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); if (requestCode == REQUEST_CODE_INFO_OF_PHONE_SETTINGS) { if (grantResults[0] == PackageManager.PERMISSION_GRANTED) { L.d("imei", "permission is granted after requested!"); } else if (grantResults[0] == PackageManager.PERMISSION_DENIED){ L.d("imei", "permission is not granted after requested!"); //这里表示申请权限后被用户拒绝了 } else { L.d("imei", "permission is not granted after requested!"); } } }
关于更多运行时请求权限的问题,可以查看https://developer.android.com/training/permissions/requesting.html
更详细请看http://mdsa.51cto.com/art/201508/489882_all.htm#topx
- Android M动态申请获取权限android.permission.READ_PHONE_STATE
- Android M动态申请获取权限android.permission.READ_PHONE_STATE
- android M 动态申请权限
- Unity Android READ_PHONE_STATE permission
- 在android 6.0动态权限问题无法获取READ_PHONE_STATE权限的SecurityException的问题
- Android M 动态权限获取
- Android M 动态权限获取
- Android M 动态权限获取
- Android M 动态权限获取
- Android 动态申请权限 (解决:open failed: EACCES (Permission denied))
- Android 权限Permission大全及Android6.0动态申请步骤
- 获取手机信息<uses-permission android:name="android.permission.READ_PHONE_STATE" />
- 获取手机信息<uses-permission android:name="android.permission.READ_PHONE_STATE" />
- Android permission 动态申请、授权
- Android M动态获取权限示例
- android 动态申请权限
- Android 动态申请权限
- android 动态申请权限
- hashset实现原理
- 十一周项目一 验证算法二查数算法的验证
- 解决Spring AOP 事务 配置 失效原因--业务类里抛出的异常不满足事务拦截器里定义的异常
- 第5章 Spring Boot基础
- 打造扛得住的MYSQL数据库架构
- Android M动态申请获取权限android.permission.READ_PHONE_STATE
- Jquery获取标签及对标签的相关操作
- 高仿Demo获取该App图片
- mysql启动失败Starting MySQL.The server quit without updating PID file ([失败]ysqllnmp.pid)
- protobuf 自动生成c# .cs文件 -protogen用法
- QT4.7开发环境搭建主要步骤,全志A33 + win7桌面版
- http协议里的chunked编码与测试
- 网宿开发环境总结
- PDO对象详解