有時候,我們可能遇到如下需求場景:當用戶在一個應用程序中進行某項操作時,會啟動另外一個應用程序,最常見的時直接打開了另外一個應用程序,並進入其中某個Activity(如:有的應用中有推薦應用列表,當用戶點擊時程序會首先判斷其他應用有無安裝,若無則提示用戶下載,如有則直接打開進入)。有時候,處於安全等需要,此類操作需要加上受限制性的訪問限制,那么怎么辦呢?Android中為我們提供了自定義權限。
為了講清自定義權限,先以不同的程序之間訪問Activity增加權限限制為例。假設應用程序A中有MainActivity,應用程序B中有AActivity和BActivity。現在想通過A中的MainActivity直接打開B中的BActivity。
那么,如果不考慮權限,A中的MainActivity如何直接打開B中的BActivity呢?一般,可以通過如下方式:
public class MainActivity extends Activity { private Button button; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); button = (Button)findViewById(R.id.button); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(); intent.setClassName("com.example.testandroid", "com.example.testandroid.BActivity"); startActivity(intent); } }); } }
這段代碼很好理解,主要是通過Intent中的setClass(String packageName, String className)方法,需要注意的是此時需要寫上包的全名。同時,針對B中的BActivity需要在AndroidManifest.xml文件中進行如下配置:
1 <activity 2 android:name="com.example.testandroid.BActivity" 3 android:exported="true" > 4 </activity>
至此,我們還沒有用到自定義權限。假設現在需要對外部應用程序直接打開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 | 義與權限相關的"風險級別"。必須是以下值之一: |
是 |
permissionGroup | 可以將權限放在一個組中,但對於自定期義權限,應該避免設置此屬性。如果確實希望設置此屬性,可能使用以下屬性代替:android.permisson-group.SYSTEM_TOOLS |
否 |
label | 可使用它對權限進行簡短描述 | 否 |
description | 使用它提供對權限用途和所保護對象的更有用的描述 | 否 |
icon | 權限可以與資源目錄以外的圖標相關聯 ( 比如@drawable/myicon) | 否 |
2.當B中BActivity進行權限限定時,需要對BActivity進行如下聲明:
1 <activity 2 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中,具有同樣的權限限定,用戶可以按照實際需要自定義權限,只是細節上些許不同而已。在此不做過多介紹。