聊聊Android6.0 以上系统权限

聊聊Android6.0 以上系统权限,第1张

一个新建的Android应用默认是没有权限的,这意味着它不能执行任何可能对用户体验有不利影响的 *** 作或者访问设备数据。为了使用受保护的功能,你必须包含一个或者多个标签在你的app manifest中。

1、Android 6.0中权限分为两种,普通权限和危险权限(即运行时权限,下面统称运行时权限)。

1.1普通权限

如果你的应用manifest中只申明了普通权限(也就是说,这些权限对于用户隐私和设备 *** 作不会造成太多危险),系统会自动授予这些权限。

1.2运行时权限

如果你的应用manifest中声明了运行时权限(也就是说,这些权限可能会影响用户隐私和设备的普通 *** 作),系统会明确的让用户决定是否授予这些权限。系统请求用户授予这些权限的方式是由当前应用运行的系统版本来决定的。

1.2.1 Android6.0及以上的系统

如果你的设备运行的是Android6.0(API level 23)及以上的系统,并且你的应用的targetSdkVersion也是23或者更高,那么应用向用户请求这些权限是实时的。这意味着用户可以随时取消 这些运行时权限的授权。所以应用在每次需要用到这些运行时权限的时候都需要去检查是否还有这些权限的授权。

1.2.2 Android 5.1及以下的系统

如果你的设备运行在Android5.1(API level 22)及以下的系统中,或者你的app的targetSdkVersion是22或者更低。系统会请求用户在apk安装的时候授予这些权限。

如果你的应用更新的时候添加了一个权限,系统会在用户更新应用的时候请求用户授予这个权限 , 一旦用户安装了这个应用,唯一可以取消授权的方式就是卸载掉这个应用。 注意这句话的意思,想一下如果app的targetSdkVersion是22或者以下,但是运行在Android6.0及以上的设备中会有什么问题?后面会分析这个问题 。

常常来说一个授权失败会抛出SecurityException,然而这并不是在 所有情况下都会发生。比如,发送一个广播去检查授权(SendBroadcast(Intent)),数据会被发送给所有接收者,但是当这个方法的请求返 回的时候,你不会收到任何一个因为授权失败抛出的异常,其实在大多数情况下,授权失败只会打印系统日志。

1.3自动权限调整

简单的说,如果你的app targetSdkVersion是3,而你当前运行的系统版本是4,那么在android version 4 中新添加的权限会自动添加到你的app中。

比如 WRITE_EXTERNAL_STORAGE权限是在api 4的时候添加的,而你的应用的targetSdkVersion是3,那么这个权限会自动添加到你的应用中。而且在官方商店上这个权限也会列出来(尽管可能你并不需要这个权限)。

所以建议经常更新你的targetSdkVersion到最新版本。

下面来回答上面的那个问题,如果app的targetSdkVersion是22或者以下,但是运行在android 6.0或以上版本的手机中,会发生什么?

安装过程中,会一起请求用户授予所有 权限,如果用户拒绝,将不能安装这个app,只有用户全部同意这些授权,才能安装这个应用,但是问题来了,安装好了这个应用之后,android6.0以 上的系统中,用户是可以去设置中取消授权的,而且是随时都可以取消,所以很多运行时权限可能也得不到,目前官方的做法是,如果用户取消该项授权,那么依赖 该项授权的方法的返回值为null,所以你的app可能会报空指针异常。以后是否会针对22以下的app做改变还不得而知,毕竟crash是很难让人接受 的,但是crash是由用户造成的,用户应该也可以理解。

2、普通权限和运行时权限

系统权限会被传递给两种不同的保护级别,我们所知道这两种最重要的保护级别就是普通权限和运行时权限。

2.1 普通权限

普通权限的覆盖区域是在你的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

2.2 运行时权限

运行时权限的覆盖区域是你的app想要的数据和资源涉及用户的隐私信息,或者是可能潜在的影响用户的存储数据或者其他app的 *** 作。比如,请求获取用户联系人信息的权限。如果一个app申明了运行时权限,用户必须明确的授权这些权限给app。

2.3 权限组

所有的运行时权限都属于对应的权限组,如果你的app运行在android6.0及以上系统,下面的规则都适用:

2.3.1 如果一个app在manifest中请求了一个运行时权限,而且app还没有得到这个运行时权限所在的权限组中的任何一个运行时权限授权,那么系统会d出一个对话框,描述app想要访问的运行时权限的权限组,这个对话框不会描述这个权限组中某一个特定的权限。比如,你的app想要请求READ_CONTACT权限,对话框只会描述app想要请求设备的联系人,如果用户授权通过,系统会授予app所请求的该项权限。

