Android進行設備管理(針對企業開發)


設備管理

Android從2.2版本開始,提供了一套設備管理API來進行Android手機設備的管理工作,其中包含設備鎖屏、禁用啓用攝像頭(4.0開始提供)、擦除用戶數據(也可擦除sdcard中的數據,不過要到2.3)等一系列的設備管理策略,具體可參見DevicePolicyManager類中的定義(http://developer.android.com/reference/android/app/admin/DevicePolicyManager.html),下面是一些具體的步驟~


聲明和定義策略

在使用設備管理功能前需在res/xml/device_admin.xml 中聲明和定義要使用的設備策略,這些聲明和定義的策略將會被我們的應用程序執行,如果你執行了沒在  res/xml/device_admin.xml  聲明和定義的策略,那將會拋出 SecurityException  異常,具體定義如下

<device-admin xmlns:android="http://schemas.android.com/apk/res/android">
    <uses-policies>
        <limit-password />
        <watch-login />
        <reset-password />
        <force-lock />
        <wipe-data />
        <expire-password />
        <encrypted-storage />
        <disable-camera />
        <disable-keyguard-features />
    </uses-policies>
</device-admin>

接收設備管理中一些事件

在進行設備管理的操作中,根據具體的業務邏輯可能需要知曉一些重要事件,比如取消激活設備管理事件,這個事件就很重要了,我們必須得知道用戶進行了此項操作,從而來進行一些邏輯的處理或者提示用戶,還有許多的事件這裏就不一一說了,具體詳見DeviceAdminReceiver(http://developer.android.com/training/enterprise/device-management-policy.html#CreateDeviceAdminReceiver),我們可以繼承DeviceAdminReceiver,覆寫一些回調方法,具體可能如下

public class AdminReceiver extends DeviceAdminReceiver {
	
	@Override
	public DevicePolicyManager getManager(Context context) {
		return super.getManager(context);
	}
	
	@Override
	public ComponentName getWho(Context context) {
		return super.getWho(context);
	}
	
	/**
	 * 禁用
	 */
	@Override
	public void onDisabled(Context context, Intent intent) {
		
		Toast.makeText(context, "禁用設備管理", Toast.LENGTH_SHORT).show();
		
		super.onDisabled(context, intent);
	}
	@Override
	public CharSequence onDisableRequested(Context context, Intent intent) {
		return super.onDisableRequested(context, intent);
	}
	
	/**
	 * 激活
	 */
	@Override
	public void onEnabled(Context context, Intent intent) {
		
		Toast.makeText(context, "啓動設備管理", Toast.LENGTH_SHORT).show();
		
		super.onEnabled(context, intent);
	}
	@Override
	public void onPasswordChanged(Context context, Intent intent) {
		super.onPasswordChanged(context, intent);
	}
	@Override
	public void onPasswordFailed(Context context, Intent intent) {
		super.onPasswordFailed(context, intent);
	}
	@Override
	public void onPasswordSucceeded(Context context, Intent intent) {
		super.onPasswordSucceeded(context, intent);
	}
	@Override
	public void onReceive(Context context, Intent intent) {
		super.onReceive(context, intent);
	}
	@Override
	public IBinder peekService(Context myContext, Intent service) {
		//Logger.d("------" + "peekService" + "------");
		return super.peekService(myContext, service);
	}
	
}
當然還需像正常的Receiver一樣得在Manifest文件中進行註冊,還行注意的是在註冊過程中還需引用我們剛纔聲明定義好的策略列表

        <receiver
            android:name=".receiver.AdminReceiver"
            android:description="@string/device_des"
            android:label="@string/device_label"
            android:permission="android.permission.BIND_DEVICE_ADMIN" >
            <meta-data
                android:name="android.app.device_admin"
                android:resource="@xml/device_manager" />

            <intent-filter>
                <action android:name="android.app.action.DEVICE_ADMIN_ENABLED" />
            </intent-filter>
        </receiver>

激活設備管理員

在策略執行之前,我們必須讓我們的應用成爲設備管理員,這樣權限去執行一些設備管理的策略,因爲設備管理涉及到一些對設備或用戶數據的操作,所以這一步驟必須得讓用戶知道,讓用戶來選擇,我們不能在後臺默默的做這一件事,不過個人認爲這也不是一項很好的操作,很多用戶就算給他提示了,把選擇權讓給他了,也不會明其理,這可能會導致一些不法應用做一些噁心的破壞(直接把sdcard中所有的數據都清除)

	private void setDeviceManager() {
		//獲取設備管理服務  
        mPolicyManager = (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE);  
        
        //AdminReceiver 繼承自 DeviceAdminReceiver  
		mPlcManagerCn = new ComponentName(this, AdminReceiver.class);
        if(!mPolicyManager.isAdminActive(mPlcManagerCn)){
        	activeAdminManager(mPlcManagerCn);
        }
	}

	/**
	 * 激活設備管理器
	 */
	private void activeAdminManager(ComponentName cn){
		
        // 啓動設備管理(隱式Intent) - 在AndroidManifest.xml中設定相應過濾器  
        Intent intent = new Intent(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN);  
          
        //權限列表  
        intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN, cn);  
          
        //描述(additional explanation)  
        intent.putExtra(DevicePolicyManager.EXTRA_ADD_EXPLANATION, getString(R.string.device_des));  
        
        startActivityForResult(intent, 100);
	}

執行到這裏後會彈出如下界面讓用戶選擇是否激活設備管理員


我們可以通過覆寫onActivityResult(int requestCode, int resultCode, Intent data)方法來知曉用戶的選擇

	@Override
	protected void onActivityResult(int requestCode, int resultCode, Intent data) {
		super.onActivityResult(requestCode, resultCode, data);
		Log.i("INFO", "requestCode : " + requestCode + "   resultCode:"+resultCode );
	}

當用戶選擇了Activate時,我們就可以來執行聲明定義好的策略了,在這裏只介紹下擦除數據策略的使用

mPolicyManager.wipeData(0);

wipeData()方法只接收0和 WIPE_EXTERNAL_STORAGE ,當爲0時代表只清除用戶數據(你手機中應用存儲的所有數據,應用是否會卸載掉因手機而不同),當爲 WIPE_EXTERNAL_STORAGE  時會連帶sdcard中的數據也會清除掉,這一點需要特別的注意


最後需要注意的是,設備管理API是在2.2之後陸續加入的,所以在具體的應用中還需對設備操作系統的版本進行判斷,看看是否支持該策略。在所有的策略中密碼策略是最爲複雜也最爲完善。如果想學習更多,大家可以到http://developer.android.com/training/enterprise/device-management-policy.html#CreateDeviceAdminReceiver瞭解基本 操作和http://developer.android.com/guide/topics/admin/device-admin.html中有更詳細的介紹


參考文章:http://developer.android.com/training/enterprise/device-management-policy.html#CreateDeviceAdminReceiver

http://developer.android.com/guide/topics/admin/device-admin.html





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章