Android權限管理之Permission權限機制及使用

前言:

     最近忽然喜歡上一句詩:「寵辱不驚,看庭前花開花落;去留無心,望天空雲捲雲舒。」 哈哈~,這個和今天的主題無關,最近只要不學習總以爲生活中少了點什麼,因此想着圍繞着最近面試過程當中討論比較多的一個知識點Android 6.0 權限適配問題來進行學習,不過我不想直接進入這個主題,因此選擇先去了解一下Android的Permission權限機制及使用html

權限管理相關博客:java

Android權限機制:

    權限是一種安全機制。Android權限主要用於限制應用程序內部某些具備限制性特性的功能使用以及應用程序之間的組件訪問。android

Android權限列表:

   Android權限列表能夠參考這篇博客:android權限大全面試

Android權限使用:

1.)在 AndroidManifest.xml <manifest>標籤內使用<uses-permission>聲明使用某一個權限

<uses-permission android:name="string"/>

例如申請使用網絡權限sql

<uses-permission android:name="android.permission.INTERNET"/>

若是特定的權限必須申明使用,若是沒有申請使用就會報出Permission Denial錯誤,例如訪問通信錄報出以下錯誤安全

Caused by: java.lang.SecurityException: Permission Denial: reading com.androintacts.ContactsProvider2 uri content://contacts/data/phones from pid=23763, uid=10036 requires android.permission.READ_CONTACTS

解決此類錯誤咱們只需根據提示添加對應的權限便可網絡

<uses-permission android:name="android.permission.READ_CONTACTS" />

2.)自定義權限permission

  雖然這種使用場景很少見,可是在有些特定的場景下出於安全考慮就須要自定義權限了,好比兩個APP之間須要共享數據而採用了ContentProvider,此時咱們須要對一個app訪問另一個app的數據時須要添加權限申請。自定義權限經過<permission>標籤app

<permission android:description=」string resource」 
   android:icon=」drawable resource」 
   android:label=」string resource」 
   android:name=」string」 
   android:permissionGroup=」string」 
   android:protectionLevel=[「normal」 | 「dangerous」 | 
            「signature」 | 「signatureOrSystem」] /> 
  •  android:description:對權限的描述,比lable更加的詳細,介紹該權限的相關使用狀況,好比當用戶被詢問是否給其餘應用該權限時。注意描述應該使用的是string資源,而不是直接使用string串。 ide

  • android:icon:用來標識該權限的一個圖標。post

  • android:label:權限的一個給用戶展現的簡短描述。方便的來講,這個能夠直接使用一個string字串來表示,可是若是要發佈的話,仍是應該使用string資源來表示。 

  • android:name:權限的惟一名字,因爲獨立性,通常都是使用包名加權限名,該屬性是必須的,其餘的可選,未寫的系統會指定默認值。 

  • android:permissionGroup: 權限所屬權限組的名稱,而且須要在這個或其餘應用中使用<permission-group>標籤提早聲明該名稱,若是沒有聲明,該權限就不屬於該組。 

  • android:protectionLevel:權限的等級

關於android:protectionLevel:權限的等級

  • normal  低風險權限,只要申請了就可使用(在AndroidManifest.xml中添加<uses-permission>標籤),安裝時不須要用戶確認;

  • dangerous  高風險權限,安裝時須要用戶的確認纔可以使用;

  • signature  只有當申請權限的應用程序的數字簽名與聲明此權限的應用程序的數字簽名相同時(若是是申請系統權限,則須要與系統簽名相同),才能將權限授給它;

  • signatureOrSystem  簽名相同,或者申請權限的應用爲系統應用(在system image中),與signature相似,只是增長了rom中自帶的app的聲明 ,儘可能不要使用該選項,由於signature已經適合絕大部分的狀況。

對於普通和危險級別的權限,咱們稱之爲低級權限,應用申請即授予。其餘兩級權限,咱們稱之爲高級權限或系統權限。當應用試圖在沒有權限的狀況下作受限操做,應用將被系統殺掉以警示。系統應用可使用任何權限。權限的聲明者可無條件使用該權限。

根據上面的介紹咱們實戰一下自定義權限以下

   <permission
        android:name="personprovider.permission.read"
        android:description="@string/personprovider_permission_read_desstring"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/personprovider_permission_read_labestring"
        android:protectionLevel="normal"/>
    <permission
        android:name="personprovider.permission.write"
        android:description="@string/personprovider_permission_write_desstring"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/personprovider_permission_write_labestring"
        android:protectionLevel="normal"/>

3.)自定義權限組permission-group

    爲了方便管理某一特定功能的權限,因此我會對權限進行分組,這時咱們須要經過<permission-group>自定義一個權限組

<permission-group android:description="string resource"
            android:icon="drawable resource"
            android:label="string resource"
            android:name="string"/>
  • android:description  這個屬性用於給權限組定義一個用戶可讀的說明性文本。這個文本應該比標籤更長、更詳細。這個屬性必需要引用一個字符串資源,跟label屬性不同,它不可以使用原生的字符串。

  • android:icon  這個屬性定義了一個表明權限的圖標。這個屬性要使用包含圖片定義的可繪製資源來定義。

  • android:label  這個屬性給權限組定義了一個用戶可讀的名稱。爲了開發方便,在開發時,能夠直接使用原生的字符串來設置這個屬性。可是,當應用程序正式發佈時,應該使用字符串資源來設置,以便可以像用戶界面中其餘的字符串同樣可以被本地化。

  • android:name 這個屬性定義了權限組的名稱,它是可以分配給<permission>元素的permissionGroup屬性的名稱。

 上面的權限組咱們能夠自定義爲下面這種方式:

   <permission-group
        android:name="personprovider.permission-group"
        android:description="@string/personprovider_permission_group_desstring"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/personprovider_permission_group_labelstring"/>

    <permission
        android:name="personprovider.permission.read"
        android:description="@string/personprovider_permission_read_desstring"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/personprovider_permission_read_labestring"
        android:permissionGroup="personprovider.permission-group"
        android:protectionLevel="normal"/>
    <permission
        android:name="personprovider.permission.write"
        android:description="@string/personprovider_permission_write_desstring"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/personprovider_permission_write_labestring"
        android:permissionGroup="personprovider.permission-group"
        android:protectionLevel="normal"/>

 其餘關於permission-tree這裏就不介紹了,這個至今沒有用到過,<permission-tree>是爲一組permissions聲明瞭一個namespace。

4.)使用自定義權限

申請權限

   <uses-permission android:name="personprovider.permission.read"/>
   <uses-permission android:name="personprovider.permission.write"/>

在宿主上聲明須要申請訪問權限

<provider
    android:name=".PersonProvider"
    android:authorities="com.whoislcj.testsqlite.personprovider"
    android:enabled="true"
    android:exported="true"
    android:readPermission="personprovider.permission..read"
    android:writePermission="personprovider.permission..write"/>

總結:

   本篇大體瞭解了Android的權限permission以及如何使用和自定義權限,下篇將總結學一下如何解決Android 6.0的權限的適配問題。

相關文章
相關標籤/搜索