Android聲明和使用權限

原文轉自:http://blog.csdn.net/liuhe688/article/details/6417983 html

Android定義了一種權限方案來保護設備上的資源和功能。例如,在默認狀況下,應用程序沒法訪問聯繫人列表、撥打電話等。下面就以撥打電話爲例介紹一下系統對權限的要求。通常在咱們的應用中,若是要用到撥打電話的功能,咱們會這樣編碼: java

[java]  view plain copy
  1. Uri uri = Uri.parse("tel:12345678");  
  2. Intent intent = new Intent(Intent.ACTION_CALL, uri);  
  3. startActivity(intent);  

默認狀況下,咱們無權訪問撥打電話的Activity,控制檯將會報如下異常信息: android

[java]  view plain copy
  1. ERROR/AndroidRuntime: java.lang.SecurityException: Permission Denial:   
  2. starting Intent { act=android.intent.action.CALL dat=tel:12345678 cmp=com.android.phone/.OutgoingCallBroadcaster }  
  3. ......   
  4. requires android.permission.CALL_PHONE  

看來,咱們是缺乏了CALL_PHONE這個權限,這個權限是Android系統自帶的phone應用裏定義的權限: 安全

[xhtml]  view plain copy
  1. ......  
  2. <uses-permission android:name="android.permission.CALL_PHONE" />  
  3. ......  
  4. <activity android:name="OutgoingCallBroadcaster"  
  5.                 android:permission="android.permission.CALL_PHONE"  
  6.                 android:theme="@android :style/Theme.NoDisplay"  
  7.                 android:configChanges="orientation|keyboardHidden">  
  8.             <!-- CALL action intent filters, for the various ways  
  9.                  of initiating an outgoing call. -->  
  10.             <intent-filter>  
  11.                 <action android:name="android.intent.action.CALL" />  
  12.                 <category android:name="android.intent.category.DEFAULT" />  
  13.                 <data android:scheme="tel" />  
  14.             </intent-filter>  
  15.             <intent-filter>  
  16.                 <action android:name="android.intent.action.CALL" />  
  17.                 <category android:name="android.intent.category.DEFAULT" />  
  18.                 <data android:scheme="voicemail" />  
  19.             </intent-filter>  
  20.             <intent-filter>  
  21.                 <action android:name="android.intent.action.CALL" />  
  22.                 <category android:name="android.intent.category.DEFAULT" />  
  23.                 <data android:mimeType="vnd.android.cursor.item/phone" />  
  24.                 <data android:mimeType="vnd.android.cursor.item/phone_v2" />  
  25.                 <data android:mimeType="vnd.android.cursor.item/person" />  
  26.             </intent-filter>  
  27. </activity>  
  28. ......  

想要使用此功能,必須在咱們的AndroidManifest.xml文件中聲明使用此權限: app

[xhtml]  view plain copy
  1. <application ...>  
  2. ...  
  3. </application>  
  4. <uses-permission android:name="android.permission.CALL_PHONE"/>  

這告訴系統,咱們的應用使用了此權限,咱們有權訪問撥打電話的Activity。 ide

咱們不只要問,爲何系統會這樣設計呢?答案是爲了保護用戶資源的安全。要想使用此功能,必須在應用中聲明權限信息,這樣一來,在用戶安裝此應用時系統會從應用中提取出權限信息,告訴用戶該應用使用到了哪些功能,由用戶判斷該應用是否損害本身的安全。 ui

接下來由我來演示一下權限的定義和使用,咱們創建一個phone項目,項目結構以下: this

咱們設計的流程是在MainActivity中點擊按鈕,而後跳轉到PhoneActivity中,咱們會爲PhoneActiivty定義相應的權限。 編碼

咱們先看一下MainActivity和PhoneActivity的代碼: .net

MainActivity.java以下:

[java]  view plain copy
  1. package com.scott.phone;  
  2.   
  3. import android.app.Activity;  
  4. import android.content.Intent;  
  5. import android.os.Bundle;  
  6. import android.view.View;  
  7. import android.widget.Button;  
  8.   
  9. public class MainActivity extends Activity {  
  10.     @Override  
  11.     public void onCreate(Bundle savedInstanceState) {  
  12.         super.onCreate(savedInstanceState);  
  13.         setContentView(R.layout.main);  
  14.         Button btn = (Button) findViewById(R.id.btn);  
  15.         btn.setOnClickListener(new View.OnClickListener() {  
  16.             @Override  
  17.             public void onClick(View v) {  
  18.                 startActivity(new Intent(MainActivity.this, PhoneActivity.class));  
  19.             }  
  20.         });  
  21.     }  
  22. }  

PhoneActivity.java以下:

