本文來自 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目前類,添加
修改AndroidManifest.xml檔案Toast.makeText(this, "歡迎來到步步高的世界!", Toast.LENGTH_LONG).show();
<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