自定義權限,主要用於保護被賦予權限的組件。如無權限與有權限,正如public與private的對類保護的區別
執行運行時安全性檢查
Android中的運行時安全性檢查是在進程級別和操作級別上進行的。在進程級別,Android禁止一個應用程序直接訪問另一個應用程序的數據。實現方法是,每個應用程序都在不同的進程中運行,使用唯一且固定的ID。在操作級別上,Android定義了一組受保護的功能和資源。要使用應用程序能夠訪問此信息,必須向 AndroidManifest.xml 文件添加一個或多個權限請求。也可以為應用程序定義自定義權限。
進程邊界上的安全性
在桌面環境中,大部分應用程序都使用相同的用戶ID 運行,與此不同的是,Android應用程序通常使用自己的唯一ID運行。通過使用不同的ID 運行每個應用程序,Android圍繞每個進程創建了一種隔離邊界。這能夠阻止一個應用程序直接訪問另一個應用程序。
盡管每個進程都具有邊界,但應用程序之間的數據共享顯然也可以實現,但必須顯示地進行共享。換句話說,要獲得另一個應用程序的數據,必須借助該應用程序的組件。例如,可以查詢另一應用程序的ContentProvider, 可以調用另一個應用程序中的活動,或者可以與另一個應用程序的服務通信。所有這些途徑都提供了在應用程序之間共享信息的方法,但它們顯式方式實現此目的,因為你不會訪問基礎數據庫、文件等內容。
下面我們來 使用自定義權限
Android支持為應用程序定義自定義權限。例如,如果希望阻止某些用戶啟動應用程序中的某個活動(也就是某個Activity),可以定義自定義權限來實現,要使用自定義權限,首先在AndroidManifest.xml 文件中聲明它們。定義了權限之後,可以將它們作為組件定義的一部分進行引用。
首先創建一個工程DefinePermission
修改MainActivity當前類,添加
[html]
Toast.makeText(this, "歡迎來到步步高的世界!", Toast.LENGTH_LONG).show();
修改AndroidManifest.xml文件
[html]
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.lzx.definepermission"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="15" />
<permission
android:name="com.lzx.permission.test"
android:label="@string/app_name"
android:permissionGroup="@string/hello_world"
android:protectionLevel="normal" >
</permission>
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name=".MainActivity"
android:label="@string/title_activity_main"
android:permission="com.lzx.permission.test" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
1、自定義權限
聲明的含義如下;
android:label:權限名字,顯示給用戶的,值可是一個 string 數據,例如這裡的“自定義權限”。
android:description:比 label 更長的對權限的描述。值是通過 resource 文件中獲取的,不能直接寫 string 值,例如這裡的”@string/test”。
android:name:權限名字,如果其他 app 引用該權限需要填寫這個名字。
android:protectionLevel:權限級別,分為 4 個級別:
normal:低風險權限,在安裝的時候,系統會自動授予權限給 application。
dangerous:高風險權限,系統不會自動授予權限給 app,在用到的時候,會給用戶提示。
signature:簽名權限,在其他 app 引用聲明的權限的時候,需要保證兩個 app 的簽名一致。這樣系統就會自動授予權限給第三方 app,而不提示給用戶。
signatureOrSystem:這個權限是引用該權限的 app 需要有和系統同樣的簽名才能授予的權限,一般不推薦使用。
2、為MainActivity加入啟動權限:android:permission="com.lzx.permission.test"
再建一個Client工程
修改xml添加一個button按鈕
修改MainActivity添加button點擊事件
[html]
((Button) findViewById(R.id.button1))
.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
Intent intent = new Intent();
intent.setClassName("com.lzx.definepermission",
"com.lzx.definepermission.MainActivity");
startActivity(intent);
}
});
修改AndroidManifest.xml文件
[html]
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.lzx.client"
android:versionCode="1"
android:versionName="1.0" >
<uses-permission android:name="com.lzx.permission.test" />
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="15" />
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="com.lzx.client.MainActivity"
android:label="@string/title_activity_main"
android:permission="com.lzx.permission.test" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
添加使用權限use-permission,使用剛才定義的permission
同時注意,給當前Activity也要加上訪問權限