權限是一種安全機制。Android權限主要用於限制應用程序內部某些具備限制性特性的功能使用以及應用程序之間的組件訪問。在Android開發中,基本上都會遇到聯網的需求,咱們知道都須要加上聯網所須要的權限:html
1 <uses-permission android:name="android.permission.INTERNET" />
實際上,在開發過程當中,當咱們使用了某些系統特性的功能,且此類特性須要包含相應權限時,若是在AndroidManifest.xml文件中相應申明,則會運行錯誤且提示:java.lang.SecurityException: Permission Denial ...java
根據此錯誤提示,通常狀況下,在AndroidManifest.xml中經過 uses-permission 增長上相應權限便可。android
1、Android權限列表:安全
那麼,Android中有哪些受限制性訪問的特性呢?具體的特性對應所須要的權限名稱又是什麼呢?具體能夠在Android官方文檔中查的。ide
http://developer.android.com/reference/android/Manifest.permission.htmlspa
須要注意的是,不一樣的權限可能對應了不一樣的API等級,所以,可能會出現兼容性問題。code
2、Android自定義權限:orm
有時候,咱們可能遇到以下需求場景:當用戶在一個應用程序中進行某項操做時,會啓動另一個應用程序,最多見的時直接打開了另一個應用程序,並進入其中某個Activity(如:有的應用中有推薦應用列表,當用戶點擊時程序會首先判斷其餘應用有無安裝,若無則提示用戶下載,若有則直接打開進入)。有時候,處於安全等須要,此類操做須要加上受限制性的訪問限制,那麼怎麼辦呢?Android中爲咱們提供了自定義權限。xml
爲了講清自定義權限,先以不一樣的程序之間訪問Activity增長權限限制爲例。假設應用程序A中有MainActivity,應用程序B中有AActivity和BActivity。如今想經過A中的MainActivity直接打開B中的BActivity。htm
那麼,若是不考慮權限,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中,具備一樣的權限限定,用戶能夠按照實際須要自定義權限,只是細節上些許不一樣而已。在此不作過多介紹。