为什么android 弹出权限选择6.0以下的也会弹出申请权限的弹窗

说说Android6.0动态申请权限的那些坑
来源:博客园
白天在做SDK23版本的适配,遇到了不少坑,现在抽空记下来,以此为戒。
  首先要知道哪些坑,就得先了解一些定义和基本使用方式。
那么先介绍一下动态申请的权限分组情况。
  下面的权限组是由谷歌官方定义的,目的是在申请权限时,只要用户允许同一权限组的任意一条权限,那么该组的其他权限也就默认是允许的。不过据高人介绍,在使用时最好是用到哪个权限就具体的请求该权限,因为保不齐哪天谷歌一高兴就把权限组换了甚至删了、

group:android.permission-group.CONTACTS
permission:android.permission.WRITE_CONTACTS
permission:android.permission.GET_ACCOUNTS
permission:android.permission.READ_CONTACTS

group:android.permission-group.PHONE
permission:android.permission.READ_CALL_LOG
permission:android.permission.READ_PHONE_STATE
permission:android.permission.CALL_PHONE
permission:android.permission.WRITE_CALL_LOG
permission:android.permission.USE_SIP
permission:android.permission.PROCESS_OUTGOING_CALLS
permission:com.android.voicemail.permission.ADD_VOICEMAIL

group:android.permission-group.CALENDAR
permission:android.permission.READ_CALENDAR
permission:android.permission.WRITE_CALENDAR

group:android.permission-group.CAMERA
permission:android.permission.CAMERA

group:android.permission-group.SENSORS
permission:android.permission.BODY_SENSORS

group:android.permission-group.LOCATION
permission:android.permission.ACCESS_FINE_LOCATION
permission:android.permission.ACCESS_COARSE_LOCATION

group:android.permission-group.STORAGE
permission:android.permission.READ_EXTERNAL_STORAGE
permission:android.permission.WRITE_EXTERNAL_STORAGE

group:android.permission-group.MICROPHONE
permission:android.permission.RECORD_AUDIO

group:android.permission-group.SMS
permission:android.permission.READ_SMS
permission:android.permission.RECEIVE_WAP_PUSH
permission:android.permission.RECEIVE_MMS
permission:android.permission.RECEIVE_SMS
permission:android.permission.SEND_SMS
permission:android.permission.READ_CELL_BROADCASTS

 
其实权限组的定义很简单,下面简单介绍下动态申请权限的步骤。
第一步,检查app拥有的权限。 

1 if(ContextCompat.checkSelfPermission(
2
mActivity,Manifest.permisson.READ_CONTACTS)
3
!= PackageManager.PERMISSION_GRANTED) {
4
//当前Activity没有获得READ_CONTACTS权限时
5 }else{
6
//否则已允许
7 }

第二步,申请权限。

1 ActivityCompat.requestPermissions(
2
mActivity,
3
new String[]{Manifest.permission.READ_CONTACTS},
4
REQUEST_CODE_PERMISSION_CONTACTS);

 
第三步,权限申请回调方法。

 1 @Override
 2 public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
 3
