[android開發篇]自定義權限


有時候,我們可能遇到如下需求場景:當用戶在一個應用程序中進行某項操作時,會啟動另外一個應用程序,最常見的時直接打開了另外一個應用程序,並進入其中某個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

義與權限相關的"風險級別"。必須是以下值之一:
normal, dangerous, signature, signatureOrSystem ,取決於保護級別,在確定是否授予權限時,系統可能采取不同的操作。
normal 表示權限是低風險的,不會對系統、用戶或其他應用程序造成危害;
dangerous 表示權限是高風險的,系統將可能要求用戶輸入相關信息,才會授予此權限;
signature 表示只有當應用程序所用數字簽名與聲明引權限的應用程序所用數字簽名相同時,才能將權限授給它;
signatureOrSystem 表示將權限授給具有相同數字簽名的應用程序或android 包類。這一保護級別適和於非常特殊的情況,比如多個供應商需要通過系統映像共享功能時

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中,具有同樣的權限限定,用戶可以按照實際需要自定義權限,只是細節上些許不同而已。在此不做過多介紹。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM