Android自定義權限

轉至http://www.cnblogs.com/whoislcj/p/6072718.html

前言:

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

Android權限機制:

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

Android權限列表:

   Android權限列表可以參考這篇博客:android權限大全

Android權限使用:

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

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

例如申請使用網絡權限

<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>標籤

複製代碼
<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串。 

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

  • 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以及如何使用和自定義權限.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章