權限是一種安全機制。Android權限主要用於限制應用程序內部某些具有限制性特性的功能使用以及應用程序之間的組件訪問。在Android開發中,基本上都會遇到聯網的需求,我們知道都需要加上聯網所需要的權限:
1 <uses-permission android:name="android.permission.INTERNET" />
實際上,在開發過程中,當我們使用了某些系統特性的功能,且此類特性需要包含相應權限時,如果在AndroidManifest.xml文件中相應申明,則會運行錯誤且提示:java.lang.SecurityException: Permission Denial ...
根據此錯誤提示,一般情況下,在AndroidManifest.xml中通過 uses-permission 增加上相應權限即可。
一、Android權限列表:
那么,Android中有哪些受限制性訪問的特性呢?具體的特性對應所需要的權限名稱又是什么呢?具體可以在Android官方文檔中查的。
http://developer.android.com/reference/android/Manifest.permission.html
需要注意的是,不同的權限可能對應了不同的API等級,因此,可能會出現兼容性問題。
二、Android自定義權限:
有時候,我們可能遇到如下需求場景:當用戶在一個應用程序中進行某項操作時,會啟動另外一個應用程序,最常見的時直接打開了另外一個應用程序,並進入其中某個Activity(如:有的應用中有推薦應用列表,當用戶點擊時程序會首先判斷其他應用有無安裝,若無則提示用戶下載,如有則直接打開進入)。有時候,處於安全等需要,此類操作需要加上受限制性的訪問限制,那么怎么辦呢?Android中為我們提供了自定義權限。
為了講清自定義權限,先以不同的程序之間訪問Activity增加權限限制為例。假設應用程序A中有MainActivity,應用程序B中有AActivity和BActivity。現在想通過A中的MainActivity直接打開B中的BActivity。
那么,如果不考慮權限,A中的MainActivity如何直接打開B中的BActivity呢?一般,可以通過如下方式:
1 public class MainActivity extends Activity { 2
3 private Button button; 4
5 @Override 6 protected void onCreate(Bundle savedInstanceState) { 7 super.onCreate(savedInstanceState); 8 setContentView(R.layout.activity_main); 9
10 button = (Button)findViewById(R.id.button); 11 button.setOnClickListener(new View.OnClickListener() { 12 @Override 13 public void onClick(View v) { 14 Intent intent = new Intent(); 15 intent.setClassName("com.example.testandroid", "com.example.testandroid.BActivity"); 16 startActivity(intent); 17 } 18 }); 19 } 20 }
這段代碼很好理解,主要是通過Intent中的setClass(String packageName, String className)方法,需要注意的是此時需要寫上包的全名。同時,針對B中的BActivity需要在AndroidManifest.xml文件中進行如下配置:
1 <activity 2 android:name="com.example.testandroid.BActivity"
3 android:exported="true" >
4 </activity>
一定要為Activity中的屬性android:exported設置值為true,以表示可以被其他應用程序打開。或者,也可以進行如下配置:
1 <activity 2 android:name="com.example.testandroid.BActivity" >
3 <intent-filter>
4 <action android:name="" />
5 </intent-filter>
6 </activity>
為Activity設置一個空的action android:name屬性。
至此,我們還沒有用到自定義權限。假設現在需要對外部應用程序直接打開BActivity做些訪問性限制,為其增加一個自定義權限,這樣,只有在聲明了此自定義權限的外部應用,才具有資格打開BActivity。具體步驟如下:
1.既然是自定權限,那么首先得申明此權限:
在B中的AndroidManifest.xml中,一般是緊跟uses-sdk標簽后,通過permission標簽進行申明。
1 <permission android:description="string resource"
2 android:icon="drawable resource"
3 android:label="string resource"
4 android:name="string"
5 android:permissionGroup="string"
6 android:protectionLevel=["normal" | "dangerous" | "signature" | "signatureOrSystem"] />
各屬性具體含義如下:
屬性 | 含義 | 是否必須 |
name | 自定義的權限名稱,需要遵循Android權限定義命名方案:*.permission.* | 是 |
protectionLevel | 義與權限相關的"風險級別"。必須是以下值之一: |
是 |
permissionGroup | 可以將權限放在一個組中,但對於自定期義權限,應該避免設置此屬性。如果確實希望設置此屬性,可能使用以下屬性代替:android.permisson-group.SYSTEM_TOOLS |
否 |
label | 可使用它對權限進行簡短描述 | 否 |
description | 使用它提供對權限用途和所保護對象的更有用的描述 | 否 |
icon | 權限可以與資源目錄以外的圖標相關聯 ( 比如@drawable/myicon) | 否 |
2.當B中BActivity進行權限限定時,需要對BActivity進行如下聲明:
1 <activity 2 android:name="com.example.testandroid.BActivity"
3 android:exported="true"
4 android:label="B"
5 android:permission="corn.permission.CORN_OWN" >
6 </activity>
3.此時外部應用A中的Activity想直接打開B中BActivity,則需要添加上相應權限:
1 <uses-permission android:name="corn.permission.CORN_OWN" >
2 </uses-permission>
這就是Activity自定義權限的一般性流程。總體說來,當不同應用間Activity Receiver定義了權限並進行了外部訪問權限限定時,外部應用則必須具備此權限才能直接訪問此Activity Receiver。
同樣的,在Android的其他系統組件中,如BroadcastReceiver、ContentProvider及Service中,具有同樣的權限限定,用戶可以按照實際需要自定義權限,只是細節上些許不同而已。在此不做過多介紹。