關於Android Device Administratioin介紹可參見文檔 docs/guide/topics/admin/device-admin.html 小節。html
本文經過示例演示Android Device Policy管理的實現。java
1.示例基本操做圖android
上圖是本示例的主界面,經過應用程序來實現設備管理,本示例實現密碼設置管理。git
1.1 經過點擊「啓動設備管理器」按鈕來激活設備管理github
應用程序用通知設備管理啓用,用戶點擊激活,應用程序具有設備管理能力。app
1.2 經過點擊「設置密碼規則」按鈕來設置鎖屏密碼的限制規則,要使用該策略須要在設備管理的使用策略列表中添加limit-password.框架
示例中調用了設置新密碼的ACTION(DevicePolicyManager.ACTION_SET_NEW_PASSWORD),經過設置後,看以看到屏幕鎖屏須要密碼。 ide
1.3 經過點擊「修改密碼」按鈕則能夠將文本框中的內容做爲鎖屏密碼,該步驟能夠經過程序完成。佈局
調用DevicePolicyManager的重置密碼方法(resetPassword),便可在應用程序中對鎖屏密碼進行重置。ui
2. 具體實現
實現上述整個示例須要:
a.界面佈局;實際應用中根據具體狀況而定
b.DevicePolicyManager類的具體使用
c.DeviceAdminReceiver類的子類話,來實現具體廣播事件的處理
d.AndroidManifest.xml文件中廣播接收類的配置
c.應用程序中須要的設備管理策略列表
注:本示例代碼使用了Butterknife框架。
2.1 示例程序界面(layout/activity_device_admin.xml)
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#f7f1f1" android:orientation="vertical" android:padding="15dp"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:orientation="horizontal"> <EditText android:id="@+id/pwd_editText" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_margin="10dp" android:layout_weight="3" android:hint="6位數字" android:textColor="@android:color/black"/> <Button android:id="@+id/modify_pwd_button" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_margin="10dp" android:layout_weight="1.5" android:text="修改密碼"/> </LinearLayout> <Button android:id="@+id/pwd_rule_set_button" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="設置密碼規則"/> <Button android:id="@+id/device_admin_button" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="啓用設備管理"/> </LinearLayout>
2.2 Activity類和自定義的DeviceAdminReceiver類
package secondriver.sdk.activity; import android.app.Activity; import android.app.admin.DeviceAdminReceiver; import android.app.admin.DevicePolicyManager; import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.widget.Button; import android.widget.EditText; import android.widget.Toast; import butterknife.Bind; import butterknife.ButterKnife; import butterknife.OnClick; import secondriver.sdk.R; /** * Author : secondriver * Created : 2015/11/27 */ public class DeviceAdminActivity extends Activity { @Bind(R.id.pwd_editText) public EditText pwdEditText; private DevicePolicyManager mDevicePolicyManager; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_device_admin); ButterKnife.bind(this); mDevicePolicyManager = (DevicePolicyManager) getSystemService(DEVICE_POLICY_SERVICE); } //單擊啓用設備管理按鈕 @OnClick(R.id.device_admin_button) public void onClickDeviceButton(Button button) { Intent intent = new Intent(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN); intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN, new ComponentName(this, MyDeviceAdminReceiver.class)); intent.putExtra(DevicePolicyManager.EXTRA_ADD_EXPLANATION, "啓動設備管理器"); startActivityForResult(intent, 1); } //單擊設置密碼規則按鈕 @OnClick(R.id.pwd_rule_set_button) public void onClickPwdRuleSetButton(Button button) { Intent intent = new Intent(DevicePolicyManager.ACTION_SET_NEW_PASSWORD); startActivityForResult(intent, 2); } //單擊修改密碼按鈕 @OnClick(R.id.modify_pwd_button) public void onClickModifyPwdButton(Button button) { String pwd = pwdEditText.getText().toString(); ComponentName receiver = new ComponentName(this, MyDeviceAdminReceiver.class); boolean active = mDevicePolicyManager.isAdminActive(receiver); if (active) { boolean rs = mDevicePolicyManager.resetPassword(pwd, DevicePolicyManager.RESET_PASSWORD_REQUIRE_ENTRY); if (rs) { Toast.makeText(this, "密碼修改爲功", Toast.LENGTH_SHORT).show(); } else { Toast.makeText(this, "密碼修改失敗", Toast.LENGTH_SHORT).show(); } } else { Toast.makeText(this, "沒有Active Admin", Toast.LENGTH_SHORT).show(); } } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { switch (requestCode) { case 1: if (resultCode == RESULT_OK) { Toast.makeText(this, "設備管理器開啓成功", Toast.LENGTH_SHORT).show(); } else { Toast.makeText(this, "設備管理器開啓失敗", Toast.LENGTH_SHORT).show(); } break; case 2: if (resultCode == RESULT_OK) { Toast.makeText(this, "密碼規則設置成功", Toast.LENGTH_SHORT).show(); } else { Toast.makeText(this, "密碼規則設置失敗", Toast.LENGTH_SHORT).show(); } break; default: break; } } //自定義的設備管理廣播接收類,能夠重寫DeviceAdminReceiver中的方法,來實現具體功能 public static class MyDeviceAdminReceiver extends DeviceAdminReceiver { /** * 重寫其中方法 * <p> * More */ @Override public void onDisabled(Context context, Intent intent) { super.onDisabled(context, intent); //設備管理禁用 } @Override public void onEnabled(Context context, Intent intent) { super.onEnabled(context, intent); //設備管理啓用 } } }
2.3 配置設備管理接收者
<activity android:name=".activity.DeviceAdminActivity"/> <receiver android:name=".activity.DeviceAdminActivity$MyDeviceAdminReceiver" android:permission="android.permission.BIND_DEVICE_ADMIN"> <meta-data android:name="android.app.device_admin" android:resource="@xml/device_admin"/> <intent-filter> <action android:name="android.app.action.DEVICE_ADMIN_ENABLED"/> </intent-filter> </receiver>
xml/device_admin內容:
<?xml version="1.0" encoding="utf-8"?> <device-admin xmlns:android="http://schemas.android.com/apk/res/android"> <uses-policies> <!--設置密碼規則;控制屏幕鎖的密碼長度和容許的字符--> <limit-password/> <!--監視屏幕鎖解鎖嘗試的次數;若是輸入錯誤次數過多則鎖定手機或者清除全部數據--> <watch-login/> <!--重置屏幕鎖的密碼;從新設置新的屏幕鎖密碼--> <reset-password/> <!--強制鎖屏;控制屏幕鎖屏的方式和時間--> <force-lock/> <!--擦除數據;恢復出廠設置清除說有數據--> <wipe-data/> <!--禁用相機;禁止使用全部設備攝像頭--> <disable-camera/> <!--加密數據;對存儲的應用數據進行加密--> <encrypted-storage/> <!--密碼過時;強制用戶更改屏幕鎖密碼的頻率--> <expire-password/> </uses-policies> </device-admin>
示例生成apk,該應用具體了設備管理的功能。