裝置管理
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 {@Overridepublic DevicePolicyManager getManager(Context context) {return super.getManager(context);}@Overridepublic ComponentName getWho(Context context) {return super.getWho(context);}/** * 禁用 */@Overridepublic void onDisabled(Context context, Intent intent) {Toast.makeText(context, "禁用裝置管理", Toast.LENGTH_SHORT).show();super.onDisabled(context, intent);}@Overridepublic CharSequence onDisableRequested(Context context, Intent intent) {return super.onDisableRequested(context, intent);}/** * 啟用 */@Overridepublic void onEnabled(Context context, Intent intent) {Toast.makeText(context, "啟動裝置管理", Toast.LENGTH_SHORT).show();super.onEnabled(context, intent);}@Overridepublic void onPasswordChanged(Context context, Intent intent) {super.onPasswordChanged(context, intent);}@Overridepublic void onPasswordFailed(Context context, Intent intent) {super.onPasswordFailed(context, intent);}@Overridepublic void onPasswordSucceeded(Context context, Intent intent) {super.onPasswordSucceeded(context, intent);}@Overridepublic void onReceive(Context context, Intent intent) {super.onReceive(context, intent);}@Overridepublic 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)方法來知曉使用者的選擇
@Overrideprotected 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