前言:
最近突然喜歡上一句詩:“寵辱不驚,看庭前花開花落;去留無意,望天空雲卷雲舒。” 哈哈~,這個和今天的主題無關,最近只要不學習總覺得生活中少了點什么,所以想着圍繞着最近面試過程中討論比較多的一個知識點Android 6.0 權限適配問題來進行學習,不過我不想直接進入這個主題,所以選擇先去了解一下Android的Permission權限機制及使用
權限管理相關博客:
- Android權限管理之Permission權限機制及使用
- Android權限管理之Android 6.0運行時權限及解決辦法
- Android權限管理之RxPermission解決Android 6.0 適配問題
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以及如何使用和自定義權限,下篇將總結學一下如何解決Android 6.0的權限的適配問題。