[java]  view plain copy
  1. package com.scott.phone;  
  2.   
  3. import android.app.Activity;  
  4. import android.os.Bundle;  
  5. import android.widget.TextView;  
  6.   
  7. public class PhoneActivity extends Activity {  
  8.     @Override  
  9.     protected void onCreate(Bundle savedInstanceState) {  
  10.         super.onCreate(savedInstanceState);  
  11.         TextView tv = new TextView(this);  
  12.         tv.setText("Yes! It works.");  
  13.         setContentView(tv);  
  14.     }  
  15. }  
  

最重要的是AndroidManifest.xml文件,咱們全部的權限聲明配置都在此文件中完成:

[xhtml]  view plain copy
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"  
  3.       package="com.scott.phone"  
  4.       android:versionCode="1"  
  5.       android:versionName="1.0">  
  6.       
  7.     <!-- 聲明一個權限  -->  
  8.     <permission android:protectionLevel="normal"   
  9.                 android:name="scott.permission.MY_CALL_PHONE"/>  
  10.                   
  11.     <application android:icon="@drawable/icon" android:label="@string/app_name">  
  12.         <activity android:name=".MainActivity"  
  13.                   android:label="@string/app_name">  
  14.             <intent-filter>  
  15.                 <action android:name="android.intent.action.MAIN" />  
  16.                 <category android:name="android.intent.category.LAUNCHER" />  
  17.             </intent-filter>  
  18.         </activity>  
  19.         <!-- 爲Activity應用已定義的權限 -->  
  20.         <activity android:name=".PhoneActivity"   
  21.                   android:permission="scott.permission.MY_CALL_PHONE">  
  22.             <intent-filter>  
  23.                 <!-- 注意這個action 在其餘應用中可以使用此action訪問此Activity -->  
  24.                 <action android:name="scott.intent.action.MY_CALL"/>  
  25.                 <category android:name="android.intent.category.DEFAULT" />  
  26.             </intent-filter>  
  27.         </activity>  
  28.     </application>  
  29.     <!-- 在同一應用中訪問PhoneActivity也須要加上權限 -->  
  30.     <uses-permission android:name="scott.permission.MY_CALL_PHONE"/>  
  31.     <uses-sdk android:minSdkVersion="8" />  
  32. </manifest>  

須要注意的是,在聲明權限時須要一個android:protectionLevel的屬性,它表明「風險級別」。必須是如下值之一:

normal、dangerous、signature、signatureOrSystem。

normal表示權限是低風險的,不會對系統、用戶或其餘應用程序形成危害。

dangerous表示權限是高風險的,系統將可能要求用戶輸入相關信息,纔會授予此權限。

signature告訴Android,只有當應用程序所用數字簽名與聲明此權限的應用程序全部數字簽名相同時,才能將權限授給它。

signatureOrSystem告訴Android,將權限授給具備相同數字簽名的應用程序或Android包類,這一級別適用於很是特殊的狀況,好比多個供應商須要經過系統影像共享功能時。

另一個是android:permissionGroup屬性,表示一個權限組。能夠將權限放在一個組中,但對於自定義權限,應該避免設置此屬性。若是確實但願設置此屬性,能夠使用如下屬性代替:android.permission-group.SYSTEM_TOOLS。

下面是兩個活動的截圖:

以上過程都是在一個內部完成的,如今假如咱們的這個phone應用做爲系統內置的應用,作爲開發者,咱們新建一個app,而後訪問phone應用裏的PhoneActivity。app的結構圖以下:

咱們在MainActivity裏放置一個按鈕,點擊以後跳轉到phone應用的PhoneActivity中。MainActivity.java代碼以下:

[java]  view plain copy
  1. package com.scott.app;  
  2.   
  3. import android.app.Activity;  
  4. import android.content.Intent;  
  5. import android.os.Bundle;  
  6. import android.view.View;  
  7. import android.widget.Button;  
  8.   
  9. public class MainActivity extends Activity {  
  10.     @Override  
  11.     public void onCreate(Bundle savedInstanceState) {  
  12.         super.onCreate(savedInstanceState);  
  13.         setContentView(R.layout.main);  
  14.         Button btn = (Button) findViewById(R.id.btn);  
  15.         btn.setOnClickListener(new View.OnClickListener() {  
  16.             @Override  
  17.             public void onClick(View v) {  
  18.                 Intent intent = new Intent("scott.intent.action.MY_CALL");  
  19.                 startActivity(intent);  
  20.             }  
  21.         });  
  22.     }  
  23. }  

而後咱們須要在AndroidManifest.xml文件中配置相應的權限:

[xhtml]  view plain copy
  1. <application ...>  
  2. ...  
  3. </application>  
  4. <uses-permission android:name="scott.permission.MY_CALL_PHONE"/>  

點擊按鈕,就能夠順利地跳轉到PhoneActivity了。截圖以下:

相關文章
相關標籤/搜索