一个新建的Android应用默认是没有权限的,这意味着它不能执行任何可能对用户体验有不利影响的 *** 作或者访问设备数据。为了使用受保护的功能,你必须包含一个或者多个标签在你的app manifest中。
1、Android 60中权限分为两种,普通权限和危险权限(即运行时权限,下面统称运行时权限)。
11普通权限
如果你的应用manifest中只申明了普通权限(也就是说,这些权限对于用户隐私和设备 *** 作不会造成太多危险),系统会自动授予这些权限。
12运行时权限
如果你的应用manifest中声明了运行时权限(也就是说,这些权限可能会影响用户隐私和设备的普通 *** 作),系统会明确的让用户决定是否授予这些权限。系统请求用户授予这些权限的方式是由当前应用运行的系统版本来决定的。
121 Android60及以上的系统
如果你的设备运行的是Android60(API level 23)及以上的系统,并且你的应用的targetSdkVersion也是23或者更高,那么应用向用户请求这些权限是实时的。这意味着用户可以随时取消 这些运行时权限的授权。所以应用在每次需要用到这些运行时权限的时候都需要去检查是否还有这些权限的授权。
122 Android 51及以下的系统
如果你的设备运行在Android51(API level 22)及以下的系统中,或者你的app的targetSdkVersion是22或者更低。系统会请求用户在apk安装的时候授予这些权限。
如果你的应用更新的时候添加了一个权限,系统会在用户更新应用的时候请求用户授予这个权限 , 一旦用户安装了这个应用,唯一可以取消授权的方式就是卸载掉这个应用。 注意这句话的意思,想一下如果app的targetSdkVersion是22或者以下,但是运行在Android60及以上的设备中会有什么问题?后面会分析这个问题 。
常常来说一个授权失败会抛出SecurityException,然而这并不是在 所有情况下都会发生。比如,发送一个广播去检查授权(SendBroadcast(Intent)),数据会被发送给所有接收者,但是当这个方法的请求返 回的时候,你不会收到任何一个因为授权失败抛出的异常,其实在大多数情况下,授权失败只会打印系统日志。
13自动权限调整
简单的说,如果你的app targetSdkVersion是3,而你当前运行的系统版本是4,那么在android version 4 中新添加的权限会自动添加到你的app中。
比如 WRITE_EXTERNAL_STORAGE权限是在api 4的时候添加的,而你的应用的targetSdkVersion是3,那么这个权限会自动添加到你的应用中。而且在官方商店上这个权限也会列出来(尽管可能你并不需要这个权限)。
所以建议经常更新你的targetSdkVersion到最新版本。
下面来回答上面的那个问题,如果app的targetSdkVersion是22或者以下,但是运行在android 60或以上版本的手机中,会发生什么?
安装过程中,会一起请求用户授予所有 权限,如果用户拒绝,将不能安装这个app,只有用户全部同意这些授权,才能安装这个应用,但是问题来了,安装好了这个应用之后,android60以 上的系统中,用户是可以去设置中取消授权的,而且是随时都可以取消,所以很多运行时权限可能也得不到,目前官方的做法是,如果用户取消该项授权,那么依赖 该项授权的方法的返回值为null,所以你的app可能会报空指针异常。以后是否会针对22以下的app做改变还不得而知,毕竟crash是很难让人接受 的,但是crash是由用户造成的,用户应该也可以理解。
2、普通权限和运行时权限
系统权限会被传递给两种不同的保护级别,我们所知道这两种最重要的保护级别就是普通权限和运行时权限。
21 普通权限
普通权限的覆盖区域是在你的app需要访问沙盒以外的数据和资源的时候,但是对用户隐私和其他app的 *** 作只有很少的影响,比如开启手电筒的权限。这个时候,系统会自动授权这些普通权限。
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
22 运行时权限
运行时权限的覆盖区域是你的app想要的数据和资源涉及用户的隐私信息,或者是可能潜在的影响用户的存储数据或者其他app的 *** 作。比如,请求获取用户联系人信息的权限。如果一个app申明了运行时权限,用户必须明确的授权这些权限给app。
23 权限组
所有的运行时权限都属于对应的权限组,如果你的app运行在android60及以上系统,下面的规则都适用:
231 如果一个app在manifest中请求了一个运行时权限,而且app还没有得到这个运行时权限所在的权限组中的任何一个运行时权限授权,那么系统会d出一个对话框,描述app想要访问的运行时权限的权限组,这个对话框不会描述这个权限组中某一个特定的权限。比如,你的app想要请求READ_CONTACT权限,对话框只会描述app想要请求设备的联系人,如果用户授权通过,系统会授予app所请求的该项权限。
232 如果一个app在manifest中请求一个运行时权限,并且这个app已经在相同的权限组中有了另一个运行时权限的授权,那么系统不会d出对话框,而是会立即授予app该项运行时权限的授权。比如,一个app之前请求过一个READ_CONTACT的权限并且被授权通过,之后又请求一个WRITE_CONTACT(在同一个权限组)权限,那么系统会自动授予该权限。
其实所有权限(普通权限、运行时权限、用户自定义权限)都属于特定的权限组,但是只有运行时权限的权限组才会影响用户体验。
233运行时权限组和权限组列表
group:androidpermission-groupCONTACTS
permission:androidpermissionWRITE_CONTACTS
permission:androidpermissionGET_ACCOUNTS
permission:androidpermissionREAD_CONTACTS
group:androidpermission-groupPHONE
permission:androidpermissionREAD_CALL_LOG
permission:androidpermissionREAD_PHONE_STATE
permission:androidpermissionCALL_PHONE
permission:androidpermissionWRITE_CALL_LOG
permission:androidpermissionUSE_SIP
permission:androidpermissionPROCESS_OUTGOING_CALLS
permission:comandroidvoicemailpermissionADD_VOICEMAIL
group:androidpermission-groupCALENDAR
permission:androidpermissionREAD_CALENDAR
permission:androidpermissionWRITE_CALENDAR
group:androidpermission-groupCAMERA
permission:androidpermissionCAMERA
group:androidpermission-groupSENSORS
permission:androidpermissionBODY_SENSORS
group:androidpermission-groupLOCATION
permission:androidpermissionACCESS_FINE_LOCATION
permission:androidpermissionACCESS_COARSE_LOCATION
group:androidpermission-groupSTORAGE
permission:androidpermissionREAD_EXTERNAL_STORAGE
permission:androidpermissionWRITE_EXTERNAL_STORAGE
group:androidpermission-groupMICROPHONE
permission:androidpermissionRECORD_AUDIO
group:androidpermission-groupSMS
permission:androidpermissionREAD_SMS
permission:androidpermissionRECEIVE_WAP_PUSH
permission:androidpermissionRECEIVE_MMS
permission:androidpermissionRECEIVE_SMS
permission:androidpermissionSEND_SMS
permission:androidpermissionREAD_CELL_BROADCASTS
可以通过adb shell pm list permissions -d -g进行查看。
看到上面的dangerous permissions,会发现一个问题,好像危险权限都是一组一组的,恩,没错,的确是这样的,那么有个问题:分组对我们的权限机制有什么影响吗?的确是有影响的,如果app运行在Android 6x的机器上,对于授权机制是这样的。如果你申请某个危险的权限,假设你的app早已被用户授权了 同一组 的某个危险权限,那么系统会立即授权,而不需要用户去点击授权。比如你的app对READ_CONTACTS已经授权了,当你的app申请WRITE_CONTACTS时,系统会直接授权通过。此外,对于申请时d出的dialog上面的文本说明也是对整个权限组的说明,而不是单个权限(ps:这个dialog是不能进行定制的)。不过需要注意的是,不要对权限组过多的依赖,尽可能对每个危险权限都进行正常流程的申请,因为在后期的版本中这个权限组可能会产生变化。
3、相关API
31 在AndroidManifest文件中添加需要的权限。
这个步骤和我们之前的开发并没有什么变化,试图去申请一个没有声明的权限可能会导致程序崩溃。
32 检查权限
if (ContextCompatcheckSelfPermission(thisActivity,
ManifestpermissionREAD_CONTACTS)
!= PackageManagerPERMISSION_GRANTED) {
}else{
//
}
这里涉及到一个API,ContextCompatcheckSelfPermission,主要用于检测某个权限是否已经被授予,方法返回值为PackageManagerPERMISSION_DENIED或者PackageManagerPERMISSION_GRANTED。当返回DENIED就需要进行申请授权了
33 申请授权
ActivityCompatrequestPermissions(thisActivity,
new String[]{ManifestpermissionREAD_CONTACTS},
MY_PERMISSIONS_REQUEST_READ_CONTACTS);
该方法是异步的,第一个参数是Context;第二个参数是需要申请的权限的字符串数组;第三个参数为requestCode,主要用于回调的时候检测。可以从方法名requestPermissions以及第二个参数看出,是支持一次性申请多个权限的,系统会通过对话框 逐一 询问用户是否授权。
34 处理权限申请回调
@Override
publicvoidonRequestPermissionsResult(intrequestCode,
String permissions[],int[] grantResults) {
switch(requestCode) {
case MY_PERMISSIONS_REQUEST_READ_CONTACTS: {
// If request is cancelled, the result arrays are empty
if(grantResultslength >0&& grantResults[0] == PackageManagerPERMISSION_GRANTED) {
// permission was granted, yay! Do the contacts-related task you need to do
}else{
// permission denied, boo! Disable the functionality that depends on this permission
}
return;
}
}
}
ok,对于权限的申请结果,首先验证requestCode定位到你的申请,然后验证grantResults对应于申请的结果,这里的数组对应于申请时的第二个权限字符串数组。如果你同时申请两个权限,那么grantResults的length就为2,分别记录你两个权限的申请结果。如果申请成功,就可以做你的事情了!
那么将上述几个步骤结合到一起就是:
// Here, thisActivity is the current activity
if (ContextCompatcheckSelfPermission(thisActivity,
ManifestpermissionREAD_CONTACTS)
!= PackageManagerPERMISSION_GRANTED) {
// Should we show an explanation
if (ActivityCompatshouldShowRequestPermissionRationale(thisActivity,
ManifestpermissionREAD_CONTACTS)) {
// Show an expanation to the user asynchronously -- don't block
// this thread waiting for the user's response! After the user
// sees the explanation, try again to request the permission
} else {
// No explanation needed, we can request the permission
ActivityCompatrequestPermissions(thisActivity,
new String[]{ManifestpermissionREAD_CONTACTS},
MY_PERMISSIONS_REQUEST_READ_CONTACTS);
// MY_PERMISSIONS_REQUEST_READ_CONTACTS is an
// app-defined int constant The callback method gets the
// result of the request
}
}
谢幕,至此有关于android60 以上权限相关的内容已经详细讲完了!
未授予所需的程序接入权限,有时提示这个时,反而是不用签名就可安装成功,我的e66也遇到这个问题,后来不签名就0k了,如还有不清楚,对照下列查查就行。
错误提示一:更新错误
问题说明:一般出现这提示是因为安装软件时手机内有旧版本的相同软件没有删除,进行了重复安装。或者因为新、旧版软件安装程序标题不同引起冲突。
解决办法:第1种-卸载旧版软件之后,再安装新版本软件。第2种_把新版本软件解包,在pkg文档中把安装程序标题改为与旧版本一致。
错误提示二:证书错误
问题说明:1安装的软件没有签名2如果是JAR程序,一般是因为证书有冲突。(很多java游戏都会出这个错误提示。解决办法看下面第2条。)
解决办法:第1种:为软件签名第2种:将程序(软件/游戏)直接安装到手机上
错误提示三:证书过期
问题说明:软件证书过期
解决办法:第1种-把手机时间调到证书的期限内,然后再安装。在安装过后再调回正确时间即可。第2种-为软件重新签名
错误提示四:证书尚未生效
问题说明:手机的时间超出软件证书的期限。
解决办法:第1种-检查手机的日期是否设置正确。第2种-把手机时间调到证书的期限内,然后再安装。在安装过后再调回正确时间就可以。
错误提示五:未授予所需的程序接入权限
问题说明:1出于塞班第三版系统的安错误提示五:未授予所需的程序接入权限问题说明:1出于塞班第三版系统的安全问题,一些程序的权限被禁止使用。没有该权限的程序都无法安装。2证书出错 (有些文件不用签名也可安装)
解决办法:第1种:去掉程序的被禁止权限(XX手机)第2种:使用未签过名的软件重新签名后再安装
错误提示六:证书受限
问题说明:一般由软件签名出错或者软件已被多次签名引起。解决办法:使用未签过名的软件重新签名后再安装即可。
错误提示七:无法安装不被信任的提供商提供的受保护应用程序
问题说明:有几种可能引发此问题:1手机设置问题 2软件没有签名或者签名不正确 3证书冲突
解决办法:第1种:进入手机的“程序管理”-“选项”-“设置”:“安装软件”设置成-----全部,“在线证书检查”设置成-----关!第2种:将未签过名的软件重新签名后再安装第3种:格机后再安装。(注意:格机之前,请注意备份好自己的资料。)
错误提示八:文件受损
问题说明:安装程序文件被破坏或者不完整。有可能是在程序下载或者解压缩时引起的文件破坏。
解决办法:请确定下载的程序文件是好的。建议再次下载或解压缩程序再试。
错误提示九:无任何提示反映
问题说明:一般是中文文件名的JAR程序出现这种情况。
解决办法:删除掉已经安装的JAR程序,将JAR程序文件名改为全英文之后再试。
错误提示十:手机启动失败,请与零售商联系
问题说明:一般是某个程序安装失败后重启手机时出现这个提示,也有部分是升级机器时失败导致。
解决办法:如果是某个程序安装失败,那么只需要将存储卡拿出来,然后再次启动机器。并将安装错误的程序删除掉即可。如果是手机升级后出现,那么就只有重新格机了。需要注意的是:一些开机启动并常驻内存的软件是无法通过格式化解决的。所以,软格前先需要把这些软件全部关闭或删除!
在jsapilist中加 "getLocalImgData" ,如果报错 : wxgetlocalimgdata not is a function 说明你的jweixijs文件版本可能低了,需要12以上 <script type="text/javascript" src="//reswxqqcom/open/js/jweixin-120js"></script>
以上就是关于聊聊Android6.0 以上系统权限全部的内容,包括:聊聊Android6.0 以上系统权限、SymbianS60V5SDK安装软件时经常提示“未授权所需的程序接入权限”、微信JSSDK接口权限中getLocalImgData既在获取到权限列表中,又在未获取到权限的列表中,为什么会这样等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)