2.3.2 如果一个app在manifest中请求一个运行时权限,并且这个app已经在相同的权限组中有了另一个运行时权限的授权,那么系统不会d出对话框,而是会立即授予app该项运行时权限的授权。比如,一个app之前请求过一个READ_CONTACT的权限并且被授权通过,之后又请求一个WRITE_CONTACT(在同一个权限组)权限,那么系统会自动授予该权限。

其实所有权限(普通权限、运行时权限、用户自定义权限)都属于特定的权限组,但是只有运行时权限的权限组才会影响用户体验。

2.3.3运行时权限组和权限组列表

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

可以通过adb shell pm list permissions -d -g进行查看。

看到上面的dangerous permissions,会发现一个问题,好像危险权限都是一组一组的,恩,没错,的确是这样的,那么有个问题:分组对我们的权限机制有什么影响吗?的确是有影响的,如果app运行在Android 6.x的机器上,对于授权机制是这样的。如果你申请某个危险的权限,假设你的app早已被用户授权了 同一组 的某个危险权限,那么系统会立即授权,而不需要用户去点击授权。比如你的app对READ_CONTACTS已经授权了,当你的app申请WRITE_CONTACTS时,系统会直接授权通过。此外,对于申请时d出的dialog上面的文本说明也是对整个权限组的说明,而不是单个权限(ps:这个dialog是不能进行定制的)。不过需要注意的是,不要对权限组过多的依赖,尽可能对每个危险权限都进行正常流程的申请,因为在后期的版本中这个权限组可能会产生变化。

3、相关API

3.1 在AndroidManifest文件中添加需要的权限。

这个步骤和我们之前的开发并没有什么变化,试图去申请一个没有声明的权限可能会导致程序崩溃。

3.2 检查权限

if (ContextCompat.checkSelfPermission(thisActivity,

Manifest.permission.READ_CONTACTS)

!= PackageManager.PERMISSION_GRANTED) {

}else{

//

}

这里涉及到一个API,ContextCompat.checkSelfPermission,主要用于检测某个权限是否已经被授予,方法返回值为PackageManager.PERMISSION_DENIED或者PackageManager.PERMISSION_GRANTED。当返回DENIED就需要进行申请授权了

3.3 申请授权

ActivityCompat.requestPermissions(thisActivity,

new String[]{Manifest.permission.READ_CONTACTS},

MY_PERMISSIONS_REQUEST_READ_CONTACTS)

该方法是异步的,第一个参数是Context;第二个参数是需要申请的权限的字符串数组;第三个参数为requestCode,主要用于回调的时候检测。可以从方法名requestPermissions以及第二个参数看出,是支持一次性申请多个权限的,系统会通过对话框 逐一 询问用户是否授权。

3.4 处理权限申请回调

