4

我需要的东西感觉相当简单,而且令人沮丧的是,Android for Work API 似乎没有提供开箱即用的功能。

我正在尝试创建一个Android DPC应用来拥有和管理工作资料。(不是设备所有者)。配置工作配置文件时,您会获得两个应用程序实例。一个标记在工作配置文件下运行,另一个未标记在主要配置文件下运行。 在此处输入图像描述

我试图找出三件事:

  • 设备上是否已配置工作配置文件?
  • 如果是这样,是我的应用程序拥有个人资料吗?如果不是,哪个应用程序可以?
  • 工作资料是否处于活动状态?

原因是,即使在 Google 自己的示例应用程序(见图)中,它也不会尝试建立它并启动配置,即使已经存在工作配置文件并且应用程序实际上是所有者!

4

2 回答 2

4

设备上是否已配置工作配置文件?
如果是这样,是我的应用程序拥有个人资料吗?如果不是,哪个应用程序可以?

此代码在主要用户下运行时将起作用。主要用户的个人资料所有者将是工作资料。如果您的应用程序拥有它,它将记录您自己的包。

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;
    }
}
于 2018-06-15T05:06:10.787 回答
1
  1. 创建一个带有特殊意图过滤器的活动并设置android:enabled="false". 覆盖onCreate以设置结果,然后立即完成。
  2. 在您的 实现中DeviceAdminReceiver::onProfileProvisioningComplete,启用您的特殊活动PackageManager::setComponentEnabledSetting并添加一个跨配置文件意图过滤器,以便可以从主要配置文件中调用它。
  3. 当您的主要活动打开时:
    1. 如果DeviceProfileManager::isProfileOwnerApp返回 true,则您正在您的托管配置文件中运行。
    2. 否则,用于startActivityForResult启动与您的跨配置文件意图过滤器匹配的意图。用于Intent::setPackage确保只有您的包可以响应它。
    3. 如果startActivityForResult引发异常,则未设置您的托管配置文件。如果UserManager::getUserProfiles只返回一个配置文件,则不会设置托管配置文件;否则,将设置其他应用程序的托管配置文件。
    4. 如果您的托管配置文件已设置,您将收到一个电话,要求您onActivityResult包含您发送给自己的任何数据,例如UserHandle托管配置文件的数据。
于 2019-05-14T01:03:38.930 回答