Amostra básica

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.

pessoal/trabalho
perfil

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.