网站首页 > 技术教程 正文
最近一直在分享一些干货,但是最近我也在反思,我感觉应该分享一些用户遇到的问题,有很多开发者私聊我一些问题,我感觉我应该在回答了他们之后,整理成技术文章再分享,这样的互动才更有意义。我想既然有些开发者遇到了,可能还会有很多程序员会遇到,所以互动回答的方式,更能帮助大家解决问题。希望大家可以积极交流。
问题背景
随着今年Android6.0系统的国产ROM终于来了,适配6.0已经势在必行了。最近也有很多开发者在微信私聊和咨询我遇到的问题,其中有一些都是关于Android6.0权限的,我感觉有必要写一篇文章来解惑了。Runtime Permissions在6.0系统的几个变化中,还是比较大的。
如果你在Android6.0系统的手机上如果遇到了这样的错误,必定跟其运行时权限有关。
open failed: EACCES (Permission denied)
权限变化
在Adroid系统6.0以前,权限的处理是在App安装时授权,授权完了才能完成相关的安装。而在6.0的系统上,是先安装App,在安装完之后,在使用相关权限的操作时,才会弹出权限的提示框,用户同意授权之后才能正常使用。谷歌这样做,可以让用户更加清醒的认识相关权限的使用,在一定程度上更加人性化和保护了用户的隐私。
谷歌官方将权限分为了两类,一个是正常权限(Normal Permissions),这类权限不涉及用户隐私,是不需要用户进行授权的,比如访问网络,手机震动等。还有一类是危险权限(Dangerous Permissions),一般是涉及到用户隐私的,需要用户进行授权,比如操作SD卡的写入,相机,录音等。
Normal Permissions:
ACCESS_LOCATION_EXTRA_COMMANDS
ACCESS_NETWORK_STATE
ACCESS_NOTIFICATION_POLICY
ACCESS_WIFI_STATE
BLUETOOTH
BLUETOOTH_ADMIN
BROADCAST_STICKY
CHANGE_NETWORK_STATE
CHANGE_WIFI_MULTICAST_STATE
CHANGE_WIFI_STATE
DISABLE_KEYGUARD
EXPAND_STATUS_BAR
GET_PACKAGE_SIZE
INSTALL_SHORTCUT
INTERNET
KILL_BACKGROUND_PROCESSES
MODIFY_AUDIO_SETTINGS
NFC
READ_SYNC_SETTINGS
READ_SYNC_STATS
RECEIVE_BOOT_COMPLETED
REORDER_TASKS
REQUEST_INSTALL_PACKAGES
SET_ALARM
SET_TIME_ZONE
SET_WALLPAPER
SET_WALLPAPER_HINTS
TRANSMIT_IR
UNINSTALL_SHORTCUT
USE_FINGERPRINT
VIBRATE
WAKE_LOCK
WRITE_SYNC_SETTINGS
Dangerous Permissions:
解决方法
看完官方文档,还好解决方案还不是太难,也不是非常麻烦,当然和以前相比还是有一点繁琐的。废话不多说了,解决方案如下。
检查系统版本
private boolean canMakeSmores(){
return(Build.VERSION.SDK_INT>Build.VERSION_CODES.LOLLIPOP_MR1);
}
检查系统版本的原因,显而易见,如果是系统6.0及以上的,需要采用新的权限授权方法。
申请授权
举个例子,如果你需要拍照操作,那么你就应该在拍照操作的地方,先加上权限申请授权。方式如下:
String[] perms = {"android.permission.CAMERA"};
int permsRequestCode = 200;
requestPermissions(perms, permsRequestCode);
授权回调处理
@Override
public void onRequestPermissionsResult(int permsRequestCode, String[] permissions, int[] grantResults){
switch(permsRequestCode){
case 200:
boolean cameraAccepted = grantResults[0]==PackageManager.PERMISSION_GRANTED;
if(cameraAccepted){
//授权成功之后,调用系统相机进行拍照操作等
}else{
//用户授权拒绝之后,友情提示一下就可以了
}
break;
}
}
进一步处理和完善
通过上面可以看出,只检查系统版本了,如果授权过的权限,还需要再次去授权么?我们的判断其实可以更完善一下,比如:
private boolean hasPermission(String permission){
if(canMakeSmores()){
return(checkSelfPermission(permission)==PackageManager.PERMISSION_GRANTED);
}
return true;
}
上面这段代码,是先判断系统版本,再判断这个权限是否已经授权过,这样就不会重复了。
还有就是比如如果用户第一次已经拒绝过这个权限,下次再操作时怎么办呢?还有一个更人性化的方法就是:
shouldShowRequestPermissionRationale(@NonNull String permission)
这个方法的作用:
第一次请求权限时,用户拒绝了,下一次:shouldShowRequestPermissionRationale() 返回 true,应该显示一些为什么需要这个权限的说明
第二次请求权限时,用户拒绝了,并选择了“不在提醒”的选项时:shouldShowRequestPermissionRationale() 返回 false
设备的策略禁止当前应用获取这个权限的授权:shouldShowRequestPermissionRationale() 返回 false
完结
到这里就基本介绍完结了,希望能够对大家有所帮助,能够进一步理解Android6.0运行时权限的使用。继续加油吧,学习永无止境。
移动开发者的聚集地,公众号“非著名程序员”,每天一篇原创技术分享和移动互联网知识分享,微信公众号:smart_android ,头条号和百度百家账号都是“非著名程序员”。
猜你喜欢
- 2024-10-08 Android 12系统升级条件公布!至少需要6GB内存
- 2024-10-08 Nexus5升级安卓6.0.1初印象:消灭大量bug
- 2024-10-08 Android6.0系统份额继续呈增长趋势 达13.3%
- 2024-10-08 无语 Android 6.0.1勿扰闹钟功能又没了
- 2024-10-08 运行Android 6.0.1的Galaxy Note 5真机曝光
- 2024-10-08 微信Android版v7.0.6正式版发布 微信安卓版7.0.16
- 2024-10-08 谷歌向Nexus系列推送Android 6.0.1更新
- 2024-10-08 谷歌发布Android6.0.1,当亲儿子就是好
- 2024-10-08 猎户座版Galaxy S7现身 运行安卓6.0.1
- 2024-10-08 索尼为更多Xperia设备推出Android 6.0.1棉花糖更新
你 发表评论:
欢迎- 04-29模版网站建设制作的八步流程
- 04-29手机端网站简单制作教程,怎么快速制作一个移动端的网站
- 04-29好看的流程图模板分享,让你轻松制作流程图!
- 04-29写小说大纲模板,小说生成器,橙瓜码字让你快速上手写小说
- 04-29手把手教你制作公司常用考勤表模板,一次制作,永久使用
- 04-29视频剪辑模板怎么制作?新手剪辑上手也很快
- 04-29视频自定义封面图使用说明
- 04-29一分钟学教育技术:电子奖状在线制作,简单排版复制学生名字即可
- 最近发表
- 标签列表
-
- sd分区 (65)
- raid5数据恢复 (81)
- 地址转换 (73)
- 手机存储卡根目录 (55)
- tcp端口 (74)
- project server (59)
- 双击ctrl (55)
- 鼠标 单击变双击 (67)
- debugview (59)
- 字符动画 (65)
- flushdns (57)
- ps复制快捷键 (57)
- 清除系统垃圾代码 (58)
- web服务器的架设 (67)
- 16进制转换 (69)
- xclient (55)
- ps源文件 (67)
- filezilla server (59)
- 句柄无效 (56)
- word页眉页脚设置 (59)
- ansys实例 (56)
- 6 1 3固件 (59)
- sqlserver2000挂起 (59)
- vm虚拟主机 (55)
- config (61)
本文暂时没有评论,来添加一个吧(●'◡'●)