我需要的是相当简单的,而且非常令人沮丧的是, Android for Work API似乎并不能提供开箱即用的功能。
我正在尝试创建一个 Android DPC 应用来拥有和管理工作资料。 (不是设备所有者)。 配置工作配置文件时,您将获得两个应用程序实例。一个标记在Work Profile下运行,另一个 unbadged 在Primary Profile下运行。
我想找出三件事:
原因是,即使在谷歌自己的示例应用程序(见图)中,即使已有工作资料且应用程序实际上是所有者,它也不会尝试建立此并启动资源调配!
答案 0 :(得分:2)
工作档案是否已在设备上配置?
如果是这样,我的应用程序是否拥有该配置文件?如果不是哪个应用程序?
在主要用户下运行时,此代码将起作用。主要用户的配置文件所有者将是工作配置文件。如果您的应用拥有它,它将记录您自己的包。
DevicePolicyManager manager =
(DevicePolicyManager) context.getSystemService(Context.DEVICE_POLICY_SERVICE);
List<ComponentName> activeAdmins = manager.getActiveAdmins();
if (activeAdmins != null){
for (ComponentName admin : activeAdmins){
String packageName = admin.getPackageName();
if (manager.isProfileOwnerApp(packageName)){
Log.d(TAG, "Work Profile is: " + packageName);
}
}
}
如果您只是想检查您的应用是否是应用内的个人资料所有者,请使用此功能。
manager.isProfileOwnerApp(getApplicationContext().getPackage());
工作资料是否有效?
如果isProfileOwnerApp()为主用户下的任何包返回true,则工作配置文件处于活动状态并由该包拥有。
也可以在支持多用户的设备上为辅助用户配置配置文件所有者,但我还没有看到EMM实现此功能。设备所有者需要将您的包的组件指定为次要用户的个人资料所有者,因此可以安全地说不会发生这种情况。但如果是这样,您的应用应该像工作资料一样工作,但在辅助用户的上下文中作为托管资料。
*编辑(6/15/18)* :
我在Android O设备上测试了您的场景,但我没有得到相同的行为。在从TestDPC配置工作配置文件后,TestDPC检测到已配置托管配置文件,并且不允许我再次配置。
您正在开发什么版本的Android?
我挖掘了TestDPC并找到了一些代码,针对您的方案进行了修改,可能对您有所帮助。不幸的是,对于Android M及以下版本,TestDPC不会检测到该设备已经配置了工作资料,并且只会再次尝试。此外,我还没有找到方法来检测该个人资料所有者是谁,您的应用或其他应用。但我希望这有帮助!
/**
* @param context Calling activity's context
* @return true, if work profile provisioning is allowed
*/
@TargetApi(Build.VERSION_CODES.N)
public static boolean isProvisioningAllowed(Context context) {
if (BuildCompat.isAtLeastN()) {
DevicePolicyManager dpm = (DevicePolicyManager) context
.getSystemService(Context.DEVICE_POLICY_SERVICE);
return dpm.isProvisioningAllowed(ACTION_PROVISION_MANAGED_DEVICE);
}
else {
return true;
}
}
答案 1 :(得分:0)
android:enabled="false"
。覆盖onCreate
以便设置结果,然后立即完成。DeviceAdminReceiver::onProfileProvisioningComplete
的实现中,使用PackageManager::setComponentEnabledSetting
启用特殊活动,并添加跨配置文件意图过滤器,以便可以从主配置文件中调用它。DeviceProfileManager::isProfileOwnerApp
返回true,则说明您正在运行托管配置文件。startActivityForResult
启动与您的跨个人资料意图过滤器匹配的意图。使用Intent::setPackage
确保只有您的包裹才能响应。startActivityForResult
引发异常,则未设置您的托管配置文件。如果UserManager::getUserProfiles
仅返回一个配置文件,则未设置托管配置文件;否则,将设置其他应用程序的托管配置文件。onActivityResult
,其中包括您发送给自己的所有数据,例如托管个人资料的UserHandle
。