В этом разделе показано, как создать межпрофильный вызов hello world в вашем приложении. Это даст вам представление о SDK и первоначальной реализации, на основе которой можно будет работать. Вам рекомендуется активно следить за развитием своего приложения.
Настройте тестовое устройство с рабочим профилем
Google создает приложение Test DPC, которое поможет вам смоделировать и протестировать управляемую среду на вашем собственном устройстве. Он настроит рабочий профиль и предоставит вам элементы управления для включения или отключения определенных функций на устройстве.
Установите приложение Тестовый ЦОД
Откройте магазин Google Play и загрузите приложение Test DPC.
Настройка рабочего профиля
После установки приложения на устройстве должны появиться два значка: значок настройки и значок приложения Test DPC. Коснитесь значка настройки и следуйте инструкциям.
Теперь у вас есть два отдельных профиля: один для личных приложений и один для рабочих приложений. Переключаться между ними можно через вкладки вверху списка приложений.
При установке приложения оно обычно автоматически устанавливается в оба профиля. Если вам когда-нибудь понадобится установить его явно в рабочий профиль, вы можете использовать аргумент --user
с установкой adb.
$ adb install --user [id number of profile] [path of apk file]
Более подробную информацию о настройке тестового устройства можно найти по этой ссылке.
Убедитесь, что ваше приложение настроено правильно
Включите поддержку Java 8 и убедитесь, что ваш minSdk не ниже 19.
Добавить зависимости градиента
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
. Если у вас его еще нет, вы не сможете продолжать его работу, но это самый простой способ начать. Во-первых, добавьте его в свой манифест следующим образом:
<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» напрямую и распечатайте результаты межпрофильного вызова. Во-вторых, поскольку эти вызовы теперь синхронны, вам следует разместить межпрофильный вызов и печать результатов внутри прослушивателя соединения.
Когда вы запустите код, указанный в разделе «Выполнить межпрофильную калибровку», вы должны увидеть два журнала «Hello World», по одному из каждого профиля. Если вы получаете только один журнал, убедитесь, что вы установили приложение в оба профиля и предоставили разрешение.