android 6.0权限请求
来源:互联网 发布:详细设计说明书 算法 编辑:程序博客网 时间:2024/04/28 16:28
最近手机升级到6.0之后,原先的程序就跑不了了,原因主要出自6.0以后,权限会被控制,用户既可以授权,也可以禁止这个权限,从而达到了保护自己隐私的目的。
然而我们的程序为了保证用户的唯一性,就是通过获取手机的mac地址或者IMEI识别码来实现的,但是假如我们要获取IMEI码的话,只要是通过在mainfest中配置
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
再在代码中写上
TelephonyManager manager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); String imeiCode = manager.getDeviceId();这样基本上就可以获取得到了,要是获取不到,报
Neither user 10129 nor current process has android.permission.READ_PHONE_STATENeither user 10056 nor current process has android.permission.MODIFY_PHONE_STATE
这2者的之一的,原因主要在于你的手机没有root,或者第二个权限是系统权限,不能直接获取,要么就是用户已经禁止了你访问手机状态了
那么,该咋办呢,当然不能为了你这个app,用户还要花时间去root吧。
那么,解决的方法主要有2个。
1.舍弃IMEI码,将代码改成了从获取imei变成或获取mac地址
TelephonyManager manager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); String imeiCode =null; try { imeiCode=manager.getDeviceId(); }catch(Exception e){ imeiCode=getMacAddress(context); }
2.动态获取我们所需要的权限
具体的主要分为4步:
1)检查权限
2)请求权限
3)获取deviceID
4)设置deviceId
首先我们需要在Activity中的onresume或者fragment的setuservisiblehint中,检查我们的权限,写法如下:
private static String[] PERMISSION= {Manifest.permission.READ_PHONE_STATE}; private boolean islacksOfPermission(String permission){ if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.M){ return ContextCompat.checkSelfPermission(mContext, permission) == PackageManager.PERMISSION_DENIED; } return false; } @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); if(requestCode==0x12){ setDeviceId(); }else{ finish(); } }其次就是
@Override protected void onResume() { super.onResume(); if(islacksOfPermission(PERMISSION[0])){ ActivityCompat.requestPermissions(this,PERMISSION,0x12); }else{ setDeviceId(); } } private void setDeviceId(){ device_Id=getDeviceId(); app.setDeviceID(device_Id); } private String device_Id=""; private String getDeviceId(){ return Utils.getDeviceImei(mContext); }
这样基本就可以搞定我们的权限问题了,当然为了用户更佳的体验感,可以加上请求权限的对话框之类的。
其次就是camera的问题,上面那个权限我们只要在配置文件里面写了该写的权限,就可以了,但是camera属于危险权限(google说的),因此,在6.0里,仅仅在配置文件里面写了还不够,还需要在程序里面向上面那样请求,但是表现的形式不一样,因为是危险权限,因此会有一个提示应用请求选线对话框,这个对话框是google系统自带的。
因此,写法也是一样,只要在permission改一下名字,改成:
private static String[] PERMISSION = {Manifest.permission.CAMERA};其次就是在
@Override public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { if(requestCode==0x12){ if (grantResults[0] == PackageManager.PERMISSION_GRANTED) { // Permission Granted initCamera(); } else { // Permission Denied Toast.makeText(this, "CALL_PHONE Denied", Toast.LENGTH_SHORT) .show(); finish(); } }else{ finish(); } }在这里上面加上初始化就好
谢谢~
0 0
- android 6.0权限请求
- Android (6.0) M 请求权限
- Android 6.0应用权限请求
- Android 6.0 权限请求问题
- Android 6.0 动态请求权限
- 自定义android 6.0请求权限
- android 6.0 动态请求权限
- Android 6.0(M) 获得权限请求问题
- Android 6.0 运行时请求权限
- 4.14-3 Android 6.0 请求权限
- Android 6.0运行时权限请求示例
- Android 6.0开始动态请求权限
- 请求动态权限 代码 Android 6.0
- android 6.0 权限请求工具类
- android在6.0上的权限请求
- Android 6.0+在运行时请求权限
- 关于android 6.0手机权限动态请求
- Android 6.0以上 权限请求封装
- Android官方开发文档Training系列课程中文版:目录
- maven 常用命令
- 直接插入排序
- C++怎么把字符串中的小写变为大写
- 最小点覆盖 poj2226 Muddy Fields
- android 6.0权限请求
- Linux安装redis
- 开始学习C语言C++在这里记录自己的成长。简单的两变量交换问题
- bzoj 1257: [CQOI2007]余数之和sum 【数学 分块统计】
- 这才是真正的物流大数据挖掘思路
- Redis集群方案及实现
- JFinal First Demo "Hello World"
- HDU-1878(欧拉回路)(并查集)
- POJ2524 Ubiquitous Religions