android permission——关于权限你需要知道的事

版权声明:本文为博主原创文章,转载请说明出处。 https://blog.csdn.net/woshimalingyi/article/details/51882609

引言

有时候我们使用权限的时候,会发现同属于一个权限组的权限的请求描述符都是一样的。而且当你同意了改组中某一个权限的时候,同组内其他权限就不会再次提示了,默认同意。同理,我们自定义权限的时候,也可以按照这样的方式,将一些同类的权限放在一个组中,用户授权是以组的形式,他们并不能看到具体权限的细节,这样可以在避免用户进行多次许可的坏体验,程序编写也更加方便。

一 权限分类

按照权限来源分类:

  • 系统原有权限 :
    这部分权限是Android系统中已经定义好了的一些权限,这部分一般是程序需要使用到系统原生的一些服务或者程序。比如:照相机、联系人、系统通知、SD卡读写、网络传输、GPS、Wifi等等。在不申请的情况下,这些资源是不能够使用的。使用方式如下:
    <uses-permission android:name="android.permission.SEND_SMS"/>
  • 用户自定义权限 :
    这部分是用户在自己的程序中需要定义的权限,比如:一些特殊的机型提供的特殊服务、应用程序提供的特殊服务需要访问特殊资源。这个时候需要提醒用户授予许可。
//自定义权限
<permission android:name="com.example.myapp.permission.DEADLY_ACTIVITY"
        android:label="@string/permlab_deadlyActivity"
        android:description="@string/permdesc_deadlyActivity"
        android:permissionGroup="android.permission-group.COST_MONEY"
        android:protectionLevel="dangerous" />

按照权限的等级分类:

  • 正常权限 :
    这部分权限在使用的使用系统会自动许可,不需要提醒用户。(但是同样是要在AndroidMainfest中声明的)
    比如:
    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

    更多请查看:Nomal Permissions

  • 危险权限 :
    因为会访问到用户敏感资源、或者影响用户体验,因此这部分权限在使用的时候会弹出提示框,获得用户许可之后才能得到权限。
    比如:
    (日历)
    READ_CALENDAR
    WRITE_CALENDAR
    (联系人)
    READ_CONTACTS
    WRITE_CONTACTS
    GET_ACCOUNTS
    (位置)
    ACCESS_FINE_LOCATION
    ACCESS_COARSE_LOCATION

更多请查看:System Permissions


二、权限组

将同类权限集合在一起,以组的形式来调动这些权限,系统认为组是对用户可见的最小权限单位。当程序向用户弹出权限请求的时候,需要的权限是指定的,但是弹出来的请求描述是以权限组的描述形式展示的,同属于一个组的权限,描述是一样的。而且在同一个设备上,用户一旦同意了AndroidMainfest中某一个权限,那么与其同组的其他权限都被默认为允许的!这样是为了避免多次提醒用户造成的不便,系统认为组是用户许可的单位。换言之,用户是以权限组的形式来对权限做许可或者拒绝。

比如:

  • READ_CONTACTS、WRITE_CONTACTS、GET_ACCOUNTS 同属于CONTACTS(联系人)组;

举例:

当应用程序需要用户授予权限时,弹出的提示框不指名具体权限,只显示该权限组的描述(比如:需要READ_CONTACTS权限,但他属于CONTACTS组,那么就提示用户:需要访问联系人),并且无论用户是否授予权限,AndroidMainfest中定义的属于该权限组的其他权限都不需要再次向用户询问(为了方便和体验)。

意思就是:如果你的应用程序当前需要的是READ_CONTACTS权限,如果用户同意,就等于同意了当前应用程序AndroidMainfest下所有属于该权限组的权限(假设该AndroidMainfest下包含了read、write、get的权限声明),那么下次如果程序需要请求WRITE_CONTACTS权限时,是不需要再次询问用户的,默认同意;同理,如果用户拒绝了当前权限,就相当于拒绝AndroidMainfest下所有属于该权限组的权限,下次需要请求该权限组其他权限时也会默认拒绝。

猜你喜欢

转载自blog.csdn.net/woshimalingyi/article/details/51882609