Android 權限 exproted 的作用

權限是一種安全機制。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

義與權限相關的"風險級別"。必須是以下值之一:
normal, dangerous, signature, signatureOrSystem ,取決於保護級別,在確定是否授予權限時,系統可能採取不同的操作。
normal 表示權限是低風險的,不會對系統、用戶或其他應用程序造成危害;
dangerous 表示權限是高風險的,系統將可能要求用戶輸入相關信息,纔會授予此權限;
signature 表示只有當應用程序所用數字簽名與聲明引權限的應用程序所用數字簽名相同時,才能將權限授給它;
signatureOrSystem 表示將權限授給具有相同數字簽名的應用程序或android 包類。這一保護級別適和於非常特殊的情況,比如多個供應商需要通過系統映像共享功能時

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中,具有同樣的權限限定,用戶可以按照實際需要自定義權限,只是細節上些許不同而已。在此不做過多介紹。

 

--------------------------------------------------------------------------------- 
筆者水平有限,若有錯漏,歡迎指正,如果轉載以及CV操作,請務必註明出處,謝謝!
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章