1. 程式人生 > >Android自定義許可權與使用

Android自定義許可權與使用

本篇部落格介紹下Android開發者如何自定義許可權,進而如何將自己的部分元件暴露。並介紹客戶端如何呼叫這些暴露的元件。

1. 如何自定義許可權

Android允許我們使用permission標籤,在Manifest檔案中定義屬於自己的許可權,一個例子如下,

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.zlp.myapplication">

    <permission
android:name="paul.permission.TEST" android:description="@string/permdesc_deadlyActivity" android:permissionGroup="paul.permission-group.TEST" android:protectionLevel="signature" />
... </manifest>

有一點需要注意,就是permission是位於manifest標籤下,和application標籤同級的。千萬不要將其放在application標籤下哦。

對permission標籤的各個屬性大概說明一下,
1. name,該標籤就是許可權的名字啦。
2. description,該標籤就是許可權的介紹。
3. permissionGroup,指定該許可權的組。
4. protectionLevel,指定保護級別。

Android將許可權分為若干個保護級別,normal, dangerous, signature等。normal就是正常許可權,該許可權並不會給使用者或者裝置的隱私帶來風險;dangerous就是危險許可權,該級別的許可權通常會給使用者的資料或裝置的隱私帶來風險;signature指的是,只有相同簽名的應用才能使用該許可權。更多的介紹可以參考

protectionLevel

還有一點重要的是,Android不允許兩個不同的應用定義一個相同名字的許可權(除非這兩個應用擁有相同的簽名),所以在命名的時候,需要注意哦。

2. 使用自定義的許可權,將某個元件暴露出去

我們知道,Android允許一個應用(客戶端)呼叫另一個應用(服務端)的元件。那麼作為服務端的應用就得暴露相應的元件,客戶端應用才能訪問。當然,在暴露的時候,許可權是非必須的,如果暴露的元件沒有許可權的話,那麼任何的其他應用都可以來呼叫該元件;如果該元件申請了許可權,那麼只有擁有該許可權的應用才能呼叫該元件。

正常情況下,我們可以這樣來暴露自己的元件,以Activity為例,

        <activity
            android:name=".PrivateActivity"
            android:exported="true"
            android:label="@string/title_activity_private"/>

exported屬性就是代表是否暴露。該例子並沒有要求呼叫者需要申請許可權,也就是說,任何的應用就可以呼叫才元件。

如果沒個應用都可以呼叫我們的元件的話,顯然是不安全的,我們希望只有使用了我們的許可權的應用,才能呼叫我們暴露的元件,我們可以在activity中加入permission屬性,如下,

        <activity
            android:name=".PrivateActivity"
            android:exported="true"
            android:label="@string/title_activity_private"
            android:permission="paul.permission.TEST" />

這樣,我們就給該暴露的activity加入了許可權,只有申請了paul.permission.TEST許可權的應用,才能呼叫該activity。

3. 如何使用許可權,呼叫暴露的元件

在2中,我們介紹了,服務端應用如何將自己的元件暴露出去,並使用自定義的許可權保護該元件。本小節介紹如何編寫客戶端應用,訪問該暴露元件。

首先,由於暴露的元件是需要許可權的,我們需要在manifest檔案中申請該許可權,該許可權的使用和Android提供的許可權的使用是一樣的,均為使用uses-permission標籤。

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.zlp.clientapplicant">

    <uses-permission android:name="paul.permission.TEST" />
        ...
</manifest>

然後,我們使用程式碼來呼叫暴露的元件,以2中的activity為例,

Intent intent = new Intent();
intent.setClassName("com.example.zlp.myapplication", "com.example.zlp.myapplication.PrivateActivity");
startActivity(intent);

我們使用隱式Intent來呼叫暴露的activity,注意setClassName的第一個引數是完整的包名,第二個引數是完整的activity類名(包括包名)。

如果我們沒有申請相應的許可權,就呼叫需要許可權的暴露元件的話,會丟擲一個沒有申請許可權的異常。