基本示例

本部分介绍如何在 。这样,您就能熟悉 SDK 以其为基础构建的实现。我们推荐您积极关注 开发应用

使用工作资料设置测试设备

Google 构建了 Test DPC 应用,以帮助您模拟和测试受管理设备 运行环境它会设置工作资料并向您提供 其中包含用于启用或停用设备上某些功能的控件。

  • 安装 Test DPC 应用

    打开 Google Play 商店并下载 Test DPC 应用。

  • 设置工作资料

    应用安装完成后,您应该会在设备上看到两个图标, 设置图标和 Test DPC 应用图标。点按设置图标,然后按照 步骤。

现在,您有两份单独的资料,一份用于个人应用,一份用于工作应用。 您可以通过应用列表顶部的标签页在它们之间切换。

个人/工作
个人资料

安装您的应用时,它通常会在 个人资料。如果您需要将其明确安装到工作资料中 可以将 --user 参数与 adb install 结合使用。

$ adb install --user [id number of profile] [path of apk file]

有关设置测试设备的详细信息,请访问此 链接。

确保您的应用配置正确

启用 java 8 支持 并确保您的 minSdk 至少为 19。

添加 Gradle 依赖项

dependencies {
  annotationProcessor
'com.google.android.enterprise.connectedapps:connectedapps-processor:1.1.2'
  implementation
'com.google.android.enterprise.connectedapps:connectedapps:1.1.2'
  implementation
'com.google.android.enterprise.connectedapps:connectedapps-annotations:1.1.2'
}

在本示例中,我们使用 Guava。这不是使用 SDK 的必要条件, 以及 Hello World api("com.google.guava:guava:29.0-android")

创建一个将包含测试跨资料调用的新类

为了让它在以后变得更加实用,应该将其放入 希望拨入您真正的跨资料通话。

public class HelloWorld {

  @CrossProfile
  public ListenableFuture<String> helloWorld() {
    return Futures.immediateFuture("Hello world");
  }
}

如果您无法依赖 Guava for Futures 支持服务,请暂时按照我们的说明操作 然后查看最后一步,也就是要做出哪些更改

进行跨资料调用

您可以在需要进行真实跨资料调用的类中执行此操作 。

// TODO: inject/pass these into the class later instead.
CrossProfileConnector crossProfileConnector =
  CrossProfileConnector.builder(this).build();
ProfileHelloWorld profileHelloWorld =
  ProfileHelloWorld.create(crossProfileConnector);

ListenableFuture<Map<Profile, String>> resultsFuture =
  profileHelloWorld.both().helloWorld();

FluentFuture.from(resultsFuture)
  .addCallback(new FutureCallback<Map<Profile, String>>() {
    @Override
    public void onSuccess(Map<Profile, String> results) {
      for (Profile profile : results.keySet()) {
        Log.w("tag", "CROSS_PROFILE profile: " + profile.asInt()
          +   "; result: " + results.get(profile));
      }
    }
    @Override
    public void onFailure(Throwable t) {
      Log.e(TAG, "Failed to say hello world on both profiles", t);
    }
  }, directExecutor());

向 SDK 提供实例

当然,前面提到的 helloWorld 方法调用针对的是生成的 而不是实际的类别。通常,真实类是单例或其他 依赖于依赖项注入框架的复杂类,例如 Dagger。接收者 允许在另一个配置文件上对实际类调用逻辑,每个自定义 @CrossProfile 类的 @CrossProfileProvider 类。创建此类。

public class HelloWorldProvider {

  @CrossProfileProvider
  public HelloWorld getHelloWorld() {
    return new HelloWorld();
  }
}

其他布线

支持自定义类和方法所需的代码生成要求 只需少量额外布线即可。这是为了处理 大量构建目标和可见性要求。

首先,为现有的或新的高级类添加注解 @CrossProfileConfiguration,指向您的提供程序类。

@CrossProfileConfiguration(providers = HelloWorldProvider.class)
abstract class HelloWorldConfiguration {}

接着,将自动生成的服务添加到清单中 <application> tag。在您构建项目之前,此问题可能无法解决。

<service
android:name="com.google.android.enterprise.connectedapps.CrossProfileConnector_Service"
android:exported="false"/>

最后,出于开发目的,请为自己提供 INTERACT_ACROSS_USERS 权限。如果您还没有此 ID,则无法将其保留 但它是最简单的入门方法。首先,将其添加到 如下所示:

<uses-permission
      android:name="android.permission.INTERACT_ACROSS_USERS"
      tools:ignore="ProtectedPermissions"/>

然后,您可以从命令行使用 adb 向自己授予该权限,如下所示 (如果您的应用尚未安装该模块):

adb shell pm grant <your package> android.permission.INTERACT_ACROSS_USERS

如果您无法依赖 Guava for Futures, 更改。首先,返回“Hello World”并输出结果 进行跨资料调用其次,由于这些调用现在是同步的 您应该将跨配置文件调用和输出结果放入 连接监听器。

当您运行“make a cross-profile cal”下列出的代码时您应该会看到 “Hello World”的两个日志,每个配置文件各一个。如果只有一个日志 请确保您已在这两个资料中安装了您的应用,并且已授予 权限。