android 理解和使用自定義權限
轉自https://byandby.iteye.com/blog/1028034
裏麵有示例源代碼下載
先扯幾句別的
執行運行時安全性檢查Android中的運行時安全性檢查是在進程級別和操作級別上進行的。在進程級別,Android禁止一個應用程序直接訪問另一個應用程序的數據。實現方法是,每個應用程序都在不同的進程中運行,使用唯一且固定的ID。在操作級別上,Android定義了一組受保護的功能和資源。要使用應用程序能夠訪問此信息,必須向 AndroidManifest.xml 文件添加一個或多個權限請求。也可以為應用程序定義自定義權限。
進程邊界上的安全性
在桌麵環境中,大部分應用程序都使用相同的用戶ID 運行,與此不同的是,Android應用程序通常使用自己的唯一ID運行。通過使用不同的ID 運行每個應用程序,Android圍繞每個進程創建了一種隔離邊界。這能夠阻止一個應用程序直接訪問另一個應用程序。
盡管每個進程都具有邊界,但應用程序之間的數據共享顯然也可以實現,但必須顯示地進行共享。換句話說,要獲得另一個應用程序的數據,必須借助該應用程序的組件。例如,可以查詢另一應用程序的ContentProvider, 可以調用另一個應用程序中的活動,或者可以與另一個應用程序的服務通信。所有這些途徑都提供了在應用程序之間共享信息的方法,但它們顯式方式實現此目的,因為你不會訪問基礎數據庫、文件等內容。
下麵我們來 使用自定義權限
Android支持為應用程序定義自定義權限。例如,如果希望阻止某些用戶啟動應用程序中的某個活動(也就是某個Activity),可以定義自定義權限來實現,要使用自定義權限,首先在AndroidManifest.xml 文件中聲明它們。定義了權限之後,可以將它們作為組件定義的一部分進行引用。
創建一個應用程序,其中包含一個不是所有人都允許啟動的活動。要啟動該活動,用戶必須具有特定的權限,我們新建一個Android項目 輸入 CustomPermission作為項目名稱,輸入 com.cust.perm最為包名稱,輸入 CustPermMainActivity作為活動名稱 我們還得創建一個具有特殊權限才能訪問的 Activity 名字是 PrivActivity,下麵使我們的 PrivActivity類。
- package com.cust.perm;
- import android.app.Activity;
- import android.os.Bundle;
- import android.view.ViewGroup.LayoutParams;
- import android.widget.LinearLayout;
- import android.widget.TextView;
- public class PrivActivity extends Activity {
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- LinearLayout view = new LinearLayout(this);
- view.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT,
- LayoutParams.WRAP_CONTENT));
- view.setOrientation(LinearLayout.HORIZONTAL);
- TextView nameLbl = new TextView(this);
- nameLbl.setText("Hello from PrivActivity");
- view.addView(nameLbl);
- setContentView(view);
- }
- }
這是一個灰常正常的Activity,我們要展示的是如果使用權限保護此activity,然後我們從客戶端調用它,如果調用成功 我們就會在屏幕上看到 我們定義的文本 “Hello from PrivActivity” 下麵我們來給這個activity 創建權限,灰常簡單了,找到我們的AndroidManifest.xml文件 點擊Permissions 然後 Add 來張圖。

圖一看大家就明白了 權限具有 名稱、標簽、圖標、權限組、描述和保護級別 這些屬性。
這個就不都解釋了,挑2個解釋,大家可以去看看文檔,雖然我也看不懂。
android:name 必須有 權限的名稱。通常應該尊選Android的命名方案 (*.permission.*)
android:protectionLevel 必須有 定義權限的風險級別,必須是以下值之一:
notmal、 dangerous、signature、signatureOrSystem normal表示權限是低風險的,不會對係統、用戶或其他應用程序造成危害。
現在已經有了自定義權限。接下來需要告訴係統,PrivActivity 活動應該僅由具有 syh.permission.STARTMYACTIVITY 權限的應用程序啟動。要在活動上設置必需的權限,可以將 android:permission 特性添加到 AndroidManifest.xml中的活動定義中。為了能啟動活動,還需要想activity 添加一個Intent過濾器,下麵是我們的 AndroidManifest.xml文件。
- <?xml version="1.0" encoding="utf-8"?>
- <manifest xmlns:android="https://schemas.android.com/apk/res/android"
- package="com.cust.perm" android:versionCode="1"
- android:versionName="1.0">
- <application android:icon="@drawable/icon"
- android:label="@string/app_name">
- <activity android:name=".CustPermMainActivity"
- android:label="@string/app_name">
- <intent-filter>
- <action android:name="android.intent.action.MAIN" />
- <category
- android:name="android.intent.category.LAUNCHER" />
- </intent-filter>
- </activity>
- <activity android:name="PrivActivity"
- android:permission="syh.permission.STARTMYACTIVITY">
- <intent-filter>
- <action android:name="android.intent.action.MAIN" />
- <category
- android:name="android.intent.category.LAUNCHER" />
- </intent-filter>
- </activity>
- </application>
- <uses-sdk android:minSdkVersion="9" />
- <permission android:description="@string/startMyActivityDesc"
- android:label="Start My Activity"
- android:name="syh.permission.STARTMYACTIVITY"
- android:protectionLevel="normal">
- </permission>
- </manifest>
我們的權限描述屬性 android:description 引用了字符串資源 所以我們還得向 strings.xml添加一個字符串常量,如下:
好了我們現在來編寫客戶端,我們將在客戶端中 訪問剛才我們定義的具有特殊權限才能訪問的Activity。新建項目 ClientOfCustomPermission 我們定義了一個按鈕,當我們點擊按鈕就會訪問那個具有特殊權限才能訪問的 activity,下麵是我們客戶端的布局文件。
- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout xmlns:android="https://schemas.android.com/apk/res/android"
- android:orientation="vertical"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- >
- <Button
- android:id="@+id/btn"
- android:text="Lauch PrivActivity"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- />
- </LinearLayout>
運行效果


下麵來看看我們的 ClientCustPermMainActivity類, 也沒有什麼特別的 就是我們需要在客戶端的 AndroidManifest.xml文件中聲明我們的訪問權限 如下。
- package com.client.cust.perm;
- import android.app.Activity;
- import android.content.Intent;
- import android.os.Bundle;
- import android.view.View;
- import android.view.View.OnClickListener;
- import android.widget.Button;
- public class ClientCustPermMainActivity extends Activity {
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- Button btn = (Button) findViewById(R.id.btn);
- btn.setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View v) {
- Intent intent = new Intent();
- // 通過指定包名來啟動我們想要啟動的 Activity 注意第二個參數是完全限定包名
- intent.setClassName("com.cust.perm",
- "com.cust.perm.PrivActivity");
- startActivity(intent);
- }
- });
- }
- }
我們添加了 uses-permission 項來請求自定義權限,具有該權限才能啟動在 CustomPermission 項目中實現的 PrivActivity,然後我們運行 客戶端,在這裏 我要弱弱的提醒大家一下,由於我們是在 我們的客戶端 去訪問另外一個項目中的 具有特殊權限的activity,不是如訪問服務 所以我們的另一個項目 也就是CustomPermission必須先運行,然後再運行我們的客戶端,不然 是訪問不了滴。
最後更新:2017-04-03 12:55:13