不想看文档可以直接拉到后面,代码将在后面贴出
System administrators can use the Device Administration API to write an application that enforces(实施v) remote/local device security policy enforcement(实施n). This section(章节) summarizes(总结) the steps involved in creating a device administration application.
系统管理员可以使用设备管理API去编写一个可以执行远程或者本地设备安全策略实施的应用程序,本章节总结了创建一个设备管理应用所涉及的步骤
创建manifest文件
To use the Device Administration API, the application's manifest must include the following:
使用设备管理API的应用程序的manifest文件必须包含以下内容:
一个继承了DeviceAdminReceive的子类需包含以下内容
A subclass of DeviceAdminReceiver
that includes the following:
The BIND_DEVICE_ADMIN
permission.需要BIND_DEVICE_ADMIN权限
The ability to respond to the ACTION_DEVICE_ADMIN_ENABLED
intent, expressed in the manifest as an intent filter.
需在manifest文件中声明 intent filter 使其能够对ACTION_DEVICE_ADMIN_ENABLED的意图做出回应
A declaration of security policies used in metadata.
在声明中包含安全策略的元数据
Here is an excerpt from the Device Administration sample manifest:
这是来自设备管理例子的manifest文件,可作为参考
<activity android:name=".app.DeviceAdminSample" android:label="@string/activity_sample_device_admin"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.SAMPLE_CODE" /> </intent-filter> </activity> <receiver android:name=".app.DeviceAdminSample$DeviceAdminSampleReceiver" android:label="@string/sample_device_admin" android:description="@string/sample_device_admin_description" android:permission="android.permission.BIND_DEVICE_ADMIN"> <meta-data android:name="android.app.device_admin" android:resource="@xml/device_admin_sample" /> <intent-filter> <action android:name="android.app.action.DEVICE_ADMIN_ENABLED" /> </intent-filter> </receiver>
Note that:
The following attributes refer to string resources that for the sample application reside inApiDemos/res/values/strings.xml
. For more information about resources, see
Application Resources.
以下属性可参考例子程序中的ApiDemos/res/values/strings.xml
. 字符资源文件,更多详细信息请查看Application Resources.
android:label="@string/activity_sample_device_admin"
refers to the user-readable label for the activity.
android:label="@string/sample_device_admin"
refers to the user-readable label for the permission.
android:description="@string/sample_device_admin_description"
refers to the user-readable description of the permission. A descripton is typically longer and more informative than a label.
android:permission="android.permission.BIND_DEVICE_ADMIN"
is a permission that aDeviceAdminReceiver
subclass must have, to ensure that only the system can interact with the receiver (no application can be granted this permission ). This prevents other applications from abusing your device admin app.
必须有一个receiver类型的子类,只有其能够与系统交互(没有应用可以被授予该权限)这样阻止了其他程序滥用你的设备管理app
android.app.action.DEVICE_ADMIN_ENABLED
is the primary action that a DeviceAdminReceiver
subclass must handle to be allowed to manage a device. This is set to the receiver when the user enables the device admin app. Your code typically handles this in onEnabled()
. To be supported, the receiver must also require the BIND_DEVICE_ADMIN
permission so that other applications cannot abuse it.
继承DeviceAdminReceiver的子类
DeviceAdminReceiver是一个主要的action,该子类必须被允许去操作设置管理程序。设置一个receiver去接受在用户操作设备管理程序时返回的数据。你的代码通常在
onEnabled()内进行操作,receiver避居具备
BIND_DEVICE_ADMIN权限的支持,增加权限的目的是以便其他程序不能滥用它
When a user enables the device admin application, that gives the receiver permission to perform actions in response to the broadcast of particular system events. When suitable event arises, the application can impose a policy. For example, if the user attempts to set a new password that doesn't meet the policy requirements, the application can prompt the user to pick a different password that does meet the requirements.
当一个用户使用设备管理程序的同时也就给予了receiver一定的权限去执行操作来响应特定的系统时间的广播,在适当的事件发生时,该程序可以执行一个策略,例如:如果用户尝试去设置一个新的不符合策略要求的密码,该程序可以提示用户去选择一个满足要求的密码
android:resource="@xml/device_admin_sample"
declares the security policies used in metadata. The metadata provides additional information specific to the device administrator, as parsed by theDeviceAdminInfo
class. Here are the contents of device_admin_sample.xml
:
声明中使用的安全策略的元数据提供了特定于设备管理员的附加信息,可通过DeviceAdminInfo类进行解析查看,以下为device_admin_sample.xml
:的内容
<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 /> </uses-policies> </device-admin>
In designing your device administration application, you don't need to include all of the policies, just the ones that are relevant for your app.
在设计你的设备管理程序时,你不需要加入所有的策略,只需要加入与你的程序有关的即可。
For more discussion of the manifest file, see the Android Developers Guide.
对于manifest文件更多的讨论可以查看Android Developers Guide.
实现代码部分
The Device Administration API includes the following classes:
设备管理API包含以下类
DeviceAdminReceiver
Base class for implementing a device administration component. This class provides a convenience for interpreting the raw intent actions that are sent by the system. Your Device Administration application must include a DeviceAdminReceiver
subclass.
该类为实现一个设备管理组件的基本类,这个类提供了一个方便去解析系统发送的原始意图的行为,你的设备管理程序必须包含一个DeviceAdminReceiver的子类
DevicePolicyManager
A class for managing policies enforced on a device. Most clients of this class must have published aDeviceAdminReceiver
that the user has currently enabled. The DevicePolicyManager
manages policies for one or more DeviceAdminReceiver
instances
在设备上管理策略实施的一个类,正在使用该类的大多数类必须有一个公开的DeviceAdminReceiver。
DevicePolicyManager管理一个或者多个的
DeviceAdminReceiver的策略
DeviceAdminInfo
This class is used to specify metadata for a device administrator component.
这个类通常是为设备管理员组件制定元数据
These classes provide the foundation for a fully functional device administration application. The rest of this section describes how you use the DeviceAdminReceiver
and DevicePolicyManager
APIs to write a device admin application.
这些类为设备管理程序提供了功能齐全的功能函数。后面的部分藐视了如何使用DeviceAdminReceiver和
DevicePolicyManager API去写一个设备管理程序
To create a device admin application, you must subclass DeviceAdminReceiver
. The DeviceAdminReceiver
class consists of a series of callbacks that are triggered when particular events occur.
创建一个设备管理程序,你必须有一个DeviceAdminReceiver的子类,
DeviceAdminReceiver包含了一系列的回调函数在特别的事件发生时触发
In its DeviceAdminReceiver
subclass, the sample application simply displays a Toast
notification in response to particular events. For example:
在DeviceAdminReceiver子类中,这示例程序简单的展示了一个响应特定事件的Toast 通知
public class DeviceAdminSample extends DeviceAdminReceiver { void showToast(Context context, String msg) { String status = context.getString(R.string.admin_receiver_status, msg); Toast.makeText(context, status, Toast.LENGTH_SHORT).show(); } @Override public void onEnabled(Context context, Intent intent) { showToast(context, context.getString(R.string.admin_receiver_status_enabled)); } @Override public CharSequence onDisableRequested(Context context, Intent intent) { return context.getString(R.string.admin_receiver_status_disable_warning); } @Override public void onDisabled(Context context, Intent intent) { showToast(context, context.getString(R.string.admin_receiver_status_disabled)); } @Override public void onPasswordChanged(Context context, Intent intent) { showToast(context, context.getString(R.string.admin_receiver_status_pw_changed)); } ... }
授权程序
One of the major events a device admin application has to handle is the user enabling the application. The user must explicitly enable the application for the policies to be enforced. If the user chooses not to enable the application it will still be present on the device, but its policies will not be enforced, and the user will not get any of the application's benefits.
一个设备管理程序的主要事件是必须处理用户的授权程序,用户必须显示地操作授予权限的程序,
如果用户选择不授予该权限,该程序仍然能够继续在设备上执行,但是该需要权限的部分将不被执行。
The process of enabling the application begins when the user performs an action that triggers theACTION_ADD_DEVICE_ADMIN
intent. In the sample application, this happens when the user clicks the Enable Admin checkbox.
在用户执行该程序时,授权程序将被执行,此时将触发ACTION_ADD_DEVICE_ADMIN意图,在该示例程序中当用户点击EnableAdmin 选择框时将被执行
When the user clicks the Enable Admin checkbox, the display changes to prompt the user to activate the device admin application, as shown in figure 2.
Figure 2. Sample Application: Activating the Application
Below is the code that gets executed when the user clicks the Enable Admin checkbox. This has the effect of triggering the onPreferenceChange()
callback. This callback is invoked when the value of this Preference
has been changed by the user and is about to be set and/or persisted. If the user is enabling the application, the display changes to prompt the user to activate the device admin application, as shown in figure 2. Otherwise, the device admin application is disabled.
@Override public boolean onPreferenceChange(Preference preference, Object newValue) { if (super.onPreferenceChange(preference, newValue)) { return true; } boolean value = (Boolean) newValue; if (preference == mEnableCheckbox) { if (value != mAdminActive) { if (value) { // Launch the activity to have the user enable our admin. Intent intent = new Intent(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN); intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN, mDeviceAdminSample); intent.putExtra(DevicePolicyManager.EXTRA_ADD_EXPLANATION, mActivity.getString(R.string.add_admin_extra_app_text)); startActivityForResult(intent, REQUEST_CODE_ENABLE_ADMIN); // return false - don't update checkbox until we're really active return false; } else { mDPM.removeActiveAdmin(mDeviceAdminSample); enableDeviceCapabilitiesArea(false); mAdminActive = false; } } } else if (preference == mDisableCameraCheckbox) { mDPM.setCameraDisabled(mDeviceAdminSample, value); ... } return true; }
The line intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN, mDeviceAdminSample)
states thatmDeviceAdminSample
(which is a DeviceAdminReceiver
component) is the target policy. This line invokes the user interface shown in figure 2, which guides users through adding the device administrator to the system (or allows them to reject it).
When the application needs to perform an operation that is contingent on the device admin application being enabled, it confirms that the application is active. To do this it uses the DevicePolicyManager
methodisAdminActive()
. Notice that the DevicePolicyManager
method isAdminActive()
takes aDeviceAdminReceiver
component as its argument:
DevicePolicyManager mDPM; ... private boolean isActiveAdmin() { return mDPM.isAdminActive(mDeviceAdminSample); }
好了,直接贴代码:
第一步:根据文档
创建子类
package com.zaizai.locksreen; import android.app.admin.DeviceAdminReceiver; /** * Created by zaizai on 2015/11/3. */ public class MyAdmin extends DeviceAdminReceiver { }
在manifest文件中声明
<receiver android:name=".MyAdmin"> android:label="@string/用户管理员" android:description="@string/用户管理员描述信息" android:permission="android.permission.BIND_DEVICE_ADMIN"> <meta-data android:name="android.app.device_admin" android:resource="@xml/device_admin_sample" /> <intent-filter> <action android:name="android.app.action.DEVICE_ADMIN_ENABLED" /> </intent-filter> </receiver>
在activity文件中使用
package com.zaizai.locksreen; import android.app.admin.DevicePolicyManager; import android.content.ComponentName; import android.content.Intent; import android.net.Uri; import android.os.Bundle; import android.support.design.widget.FloatingActionButton; import android.support.design.widget.Snackbar; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.Toolbar; import android.view.View; import android.view.Menu; import android.view.MenuItem; import android.widget.Toast; public class MainActivity extends AppCompatActivity { /** * 设备策略服务 */ private DevicePolicyManager dpm; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(toolbar); FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab); fab.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG) .setAction("Action", null).show(); } }); dpm = (DevicePolicyManager) getSystemService(DEVICE_POLICY_SERVICE); } public void lockScreen(View view) { ComponentName cn = new ComponentName(this, MyAdmin.class); if(dpm.isAdminActive(cn)){ //设备管理员的api dpm.resetPassword("", 0); dpm.lockNow(); // dpm.wipeData(0); // dpm.wipeData(DevicePolicyManager.WIPE_EXTERNAL_STORAGE);//删除sdcard数据 }else{ // openAdmin(null); Toast.makeText(this, "请先激活管理员",Toast.LENGTH_LONG).show(); } /*设置屏幕密码*/ //dpm.resetPassword("123",0); /*清楚数据*/ //dpm.wipeData(DevicePolicyManager.WIPE_EXTERNAL_STORAGE); /*恢复出厂设置*/ //dpm.wipeData(0); } /** * 用代码开启管理员权限 * * @param view */ public void openAdmin(View view) { /*创建添加设备管理员的意图*/ Intent intent = new Intent(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN); /*设置需要激活的组件*/ ComponentName mDeviceAdminSample = new ComponentName(this, MyAdmin.class); intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN, mDeviceAdminSample); /*给用户提示。给出开启的理由*/ intent.putExtra(DevicePolicyManager.EXTRA_ADD_EXPLANATION, "开启即可实现一键锁屏"); startActivity(intent); } /** * 卸载当前软件 * * @param view */ public void uninstall(View view) { /*1、先清除管理员权限*/ ComponentName mDeviceAdminSample = new ComponentName(this, MyAdmin.class); dpm.removeActiveAdmin(mDeviceAdminSample); /*2、普通应用卸载*/ Intent intent = new Intent(); intent.setAction("android.intent.action.UNINSTALL_PACKAGE"); intent.addCategory("android.intent.category.DEFAULT"); intent.setData(Uri.parse("package:" + getPackageName())); startActivity(intent); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.menu_main, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { // Handle action bar item clicks here. The action bar will // automatically handle clicks on the Home/Up button, so long // as you specify a parent activity in AndroidManifest.xml. int id = item.getItemId(); //noinspection SimplifiableIfStatement if (id == R.id.action_settings) { return true; } return super.onOptionsItemSelected(item); } }