Android總結篇系列:Android 許可權

來源:互聯網
上載者:User

標籤:android   des   style   blog   http   java   

許可權是一種安全機制。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             @Override13             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 <activity2     android:name="com.example.testandroid.BActivity"3     android:exported="true" >4 </activity>

一定要為Activity中的屬性android:exported設定值為true,以表示可以被其他應用程式開啟。或者,也可以進行如下配置:

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

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.