Android 自定義權限


引子:

一直有看到很多文章說Android可以自定義權限,但是一直很模糊。今天,寫此文章僅記。

在開始之前,我們先要了列出自己的問題清單,之後一直圍繞這幾個問題開展分析。

1、爲什麼要自定義權限?(主要是做一些限制)
2、在哪裏自定義權限?怎麼自定義權限?
3、組件中怎麼要求訪問者具有指定的權限?
4、系統是怎麼知道有沒有授權的?例如:A應用啓動B應用的某個Activity組件,系統是怎麼判斷A是否有權限訪問B的Activity組件?

在Android6.0之前,一個App只要在manifest中聲明要使用的權限,用戶選擇同意安裝,則表示用戶也一律接受manifest中聲明的使用權限。

因此,我們總是感覺不到權限的重要性。但實際中,我們應該要明確:同意安裝和同意使用權限是應該是兩碼事,不能混爲一談。比如:

情況一:我同意你安裝,權限也隨便你聲明,但是授不授應該由用戶決定!這也是Android6.0之後的一個變化。

情況二:我們知道,App中有分系統app和第三方app。有一些權限,是系統進程纔會擁有,而普通進程,即使是聲明瞭使用權限。但它們也是無法獲取到權限的。例如:A類人,聲明權限,系統會授權。B類人聲明權限,則系統不會授權。

情況二是與系統授權的代碼和簽名相關的,屬於系統架構設計的事情,這裏我們不做分析。


一、自定義權限

(1)App中自定義權限

APP在設置權限之前,需要先在Manifest文件中——自定義權限。例如,一個APP想要控制誰可以啓動它的某些組件,可以用下面的方法定義權限:

<manifest
  xmlns:android="http://schemas.android.com/apk/res/android"
  package="com.example.myapp" >

    <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" />
    ...
</manifest>1

接下來,我們分析這幾個屬性:

1、name 爲自定義權限的名稱。
2、你應該爲新建的權限設置labeldescription,它們是兩個字符串,用於用戶瀏覽權限的名字和簡介。下面示例是 CALL_PHONE權限的label和description:

<string name="permlab_callPhone">directly call phone numbers</string>
<string name="permdesc_callPhone">Allows the app to call
    phone numbers without your intervention. Malicious apps may
    cause unexpected calls on your phone bill. Note that this does not
    allow the app to call emergency numbers.</string>1

3、android:permissionGroup屬性是可選的,用於幫助系統向用戶展示權限的信息。你可以自定義權限組,但大多數情況下,你應該把它設置爲標準的權限組( android.Manifest.permission_group)。即最好使用已經存在的權限組,這樣可以簡化向用戶展示的權限相關UI。

4、protectionLevel屬性是必須的。它用於告訴系統當其它APP請求這個權限時,應該怎樣通知用戶,或誰能獲取這個權限。

如上所示,經過以上4步,我們已經完成了一個權限的定義,那麼接下來,我們要怎麼使用這個自定義的權限呢?

(2)使用自定義權限

比如:我們現在有一個Activity,如果別的應用要啓動我們的這個Activity,我們要求它具有"com.example.myapp.permission.DEADLY_ACTIVITY"權限纔可以訪問我們的Activity,就可以這麼設置。

這裏寫圖片描述

如上所示,我們只需要添加android:permission="com.example.myapp.permission.DEADLY_ACTIVITY"這一條屬性即可。別的應用要訪問SecondActivity就必須聲明如下權限。

<uses-permission android:name="com.example.myapp.permission.DEADLY_ACTIVITY"/>

如果不聲明權限,則會無權限訪問。日記中會提示權限拒絕。

android:permission的屬性可以在任意一個四大組件中使用,並不侷限於Activity。同樣,系統的permission屬性,也可以定義在組件中。

至此,我們已經能夠成功的自定義權限和使用權限。


二、題外話
(1) 創建權限組

新建的權限可以分組到標準的權限組(android.Manifest.permission_group),也可以分組到自定義的權限組。可以用 來新建權限組,用來命名權限組的命名空間。

(2)自定義權限的注意事項

1、系統不允許多個APP定義相同名字的權限,除非這些APP具有相同的簽名。

例如:如果一個已安裝的APP定義了一個權限,那麼系統不允許安裝另一個定義了相同權限的APP,除非這兩個APP有相同的簽名。爲了避免命名衝突,建議用反向域的風格爲權限命名,如: com.example.myapp.ENGAGE_HYPERSPACE。

2、如果兩個APP有相同的簽名,我們並不需要在兩個APP中定義相同的權限。因爲A進程調用B進程的時候,系統會自動檢查簽名。

例如:我們在A應用中自定義了一個權限,而B應用要使用A應用中定義的權限,直接在組件中指定訪問權限即可,不用再進行定義。當然,我們也可以再進行定義,只是代碼重複而已,並沒有影響。

3、聲明使用權限,是指manifest中的 usepermission 一系列的操作。指定訪問權限 是組件中的android:permission="com.hisense.a7custompermission"這一系列動作。兩者一定要分清楚。

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