本部分介绍如何在 。这样,您就能熟悉 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”的两个日志,每个配置文件各一个。如果只有一个日志 请确保您已在这两个资料中安装了您的应用,并且已授予 权限。