面试题目:利用Android DeviceOwner API实现禁用设备的应用安装(用adb或文件管理器都无法安装应用)。
答:
第一步:创建MyDeviceAdminReceiver,继承DeviceAdminReceiver
第二步:在res/xml目录下新建device_admin.xml文件;
<?xml version="1.0" encoding="utf-8"?>
<device-admin
xmlns:android="http://schemas.android.com/apk/res/android">
<uses-policies>
</uses-policies>
</device-admin>
第三步:注册一个广播继承DeviceAdminReceiver
import android.app.admin.DeviceAdminReceiver;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;
public class MyDeviceAdminReceiver extends DeviceAdminReceiver {
@Override
public void onEnabled(Context context, Intent intent) {
super.onEnabled(context, intent);
Log.e(">>>>>>>>>", "onEnabled");
}
@Override
public void onReceive(Context context, Intent intent) {
super.onReceive(context, intent);
Log.e(">>>>>>>>>", "onReceive");
}
@Override
public CharSequence onDisableRequested(Context context, Intent intent) {
//这里如果返回的字符串不为空,那么当用户去设置里取消时,则会提示带此文字的确定框
String strResult = "取消时便不能使用免root停用应用";
Log.e(">>>>>>>>>", "onDisableRequested");
return strResult;
}
@Override
public void onDisabled(Context context, Intent intent) {
Log.e(">>>>>>>>>", "onDisabled");
super.onDisabled(context, intent);
}
}
第四步:在清单文件里注册广播
<receiver
android:name=".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" />
<action android:name="android.app.action.DEVICE_ADMIN_DISABLE_REQUESTED" />
<action android:name="android.app.action.DEVICE_ADMIN_DISABLED" />
</intent-filter>
</receiver>
第五步:激活设备管理器
if (!devicePolicyManager.isAdminActive(componentName)) {
Intent intent = new Intent(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN);
intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN, componentName);
intent.putExtra(DevicePolicyManager.EXTRA_ADD_EXPLANATION, "激活此设备管理员后可免root停用应用");
startActivityForResult(intent, 1);
} else {
Toast.makeText(this, "此App已激活设备管理器", Toast.LENGTH_SHORT).show();
}
第六步:成为DeviceOwner(执行成功后返回Success: Device owner set to package com.example.guojunke.elm
Active admin set to component {com.example.guojunke.elm/com.example.guojunke.elm.MyDeviceAdminReceiver})
adb shell dpm set-device-owner com.example.guojunke.elm/com.example.guojunke.elm.MyDeviceAdminReceiver
第七步:使用DevicePolicyManager的addUserRestriction方法可以添加用户限制
devicePolicyManager.addUserRestriction(componentName, UserManager.DISALLOW_INSTALL_APPS);
第八步:测试程序是否还可以安装上去
我们可以看到已经禁止用户进行apk安装了!!!大功告成
第九步:退出Android DeviceOwner
adb shell dpm remove-active-admin com.example.guojunke.elm/com.example.guojunke.elm.MyDeviceAdminReceiver