检查是否已存在工作资料,谁拥有工作资料以及资源是否处于活动状态

时间:2018-06-13 10:42:10

标签: android android-for-work

我需要的是相当简单的,而且非常令人沮丧的是, Android for Work API似乎并不能提供开箱即用的功能。

我正在尝试创建一个 Android DPC 应用来拥有和管理工作资料。 (不是设备所有者)。 配置工作配置文件时,您将获得两个应用程序实例。一个标记在Work Profile下运行,另一个 unbadged 在Primary Profile下运行。 enter image description here

我想找出三件事:

  • 工作资料是否已在设备上配置?
  • 如果是这样,我的应用程序是否拥有该个人资料?如果不是哪个应用程序呢?
  • 工作资料是否有效?

原因是,即使在谷歌自己的示例应用程序(见图)中,即使已有工作资料且应用程序实际上是所有者,它也不会尝试建立此并启动资源调配!

2 个答案:

答案 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)

  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