package com.ttstd.sn.mdm; import android.annotation.SuppressLint; import android.app.admin.DevicePolicyManager; import android.content.ComponentName; import android.content.Context; import android.content.pm.PackageManager; import android.os.Build; import android.text.TextUtils; import android.util.Log; import com.huawei.android.app.admin.DeviceApplicationManager; import com.huawei.android.app.admin.DeviceControlManager; import com.huawei.android.app.admin.DevicePackageManager; import com.huawei.android.app.admin.DevicePasswordManager; import com.huawei.android.app.admin.DeviceRestrictionManager; import com.huawei.android.app.admin.DeviceSettingsManager; import com.ttstd.sn.receiver.AoleDeviceAdminReceiver; import java.util.ArrayList; import java.util.List; /** * 华为 EMUI MDM 实现。 * *

依赖 hw_emui_11.0.1_20210408.jar(com.huawei.android.app.admin.*),仅存在于 emui flavor。

*/ public class AdminManager implements IMdmManager { private static final String TAG = "AdminManager[emui]"; @SuppressLint("StaticFieldLeak") private static AdminManager sInstance; private Context mContext; private ComponentName mAdminName; private DevicePolicyManager mDevicePolicyManager; /*设备应用程序管理类*/ private DeviceApplicationManager mDeviceApplicationManager; /*设备控制相关的类*/ private DeviceControlManager mDeviceControlManager; /*设备包管理类*/ private DevicePackageManager mDevicePackageManager; /*密码相关类*/ private DevicePasswordManager mDevicePasswordManager; /*禁用/启用管理类*/ private DeviceRestrictionManager mDeviceRestrictionManager; /*设置相关类*/ private DeviceSettingsManager mDeviceSettingsManager; private AdminManager(Context context) { if (context == null) { throw new RuntimeException("Context is NULL"); } this.mContext = context; this.mAdminName = new ComponentName(context, AoleDeviceAdminReceiver.class); this.mDevicePolicyManager = (DevicePolicyManager) mContext.getSystemService(Context.DEVICE_POLICY_SERVICE); this.mDeviceApplicationManager = new DeviceApplicationManager(); this.mDeviceControlManager = new DeviceControlManager(); this.mDevicePackageManager = new DevicePackageManager(); this.mDevicePasswordManager = new DevicePasswordManager(); this.mDeviceRestrictionManager = new DeviceRestrictionManager(); this.mDeviceSettingsManager = new DeviceSettingsManager(); removeTrustList(); } public static void init(Context context) { if (sInstance == null) { Log.e(TAG, "init: "); sInstance = new AdminManager(context); } } public static AdminManager getInstance() { if (sInstance == null) { throw new IllegalStateException("You must be init AdminManager first"); } return sInstance; } /*============================== 基础能力 ==============================*/ @Override public ComponentName getAdminName() { return mAdminName; } @Override public boolean isActiveMe() { if (mDevicePolicyManager == null) { return false; } else { return mDevicePolicyManager.isAdminActive(mAdminName); } } @Override public String getSerial() { String sn = ""; DevicePolicyManager dpm = (DevicePolicyManager) mContext.getSystemService(Context.DEVICE_POLICY_SERVICE); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { try { dpm.setPermissionPolicy(mAdminName, DevicePolicyManager.PERMISSION_GRANT_STATE_GRANTED); } catch (Exception e) { Log.e(TAG, "getSerial: " + e.getMessage()); } } if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { try { sn = Build.getSerial(); } catch (Exception e) { Log.e(TAG, "getSerial: " + e.getMessage()); } } // 未获取到 MDM 权限时,Build.getSerial() 可能返回 "unknown", // 此时传 "" 给接口,避免获取到不属于本设备的配置 if ("unknown".equalsIgnoreCase(sn)) { sn = ""; } return sn; } /*============================== 应用管理 ==============================*/ /** * 添加阻止某应用启动运行名单(DeviceApplicationManager) */ @Override public void addDisallowedRunningApp(String pkg) { if (TextUtils.isEmpty(pkg)) return; List packageList = new ArrayList<>(); packageList.add(pkg); try { mDeviceApplicationManager.addDisallowedRunningApp(mAdminName, packageList); } catch (Exception e) { Log.e(TAG, "addDisallowedRunningApp: " + e.getMessage()); } } /** * 删除阻止某应用启动运行名单(DeviceApplicationManager) */ @Override public void removeDisallowedRunningApp(String pkg) { if (TextUtils.isEmpty(pkg)) return; List stringList = new ArrayList<>(); stringList.add(pkg); try { mDeviceApplicationManager.removeDisallowedRunningApp(mAdminName, stringList); } catch (Exception e) { Log.e(TAG, "removeDisallowedRunningApp: " + e.getMessage()); } } /*============================== 系统限制 ==============================*/ @Override public void setMultiWindowDisabled(boolean disabled) { try { mDeviceRestrictionManager.setMultiWindowDisabled(mAdminName, disabled); } catch (Exception e) { Log.e(TAG, "setMultiWindowDisabled: " + e.getMessage()); } } @Override public boolean isMultiWindowDisabled() { try { return mDeviceRestrictionManager.isMultiWindowDisabled(mAdminName); } catch (Exception e) { Log.e(TAG, "isMultiWindowDisabled: " + e.getMessage()); } return false; } @Override public void setVoiceAssistantButtonDisabled(boolean disabled) { try { mDeviceRestrictionManager.setVoiceAssistantButtonDisabled(mAdminName, disabled); } catch (Exception e) { Log.e(TAG, "setVoiceAssistantButtonDisabled: " + e.getMessage()); } } @Override public boolean isVoiceAssistantButtonDisabled() { try { return mDeviceRestrictionManager.isVoiceAssistantButtonDisabled(mAdminName); } catch (Exception e) { Log.e(TAG, "isVoiceAssistantButtonDisabled: " + e.getMessage()); } return false; } @Override public void setUSBDataDisabled(boolean disabled) { try { mDeviceRestrictionManager.setUSBDataDisabled(mAdminName, disabled); } catch (Exception e) { Log.e(TAG, "setUSBDataDisabled: " + e.getMessage()); } } @Override public boolean isUSBDataDisabled() { try { return mDeviceRestrictionManager.isUSBDataDisabled(mAdminName); } catch (Exception e) { Log.e(TAG, "isUSBDataDisabled: " + e.getMessage()); return false; } } /*============================== 设备设置 ==============================*/ @Override public boolean setRestoreFactoryDisabled(boolean disabled) { try { return mDeviceSettingsManager.setRestoreFactoryDisabled(mAdminName, disabled); } catch (Exception e) { Log.e(TAG, "setRestoreFactoryDisabled: " + e.getMessage()); } return false; } @Override public boolean isRestoreFactoryDisabled() { try { return mDeviceSettingsManager.isRestoreFactoryDisabled(mAdminName); } catch (Exception e) { Log.e(TAG, "isRestoreFactoryDisabled: " + e.getMessage()); } return false; } /*============================== 快捷工具 ==============================*/ @Override public void setQuickToolsDisabled(boolean disabled) { try { mDevicePasswordManager.setQuickToolsDisabled(mAdminName, disabled); } catch (Exception e) { Log.e(TAG, "setQuickToolsDisabled: " + e.getMessage()); } } @Override public boolean isQuickToolsDisabled() { try { return mDevicePasswordManager.isQuickToolsDisabled(mAdminName); } catch (Exception e) { Log.e(TAG, "isQuickToolsDisabled: " + e.getMessage()); } return false; } /*============================== 设备控制 ==============================*/ @Override public void turnOnUsbDebugMode(boolean on) { try { mDeviceControlManager.turnOnUsbDebugMode(mAdminName, on); } catch (Exception e) { Log.e(TAG, "turnOnUsbDebugMode: " + e.getMessage()); } } @Override public void setForcedActiveDeviceAdmin(Context activity) { try { mDeviceControlManager.setForcedActiveDeviceAdmin(mAdminName, activity); } catch (Exception e) { Log.e(TAG, "setForcedActiveDeviceAdmin: " + e.getMessage()); } } @Override public void removeActiveDeviceAdmin() { try { mDeviceControlManager.removeActiveDeviceAdmin(mAdminName); } catch (Exception e) { Log.e(TAG, "removeActiveDeviceAdmin: " + e.getMessage()); } } @Override public void clearDeviceOwnerApp() { try { mDeviceControlManager.clearDeviceOwnerApp(); } catch (Exception e) { Log.e(TAG, "clearDeviceOwnerApp: " + e.getMessage()); } } @Override public boolean isForcedActiveDeviceAdmin() { try { return mDeviceControlManager.isForcedActiveDeviceAdmin(mAdminName); } catch (Exception e) { Log.e(TAG, "isForcedActiveDeviceAdmin: " + e.getMessage()); } return false; } /*============================== 平台差异 ==============================*/ /** * 禁用/启用 YOYO 助手(EMUI 平台映射为 HiVoice 语音助手) */ @Override public void setYoyoDisabled(boolean disable) { Log.e(TAG, "setYoyoDisabled: " + disable + " (emui use voice assistant)"); setVoiceAssistantButtonDisabled(disable); } /*============================== EMUI 特有能力 ==============================*/ /** * 静默激活设备管理员(DeviceControlManager) */ public void setSilentActiveAdmin() { try { mDeviceControlManager.setSilentActiveAdmin(mAdminName); } catch (Exception e) { Log.e(TAG, "setSilentActiveAdmin: " + e.getMessage()); } } /** * 设置管控模式(DeviceControlManager) * * @param mode {@link DeviceControlManager#CONTROL_MODE} 或 {@link DeviceControlManager#RELEASE_MODE} */ public boolean setControlMode(int mode) { try { return mDeviceControlManager.setControlMode(mAdminName, mode); } catch (Exception e) { Log.e(TAG, "setControlMode: " + e.getMessage()); } return false; } /** * 获取当前管控模式(DeviceControlManager) */ public int getControlMode() { try { return mDeviceControlManager.getControlMode(mAdminName); } catch (Exception e) { Log.e(TAG, "getControlMode: " + e.getMessage()); } return DeviceControlManager.NORMAL_MODE; } /** * 开启/关闭护眼模式(DeviceControlManager) */ public boolean turnOnEyeComfort(boolean on) { try { return mDeviceControlManager.turnOnEyeComfort(mAdminName, on); } catch (Exception e) { Log.e(TAG, "turnOnEyeComfort: " + e.getMessage()); } return false; } /** * 查询护眼模式是否开启(DeviceControlManager) */ public boolean isEyeComfortTurnedOn() { try { return mDeviceControlManager.isEyeComfortTurnedOn(mAdminName); } catch (Exception e) { Log.e(TAG, "isEyeComfortTurnedOn: " + e.getMessage()); } return false; } /*============================== 初始化辅助 ==============================*/ /** * 移除安装白名单(构造时调用,清理历史白名单配置) */ public void removeTrustList() { try { List trustList = mDevicePackageManager.getInstallPackageWhiteList(mAdminName); Log.e(TAG, "removeTrustList: " + trustList); if (trustList != null && trustList.size() != 0) { mDevicePackageManager.removeInstallPackageWhiteList(mAdminName, trustList); } } catch (Exception e) { Log.e(TAG, "removeTrustList: " + e.getMessage()); } } /** * 判断应用是否已安装 */ private boolean isAvailable(Context context, String pkg) { if (TextUtils.isEmpty(pkg)) return false; try { PackageManager pm = context.getPackageManager(); pm.getPackageInfo(pkg, 0); return true; } catch (PackageManager.NameNotFoundException e) { return false; } catch (Exception e) { return false; } } }