解决方案是使用:Device Administration API
设备管理 API 专为企业应用程序设计。此 API 提供系统级别的管理功能。
那么它是如何工作的?
您使用设备管理 API 编写用户安装在其设备上的设备管理应用程序。设备管理应用程序强制执行所需的策略。以下是它的工作原理:
如果用户未启用设备管理应用,它会保留在设备上,但处于非活动状态。用户将不受其政策的约束,相反,他们也不会获得应用程序的任何好处——例如,他们可能无法同步数据。
如果用户未能遵守政策(例如,如果用户设置了违反准则的密码),则由应用程序决定如何处理。但是,这通常会导致用户无法同步数据。
如果设备尝试连接到需要设备管理 API 不支持的策略的服务器,则该连接将不被允许。设备管理 API 当前不允许部分配置。换句话说,如果设备(例如,旧设备)不支持所有规定的策略,则无法允许设备连接。
如果设备包含多个启用的管理应用程序,则执行最严格的政策。无法针对特定的管理应用程序。
要卸载现有的设备管理应用程序,用户需要先以管理员身份注销该应用程序。
这是一个实现相同的示例代码:
import java.util.List;
import android.os.Bundle;
import android.app.Activity;
import android.app.admin.DevicePolicyManager;
import android.content.ComponentName;
import android.content.Context;
import android.util.Log;
import android.view.Menu;
public class ActiveDevicePolicy extends Activity {
private DevicePolicyManager activeDevicePolicyManager;
private final String LOG_TAG = "ActiveDevicePolicy";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_active_device_policy);
activeDevicePolicyManager = (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE);
List<ComponentName> activeAdmins = activeDevicePolicyManager.getActiveAdmins();
if(activeAdmins != null && !activeAdmins.isEmpty()){
for(int index = 0; index < activeAdmins.size(); index++ ){
Log.i(LOG_TAG, "flattenToShortString: "+ activeAdmins.get(index).flattenToShortString());
Log.i(LOG_TAG, "flattenToString: "+ activeAdmins.get(index).flattenToString());
Log.i(LOG_TAG, "getClassName: "+ activeAdmins.get(index).getClassName());
Log.i(LOG_TAG, "getPackageName: "+ activeAdmins.get(index).getPackageName());
Log.i(LOG_TAG, "getShortClassName: "+ activeAdmins.get(index).getShortClassName());
Log.i(LOG_TAG, "toShortString: "+ activeAdmins.get(index).toShortString());
}
} else {
Log.i(LOG_TAG, "No Active Device Policy Manager");
}
}
}
在上面的代码中,我调用了DevicePolicyManager.getActiveAdmins() 方法来检索当前处于活动状态的所有管理员的列表。现在有趣的部分是,因为它返回一个列表;该列表中可能有多个设备管理员。所以最严格的政策仍然有效!
希望对你有帮助!