一、自定義權限
自定義權限,一般是考慮到應用共享組件時的安全問題。我們知道在四大組件 AndroidManifest 中注冊的時候,添加 exported = "true" 這一屬性節點,這樣就可以使其被其他 App 所調用。但是我們希望只有被允許的App才能調用,這個時候可以考慮使用”自定義權限“來實現。我們定義提供組件的 App 為開放端,使用開放組件的 App 為接入端,用這兩個概念來描述自定義權限。
1. 開放端:在 AndroidManifest 的 manifest 節點下定義權限:
<permission android:name="com.sl.permission.aidl" android:description="@string/service_permission" android:permissionGroup="com.sl.permissions" android:protectionLevel="signature" />
Permission 屬性:
<1> name : 權限名稱
<2> description : 權限描述
<3> permissionGroup : 指定權限屬於的權限組
<4> protectionLevel : 權限保護級別
權限保護級別:
ProtectionLevel | Desc |
Normal | 這是最低風險的權限,如果應用聲明了此權限,也不會提示安裝應用的用戶授權(例如,如果聲明了定位權限,則應用到定位功能時,會明確提示用戶,是否授予定位權限,但是protectionLevel為normal的不會明確提示,直接默認授予),系統直接默認該應用有此權限; |
dangerous | 這種級別的權限風險更高,擁有此權限可能會訪問用戶私人數據或者控制設備,給用戶帶來負面影響,這種類型的權限一般不會默認授權。 |
signature | 這種權限級別,只有當發請求的應用和接收此請求的應用使用同一簽名文件,並且聲明了該權限才會授權,並且是默認授權,不會提示用戶授權 |
signatureOrSystem | 這種權限級別是系統授權的系統應用或者相同簽名的應用,一般避免使用該級別,因為 signature 已經能滿足大部分需求。 |
開放組件:添加 permission 屬性為自定義的權限
<service android:name=".BookManagerService" android:permission="com.sl.permission.aidl" android:exported="true"> <intent-filter> <action android:name="com.sl.aidl" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </service>
2. 接入端:在 AndroidManifest 的 manifest 節點下使用自定義權限
添加權限:
<uses-permission android:name="com.sl.permission.aidl" />
調用開放組件:
Intent service = new Intent(); service.setAction("com.sl.aidl"); service.setPackage("com.sl.binderservice"); bindService(service, mConnection, Context.BIND_AUTO_CREATE);
在接入端添加自定義的權限才能正常調用開放接口,否則就會出現下面這個錯誤,這也正好實現了過濾接入端的需求。