天天看點

Android自定義權限和使用權限

本文來自 http://blog.csdn.net/liuxian13183/  ,引用必須注明出處!

自定義權限,主要用于保護被賦予權限的元件。如無權限與有權限,正如public與private的對類保護的差別

執行運作時安全性檢查 

    Android中的運作時安全性檢查是在程序級别和操作級别上進行的。在程序級别,Android禁止一個應用程式直接通路另一個應用程式的資料。實作方法是,每個應用程式都在不同的程序中運作,使用唯一且固定的ID。在操作級别上,Android定義了一組受保護的功能和資源。要使用應用程式能夠通路此資訊,必須向  AndroidManifest.xml 檔案添加一個或多個權限請求。也可以為應用程式定義自定義權限。 

程序邊界上的安全性 

      在桌面環境中,大部分應用程式都使用相同的使用者ID 運作,與此不同的是,Android應用程式通常使用自己的唯一ID運作。通過使用不同的ID 運作每個應用程式,Android圍繞每個程序建立了一種隔離邊界。這能夠阻止一個應用程式直接通路另一個應用程式。 

盡管每個程序都具有邊界,但應用程式之間的資料共享顯然也可以實作,但必須顯示地進行共享。換句話說,要獲得另一個應用程式的資料,必須借助該應用程式的元件。例如,可以查詢另一應用程式的ContentProvider, 可以調用另一個應用程式中的活動,或者可以與另一個應用程式的服務通信。所有這些途徑都提供了在應用程式之間共享資訊的方法,但它們顯式方式實作此目的,因為你不會通路基礎資料庫、檔案等内容。 

下面我們來 使用自定義權限 

     Android支援為應用程式定義自定義權限。例如,如果希望阻止某些使用者啟動應用程式中的某個活動(也就是某個Activity),可以定義自定義權限來實作,要使用自定義權限,首先在AndroidManifest.xml 檔案中聲明它們。定義了權限之後,可以将它們作為元件定義的一部分進行引用。 

首先建立一個工程DefinePermission

修改MainActivity目前類,添加

Toast.makeText(this, "歡迎來到步步高的世界!", Toast.LENGTH_LONG).show();      
修改AndroidManifest.xml檔案
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.lzx.definepermission"
    android:versionCode="1"
    android:versionName="1.0" >
    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="15" />
    <permission
        android:name="com.lzx.permission.test"
        android:label="@string/app_name"
        android:permissionGroup="@string/hello_world"
        android:protectionLevel="normal" >
    </permission>
    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".MainActivity"
            android:label="@string/title_activity_main"
            android:permission="com.lzx.permission.test" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
</manifest>      

1、自定義權限

聲明的含義如下;

android:label:權限名字,顯示給使用者的,值可是一個 string 資料,例如這裡的“自定義權限”。

android:description:比 label 更長的對權限的描述。值是通過 resource 檔案中擷取的,不能直接寫 string 值,例如這裡的”@string/test”。

android:name:權限名字,如果其他 app 引用該權限需要填寫這個名字。

android:protectionLevel:權限級别,分為 4 個級别:

    • normal:低風險權限,在安裝的時候,系統會自動授予權限給 application。
    • dangerous:高風險權限,系統不會自動授予權限給 app,在用到的時候,會給使用者提示。
    • signature:簽名權限,在其他 app 引用聲明的權限的時候,需要保證兩個 app 的簽名一緻。這樣系統就會自動授予權限給第三方 app,而不提示給使用者。
    • signatureOrSystem:這個權限是引用該權限的 app 需要有和系統同樣的簽名才能授予的權限,一般不推薦使用。

  2、為MainActivity加入啟動權限:android:permission="com.lzx.permission.test"

再建一個Client工程

修改xml添加一個button按鈕

修改MainActivity添加button點選事件

((Button) findViewById(R.id.button1))
				.setOnClickListener(new View.OnClickListener() {
					public void onClick(View v) {
						Intent intent = new Intent();
						intent.setClassName("com.lzx.definepermission",
								"com.lzx.definepermission.MainActivity");
						startActivity(intent);
					}
				});      
<manifest 

xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.lzx.client"
    android:versionCode="1"
    android:versionName="1.0" >
    <uses-permission android:name="com.lzx.permission.test" 

/>
    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="15" />
    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.lzx.client.MainActivity"
            android:label="@string/title_activity_main">
            <intent-filter>
                <action 

android:name="android.intent.action.MAIN" />
                <category 

android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
</manifest>      

添加使用權限use-permission,使用剛才定義的permission

同時注意,給目前Activity也要加上通路權限

可能遇見問題:

1、secure問題,那是要啟動權重限的Acitvity,目前啟動者也要加上相關權限

2、Activity找不到,第一要先安裝DefinePermission項目,第二要看你啟動Activity的包是否寫的正确。

另外關于權限,再講個小知識,Android控件中會包含這樣一條android:exported=true,表示此控件能被所在Application之外的其他Application所捕捉到,預設為false,不能捕捉到,即不能通路。

源碼下載下傳:

http://download.csdn.net/detail/liuxian13183/7357317 更多請移步: http://blog.csdn.net/reboot123/article/details/14448153 參考文章: http://byandby.iteye.com/blog/1028034

繼續閱讀