switch (requestCode) {
 4
case REQUEST_CODE_PERMISSION_CONTACTS: {
 5
if (grantResults.length & 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
 6
//用户已授权
 7
} else {
 8
//用户拒绝权限
 9
return;
11
}
13 }

 
如此三步,看上去很简单,可真要用起来可就没有那么简单了。下面就说说这里边的坑吧。
 
坑一、权限申请只能在Activity或者Fragment的上下文中,不能用getApplicationContext()。
  由于我们项目在应用初始化时要获取内存的存储路径并创建一系列文件缓存,这些操作都是写在Application的onCreate()中调用不同的Util工具类进行的,所以在Android6.0以上这么写就有点不太靠谱了。目前我的解决措施是在应用程序初始化时,先判断SDK版本,只对版本号小于23的app创建缓存文件,高于23的则在进入Activity之后再初始化。
 
坑二、权限申请时使用的请求码必须小于16。
  至于什么原因不太清楚,可能谷歌公司认为权限本来就不多,没必要将请求码弄得很大占用多余的内存吧。说到请求码,也就是上面代码中未定义的常量值REQUEST_CODE_PERMISSION_CONTACTS,如果你定义的这个值超过了15,运行时就会报安全异常,提示请求码必须小于16。
 
目前来说这两个坑就够我忙活一天的了,看来还是经验不足啊,以后还要多多吸取经验。
免责声明:本站部分内容、图片、文字、视频等来自于互联网,仅供大家学习与交流。相关内容如涉嫌侵犯您的知识产权或其他合法权益,请向本站发送有效通知,我们会及时处理。反馈邮箱&&&&。
学生服务号
在线咨询,奖学金返现,名师点评,等你来互动匿名用户不能发表回复!|
每天回帖即可获得10分可用分!小技巧:
你还可以输入10000个字符
(Ctrl+Enter)
请遵守CSDN,不得违反国家法律法规。
转载文章请注明出自“CSDN(www.csdn.net)”。如是商业用途请联系原作者。在线时间4 小时
版本V7.0.4.0.LXACNCI
积分 45, 距离下一级还需 5 积分
积分 45, 距离下一级还需 5 积分
机型小米手机2/2S
MIUI版本V7.0.4.0.LXACNCI
V7.3.3.0.MAACNDD
项目中使用ContextCompat.checkSelfPermission(context, permission)方法检查App是否拥有定位权限,ACCESS_COARSE_LOCATION以及ACCESS_FINE_LOCATION,在App权限管理页面关闭定位权限,上述方法仍然返回true!!!
定位权限选择为询问,进入App会调用一次系统申请权限方法ActivityCompat.requestPermissions,权限弹框选择拒绝,调用checkSelfPermission方法,仍然返回true!!!
本帖最后由 jayzjay 于
16:00 编辑
Screenshot_-15-05-18_com.dianping.v1.png (121.64 KB, 下载次数: 0)
分享到微信朋友圈
打开微信,点击底部的“发现”,使用 “扫一扫” 即可将网页分享到我的朋友圈。
在线时间4 小时
版本V7.0.4.0.LXACNCI
积分 45, 距离下一级还需 5 积分
积分 45, 距离下一级还需 5 积分
机型小米手机2/2S
MIUI版本V7.0.4.0.LXACNCI
经验8977 米
在线时间60 小时
版本7.9.20
机型小米手机6
签到次数59
MIUI版本7.9.20
经验9328 米
在线时间253 小时
版本7.10.17
机型小米手机6
签到次数136
MIUI版本7.10.17
@小Mi粉2012
在线时间4 小时
版本V7.0.4.0.LXACNCI
积分 45, 距离下一级还需 5 积分
积分 45, 距离下一级还需 5 积分
机型小米手机2/2S
MIUI版本V7.0.4.0.LXACNCI
在线时间55 小时
版本7.9.13
积分 122, 距离下一级还需 78 积分
积分 122, 距离下一级还需 78 积分
机型小米手机3/4 WCDMA版
MIUI版本7.9.13
关于MIUI 6.0 权限检测,运行时允许,但Appops拒绝 也是不 能访问的
第一步检测运行时权限
第二步检测Appops权限
Appops权限检测代码AppOpsManager appOpsManager = (AppOpsManager) getSystemService(Context.APP_OPS_SERVICE);
& && &&&int checkOp = appOpsManager.checkOp(AppOpsManager.OPSTR_FINE_LOCATION, Process.myUid(), getPackageName());
& && &&&if (checkOp == AppOpsManager.MODE_IGNORED) {
& && &&&// 权限被拒绝了 .
& && &&&}复制代码
在线时间4 小时
版本V7.0.4.0.LXACNCI
积分 45, 距离下一级还需 5 积分
积分 45, 距离下一级还需 5 积分
机型小米手机2/2S
MIUI版本V7.0.4.0.LXACNCI
关于MIUI 6.0 权限检测,运行时允许,但Appops拒绝 也是不 能访问的
第一步检测运行时权限
第二步检测Appop ...
请问是小米工程师吗?目前没发现其他6.0手机上有这个问题,应该是其他rom上运行时权限和Appops权限保持一致的。miui rom应该是分开了??那miui应用的权限管理界面里管理的是应用运行时权限还是appops权限呢?
经验3479 米
在线时间18 小时
版本7.7.18
机型小米手机5
签到次数189
MIUI版本7.7.18
解决了吗,这个问题是不是miui把api改了啊,这个问题真的很重要啊
在线时间2 小时
积分 29, 距离下一级还需 21 积分
积分 29, 距离下一级还需 21 积分
今天刚好有用到,调了半天发现和楼主遇到的一样。
checkSelfPermission始终返回0
系统:MIUI7.3 稳定版7.3.0(MXDCNDD)
小米 麻利点啊~&&
在线时间2 小时
积分 29, 距离下一级还需 21 积分
积分 29, 距离下一级还需 21 积分
补充一下,如果在 安全中心--》授权管理内设置定位权限为:询问
checkSelfPermission返回值倒是!=0
但是requestPermissions调用权限请求框,不正常
偶尔一闪而过,偶尔显示但是不能点击
onRequestPermissionsResult参数grantResults[0]返回值为0,但是实际上在安全中心看还是被拒了
ps.在其他厂家手机上测试,一切正常
米兔月饼勋章
参加回帖活动
MIUI七夕鹊桥勋章
MIUI七周年
MIUI 9纪念勋章
小米7周年勋章
2017米粉节晒单赢专属勋章
“澎湃S1 ”芯片纪念勋章
参与活动回帖可得
APP 1000万
MIUI论坛APP注册用户突破1000万纪念勋章
小火箭勋章
神舟11号 话题活动
MIUI 300周
MIUI 300周更新纪念勋章
为奥运加油勋章
为奥运加油勋章
小米5发布会
参加小米5发布会直播页大转盘抽奖获得
1000万用户纪念勋章
MIUI1000万用户纪念勋章
MIUI 7纪念勋章
MIUI五周年
MIUI五周年纪念勋章
已关注极客秀微信
已关注微信
关注腾讯微博
已关注腾讯微博
关注新浪微博
已关注新浪微博
MIUI六周年
MIUI六周年纪念勋章
Copyright (C) 2017 MIUI
京ICP备号 | 京公网安备34号 | 京ICP证110507号android不依赖具体activity弹出Dialog对话框,即全局性对话框
开始我想获取当前活动的activity实例,然后在依附其弹出dialog,不过没有找到获取的方法,只能获取到classname,后来找到了3个方法:
第一个方法利用系统弹出dialog,很牛x,不过样子有点丑
第二个方法是获取WindowManager,直接添加view
第三个方法是找一个透明的activity当背景。
第一种其实可以通过setview去改变外观,第二种和第一种最终是利用同一个原理,第三种实在是懒得找了,有时间的时候再补上吧。。。
--------------------------------------------------
先说具体做法,原因在其后给出:
写好Alter功能块后,在alter.show()语句前加入:
注:alter为AlertDialog类型对象
然后在AndroidManifest.xml中加入权限:
下面进行简单的解释:
如果只在Service中写入常在Activity中使用的创建Alter的代码,运行时是会发生错误的,因为Alter的显示需要依附于一个确定的Activity类。而以上做法就是声明我们要弹出的这个提示框是一个系统的提示框,即全局性质的提示框,所以只要手机处于开机状态,无论它现在处于何种界面之下,只要调用alter.show(),就会弹出提示框来。
&http://blog.csdn.net/twoicewoo/article/details/7448584
------------------------------------------------------------------
-------------------------------------------------------------------
final WindowManager wm = (WindowManager)
context.getSystemService("window");
& & WindowManager.LayoutParams
para = new WindowManager.LayoutParams();
& & para.height = -1;
& & para.width = -1;
& & para.format = 1;
& & para.flags =
LayoutParams.FLAG_FULLSCREEN |
LayoutParams.FLAG_LAYOUT_IN_SCREEN;
& & para.type =
LayoutParams.TYPE_SYSTEM_ALERT;
& & final View mView =
LayoutInflater.from(context).inflate(
R.layout.xxxxxxxxxx, null);
& & wm.addView(mView, para);
mView.findViewById(R.id.button).setOnClickListener(new
OnClickListener() {
& @Override
& public void onClick(View v) {
wm.removeView(mView);
参考&http://www.dewen.org/q/3746
---------------------------------------------
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。}

我要回帖

更多关于 android 7.0弹出权限 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信