1. 程式人生 > >android permission——關於許可權你需要知道的事

android permission——關於許可權你需要知道的事

引言

有時候我們使用許可權的時候,會發現同屬於一個許可權組的許可權的請求描述符都是一樣的。而且當你同意了改組中某一個許可權的時候,同組內其他許可權就不會再次提示了,默認同意。同理,我們自定義許可權的時候,也可以按照這樣的方式,將一些同類的許可權放在一個組中,使用者授權是以組的形式,他們並不能看到具體許可權的細節,這樣可以在避免使用者進行多次許可的壞體驗,程式編寫也更加方便。

一 許可權分類

按照許可權來源分類:

  • 系統原有許可權 :
    這部分許可權是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

  • 危險許可權 :
    因為會訪問到使用者敏感資源、或者影響使用者體驗,因此這部分許可權在使用的時候會彈出提示框,獲得使用者許可之後才能得到許可權。
    比如:
    (日曆)
    READ_CALENDAR
    WRITE_CALENDAR
    (聯絡人)
    READ_CONTACTS
    WRITE_CONTACTS
    GET_ACCOUNTS
    (位置)
    ACCESS_FINE_LOCATION
    ACCESS_COARSE_LOCATION

二、許可權組

將同類許可權集合在一起,以組的形式來調動這些許可權,系統認為組是對使用者可見的最小許可權單位。當程式向用戶彈出許可權請求的時候,需要的許可權是指定的,但是彈出來的請求描述是以許可權組的描述形式展示的,同屬於一個組的許可權,描述是一樣的。而且在同一個裝置上,使用者一旦同意了AndroidMainfest中某一個許可權,那麼與其同組的其他許可權都被預設為允許的!這樣是為了避免多次提醒使用者造成的不便,系統認為組是使用者許可的單位。換言之,使用者是以許可權組的形式來對許可權做許可或者拒絕。

比如:

  • READ_CONTACTS、WRITE_CONTACTS、GET_ACCOUNTS 同屬於CONTACTS(聯絡人)組;

舉例:

當應用程式需要使用者授予許可權時,彈出的提示框不指名具體許可權,只顯示該許可權組的描述(比如:需要READ_CONTACTS許可權,但他屬於CONTACTS組,那麼就提示使用者:需要訪問聯絡人),並且無論使用者是否授予許可權,AndroidMainfest中定義的屬於該許可權組的其他許可權都不需要再次向用戶詢問(為了方便和體驗)。

意思就是:如果你的應用程式當前需要的是READ_CONTACTS許可權,如果使用者同意,就等於同意了當前應用程式AndroidMainfest下所有屬於該許可權組的許可權(假設該AndroidMainfest下包含了read、write、get的許可權宣告),那麼下次如果程式需要請求WRITE_CONTACTS許可權時,是不需要再次詢問使用者的,默認同意;同理,如果使用者拒絕了當前許可權,就相當於拒絕AndroidMainfest下所有屬於該許可權組的許可權,下次需要請求該許可權組其他許可權時也會預設拒絕。