@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(grantResults.length >0&&grantResults[0] == PackageManager.PERMISSION_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 (ContextCompat.checkSelfPermission(thisActivity,

Manifest.permission.READ_CONTACTS)

!= PackageManager.PERMISSION_GRANTED) {

// Should we show an explanation?

if (ActivityCompat.shouldShowRequestPermissionRationale(thisActivity,

Manifest.permission.READ_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.

ActivityCompat.requestPermissions(thisActivity,

new String[]{Manifest.permission.READ_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.

}

}

谢幕,至此有关于android6.0 以上权限相关的内容已经详细讲完了!

Android 6.0 下默认存储SD卡,使用原生FMRadio生成的文件保存到内部存储中

【预置条件】插入T卡【 *** 作步骤】设置>存储设备和USB>选择SD卡为默认存储>收音机录音【实际结果】收音机的录音文件未保存到T卡【预期结果】收音机的录音文件保存到T卡【复现概率】10/10

此外,SoundRecorder默认存储SD卡,生成的文件却可以保存到SD卡中

1、收音机文件没有保存到指定的SD卡目录下,因此可能是文件的路径不对。

2、进入设置中,切换默认存储位置,内部存储或者SD卡,每次切换都会修改系统中某一属性值。

3、当收音机文件保存的时候,必须要读取当前系统的默认存储路径,然后生成自己的文件路径。

STEP1、初步解决方案,但没有生效,引入新问题

对比 SoundRecorder ,根据GIT库中,之前的同事的修改记录,找到可能的解决方案,修改如下:

引入新的问题,此时,点击 Start Recording 会提示内部错误。

分析Log发现,由于权限拒绝,抛出IO异常

01-01 07:35:38.167 7467 7467 W System.err: java.io .IOException: open failed: EACCES (Permission denied)

STEP2、Android M 下SD卡读写权限问题

分析由于权限问题后,结合Android M new design,开始查找文档,寻找解决Android M 下SD卡读写权限问题

Android6.0中的运行时请求权限

后来,试了好几种方法,但都没有用,以及报问题“EACCES (Permission denied)”

STEP3、再分析可能是运行时权限问题

判断APP运行时权限如下:

发现此时,FMRadio对于的组权限如下:

com.android.fmradioGroups:1013 3002 3003 9997 50010

com.android.soundrecorder Groups:1015 1023 3003 9997 50105

根据 系统权限 的定义,有兴趣的同学可以去看一下这个文件 system/core/include/private/android_filesystem_config.h

分析这些Gid发现:

1015 为sdcard_rw,1023 为media_rw权限

因此,得出结论如下

1、首先修改AndroidManifest.xml文件,新增权限,确保FMRadio应用级的权限;

2、原生FMRadio使用过程中,会进行运行时的权限检查,故FMRadio运行时应该拿到了WRITE_EXTERNAL_STORAGE,以及READ_EXTERNAL_STORAGE权限,

3、但是由于FMRadio本身不具备“1015,1023”组权限,这些权限无效,仍然无法对SD卡进行读写 *** 作。

STEP4、最终解决方案

STEP1 的修改基础上,在框架层,权限对应组中给予FMRadio相应的组权限,新增修改如下:

frameworks/base/data/etc/platform.xml

重编framework.jar, 将修改后的jar文件push到手机,重启

此时,再检查FMRadio对于的组权限如下:

com.android.fmradio Groups:1013** 1015 1023** 3002 3003 9997 50010

到此为止,

安卓更新6.0后一更改权限就提示这个,怎么办?

您好,确认手机是否是在ROOT后,卸载了系统预制的应用或更改了系统文件。如果是,请您通过SD卡进行版本的升级。确认手机是否内存或SD卡空间不足,如果是,请清除手机内存或SD卡后再升级、确认手机升级时是否有安装SD卡。如果是,可能是由于部分品牌或格式的SD卡存在不兼容,可卸载SD卡后重新尝试、确认手机的电量是否达到20%,如果没有请及时充电,保证电量充足。

JAVA模拟器安卓4.1,修改权限提示权限更改失败.一些文件系统(例如SD卡)不允许更改权限,怎么办

什么是JAVA模拟器安卓4.1? 你是想说安卓模拟器 4.1的系统吧?

无法更改的权限提示更改不了怎么办

如果此文件夹不是系统文件夹,而是普通的文件夹,在修改或删除时若是提示拒绝访问之类,通常是权限不足导致。

这时可以右击此文件夹,选择属性,在“安全”选项卡中点击高级,点击所有者,点击编辑,双击Administrators,并选中替换子窗口和对象的所有者复选框,点击确定。

然后点击权限选项卡,点击更改权限,选中使用可从此对象继承的权限替换所有子对象权限复选框,并把包括可从此对象的父项继承的权限复选框清除。选中Administrators,点击编辑,选中完全控制,再更改或删除这个文件夹试试。

安卓的手机怎么更改权限

是获得最高权限吧!有电脑的话下蘑菇云手机精灵这个软件,一键root

手机老提示这个play需要更新怎么办

三星会不定期更新系统固件,会通过手机进行推送,您选择更新即可。如不更新无法取消只能推迟。

gta5更新怎么提示这个啊

GTA5更新,不论正版盗版,不要下载补丁,不管什么主机直接联网升级游戏就行

小米note怎么更新安卓6.0的miui7,系统更新没提示?

刷新一下,还无更新提示,即为MIUI7暂时还没有适合小米NOTE的推送版本。

我的手机root权限没成功,但一更新系统就提示处于root状态,不能更新系统怎么办?

你可以使用一下应用宝解除ROOT的功能

你只需要下载安装一个应用宝

然后点击 我的手机-工具箱-一键ROOT

就能解除你手机的ROOT了

非常的简单 还可以在里面下载许多的游戏和软件

我的是三星安卓机,提示说安卓市场要更新,这个可以更新吗?

当然可以的,安卓市场HiMarket会不定期推出新版本,带来更多实用强大的功能,提升系统稳定性, *** 作便捷性。

怎么更改安卓手机QQ提示音

打开QQ,选择设置,消息通知,第一项声音,提示音类型。

但是类别很少,有经典,叮咚,系统通知音,主题音。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/11923897.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-19
下一篇 2023-05-19

发表评论

登录后才能评论

评论列表(0条)

保存