Esta seção mostra como criar uma chamada "Hello World" entre perfis em seu app. Isso dará a você familiaridade com o SDK e uma resposta implementação para complementar. Recomendamos que você acompanhe ativamente desenvolvendo no seu aplicativo.
Configurar um dispositivo de teste com um perfil de trabalho
O Google cria o app DPC de teste para ajudar você a simular e testar um no seu próprio dispositivo. Ele configura um perfil de trabalho e fornece com controles para ativar ou desativar determinados recursos do dispositivo.
Instale o app de teste de DPC.
Abra a Google Play Store e faça o download do app Test DPC.
Configurar um perfil de trabalho
Assim que o app estiver instalado, dois ícones vão aparecer no dispositivo: um e o ícone do app Test DPC. Toque no ícone de configuração e siga as etapas.
Agora você tem dois perfis separados: um para apps pessoais e outro para apps de trabalho. É possível alternar entre os dois usando as guias na parte de cima da lista de apps.
Ao instalar seu aplicativo, ele normalmente é instalado automaticamente em ambos
de perfil. Se precisar instalá-lo explicitamente no perfil de trabalho,
pode usar o argumento --user
com o adb install.
$ adb install --user [id number of profile] [path of apk file]
Para mais detalhes sobre como configurar um dispositivo de teste, acesse este link.
Verifique se o aplicativo está configurado corretamente
Ativar o Java 8 suporte e verifique se o minSdk é pelo menos 19.
Adicionar dependências do 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'
}
Neste exemplo, usamos Guava. Isso não é um requisito do uso do SDK, mas
acompanhar o "Hello World". Você também deve adicionar
api("com.google.guava:guava:29.0-android")
:
Crie uma nova classe que vai conter sua chamada de teste entre perfis
Para tornar esse recurso mais útil mais tarde, você deve colocá-lo no mesmo pacote que você gostaria que suas ligações reais entre perfis fossem feitas.
public class HelloWorld {
@CrossProfile
public ListenableFuture<String> helloWorld() {
return Futures.immediateFuture("Hello world");
}
}
Se não puder depender do suporte do Guava para Futures, acompanhe por enquanto e e confira a etapa final, que informa quais alterações devem ser feitas.
Fazer uma chamada entre perfis
É possível fazer isso em uma classe que vai precisar fazer chamadas reais entre perfis. mais tarde.
// 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());
Fornecer a instância ao SDK
É claro que a chamada do método helloWorld
mencionada anteriormente está em uma
e não a real. Muitas vezes, suas classes reais são singletons ou outros
classes complexas que dependem de estruturas de injeção de dependência, como o Dagger. Para
permitem que a lógica seja chamada na classe real do outro perfil, cada uma
A classe @CrossProfile
precisa ter um método de provedor correspondente em uma
@CrossProfileProvider
. Crie esta classe.
public class HelloWorldProvider {
@CrossProfileProvider
public HelloWorld getHelloWorld() {
return new HelloWorld();
}
}
Fiação adicional
A geração de código necessária para oferecer suporte a classes e métodos personalizados requer uma uma pequena quantidade extra de fiação. Isso serve para lidar com as complexidades de ter muitos destinos de build e requisitos de visibilidade em escala.
Primeiro, anote uma classe de alto nível nova ou existente com
@CrossProfileConfiguration
, apontando para as classes do provedor.
@CrossProfileConfiguration(providers = HelloWorldProvider.class)
abstract class HelloWorldConfiguration {}
Segundo, adicione o serviço gerado automaticamente ao manifesto, na seção
<application> tag
: Isso pode não ser resolvido até que você crie seu projeto.
<service
android:name="com.google.android.enterprise.connectedapps.CrossProfileConnector_Service"
android:exported="false"/>
Por fim, para fins de desenvolvimento, use o INTERACT_ACROSS_USERS
permissão. Se você ainda não tiver essa opção, não poderá mantê-la
a produção, mas é a maneira mais fácil de começar. Primeiro, adicione-o
da seguinte forma:
<uses-permission
android:name="android.permission.INTERACT_ACROSS_USERS"
tools:ignore="ProtectedPermissions"/>
Depois, você pode conceder a si mesmo a permissão pela linha de comando com o adb como segue (caso seu aplicativo ainda não tenha):
adb shell pm grant <your package> android.permission.INTERACT_ACROSS_USERS
Se você não podia depender do Guava para Futures, precisará fazer algumas mudanças. Primeiro, retorne a mensagem "Hello World" diretamente a string e exibe os resultados da frase de destaque entre perfis. Em segundo lugar, como essas chamadas agora são síncronas, você deve colocar sua chamada entre perfis e imprimir os resultados dentro do listener de conexão.
Quando você executa o código listado em ''make a cross-profile cal'' vai aparecer dois registros para "Hello World", um de cada perfil. Se você só recebe um registro, verifique se você instalou o app em ambos os perfis e concedeu a permissão permissão.