To create a device admin app, you must subclass
DeviceAdminReceiver. The
DeviceAdminReceiverclass consists of a series of callbacks that are triggered when particular events occur.
大意:写一个设备管理APP,首先必须继承DeviceAdminReceiver类,这个类包含了很多回调方法,这些回调方法会在特定事件发生时,被触发。就是这个APP会管理一些设备功能(如:锁屏、密码策略管理),一旦触发这些功能,就会调用这些重写的回调函数
The process of enabling the app begins when the user performs an action that triggers the
ACTION_ADD_DEVICE_ADMINintent
大意: 启用这个APP,即激活设备管理器,是由触发了ACTION_ADD_DEVICE_ADMIN,才会进行的
The line intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN, mDeviceAdminSample)states that mDeviceAdminSample (which is a
DeviceAdminReceivercomponent) is the target policy.
大意:激活设备管理器的意图 ACTION_ADD_DEVICE_ADMIN 需要添加字段为 DevicePolicyManager.EXTRA_DEVICE_ADMIN 的数据来传递这个设备管理APP请求的策略有哪些,而这个mDeviceAdminSample对象,就是 DeviceAdminReceiver组件对象。所以说这个设备管理接收器即进行了监听后的回调功能,又传递了这个APP申请的策略。非常重要
代码
- java代码中完成了如果设备进行了锁屏或者解锁行为,辣么它就会回调这些函数
sampleDeviceAdminReceiver .java
public class sampleDeviceAdminReceiver extends DeviceAdminReceiver {
@Override
public void onLockTaskModeEntering(Context context, Intent intent, String pkg) {
super.onLockTaskModeEntering(context, intent, pkg);
Toast.makeText(context, "熊博士为您锁屏", Toast.LENGTH_SHORT);
}
@Override
public void onLockTaskModeExiting(Context context, Intent intent) {
super.onLockTaskModeExiting(context, intent);
Toast.makeText(context, "熊博士为您解锁屏幕", Toast.LENGTH_SHORT);
}
}
- 在清单文件中,除了激活设备管理器的action外,主要就是在元数据属性中设置了,请求一个资源文件地址,里面是APP要申请的策略
AndroidManifest.xml
<receiver android:name=".sampleDeviceAdminReceiver"
android:permission="android.permission.BIND_DEVICE_ADMIN">
<intent-filter>
<!--当用户同意该APP为设备管理器时,调用该广播-->
<action android:name="android.app.action.DEVICE_ADMIN_ENABLED" />
</intent-filter>
<meta-data android:name="android.app.device_admin"
android:resource="@xml/request_policies" />
</receiver>
request_policies.xml
<device-admin xmlns:android="http://schemas.android.com/apk/res/android">
<uses-policies>
<!--强制锁屏的策略,需要什么,在这里填,我这里只设定一个策略-->
<force-lock />
</uses-policies>
</device-admin>
- 入口活动,发送激活设备管理的意图,设置锁屏的按钮
MainActivity.java
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final ComponentName mDeviceAdminSample = new ComponentName(this, sampleDeviceAdminReceiver.class);
Intent intent = new Intent(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN);
intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN, mDeviceAdminSample);
//给系统发送一个请求激活设备管理器的意图
startActivity(intent);
Button button = (Button)findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//获取设备策略管理服务对象,来执行策略
DevicePolicyManager devicePolicyManager = (DevicePolicyManager)getSystemService(Context.DEVICE_POLICY_SERVICE);
//锁屏
devicePolicyManager.lockNow();
}
});
}
}
遇见的小问题:
- 应用图标的格式问题。我用jpg图片替换png图片作为图标编译会失败
[Answer] 可以使用类似这个https://jpg2png.com/zh/地址的jpg转png解决
官网中的例子:https://developer.android.com/guide/topics/admin/device-admin#sample