Esempio di base

Questa sezione mostra come creare una chiamata Hello World in più profili la tua app. Questo ti consentirà di acquisire familiarità con l'SDK e su cui basarci. Ti consigliamo di seguire attivamente sviluppando l'app nella tua app.

Configurare un dispositivo di test con un profilo di lavoro

Google crea l'app DPC di test per aiutarti a simulare e testare un modello gestito sul tuo dispositivo. Configurerà un profilo di lavoro e ti fornirà con controlli per attivare o disattivare determinate funzionalità sul dispositivo.

  • Installa l'app DPC di test

    Apri il Google Play Store e scarica l'app DPC di test.

  • Configurare un profilo di lavoro

    Una volta installata l'app, dovresti vedere due icone sul dispositivo: sull'icona di configurazione e sull'icona dell'app Test DPC. Tocca l'icona di configurazione e segui le passaggi.

Ora hai due profili separati, uno per le app personali e uno per le app di lavoro. Puoi spostarti tra le app tramite le schede nella parte superiore dell'elenco di app.

personale/lavoro
profilo

Quando installi l'app, di solito viene installata automaticamente in entrambi profili. Se dovessi avere bisogno di installarla esplicitamente nel profilo di lavoro, può utilizzare l'argomento --user con adb install.

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

Per ulteriori dettagli sulla configurazione di un dispositivo di test, visita questo .

Assicurati che l'applicazione sia configurata correttamente

Abilita Java 8 assistenza e assicurati che il valore minSdk sia almeno 19.

Aggiungi dipendenze 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'
}

In questo esempio utilizziamo Guava. Questo non è un requisito per l'utilizzo dell'SDK, ma segui hello world, dovresti anche aggiungere api("com.google.guava:guava:29.0-android").

Crea una nuova classe che conterrà la chiamata di prova tra più profili

Per renderla più utile in seguito, dovresti inserirla nello stesso pacchetto in cui vuoi ricevere le chiamate reali in più profili.

public class HelloWorld {

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

Se non puoi dipendere dall'assistenza di Guava for Futures, continua a seguirci per ora. quindi vedremo il passaggio finale che indica quali modifiche apportare.

Effettuare una chiamata con più profili

Potresti farlo in un corso che dovrà effettuare vere e proprie chiamate in più profili in un secondo momento.

// 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());

Fornisci l'istanza all'SDK

Ovviamente, la chiamata al metodo helloWorld menzionata in precedenza fa parte di un e non quella vera. Spesso, le vere classi sono singleton o altro classi complesse dipendenti da framework di inserimento delle dipendenze come Dagger. A consentire di chiamare la logica sulla classe reale sull'altro profilo, ciascun profilo La classe @CrossProfile deve avere un metodo provider corrispondente in un @CrossProfileProvider corso. Crea questo corso.

public class HelloWorldProvider {

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

Cavi aggiuntivi

La generazione del codice necessaria per supportare classi e metodi personalizzati richiede un una piccola quantità di cavi aggiuntivi. Questo per gestire le complessità del molti target di build e requisiti di visibilità su larga scala.

In primo luogo, annota una classe di alto livello esistente o nuova con @CrossProfileConfiguration, che rimanda alle classi del tuo provider.

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

In secondo luogo, aggiungi il servizio generato automaticamente al tuo manifest, all'interno del <application> tag. Questo problema potrebbe non essere risolto finché non crei il progetto.

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

Infine, a scopo di sviluppo, offri INTERACT_ACROSS_USERS autorizzazione. Se non l'hai già fatto, non potrai conservarlo produzione, ma è il modo più semplice per iniziare. Aggiungilo anzitutto al tuo manifest come segue:

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

Successivamente, potete concedervi l'autorizzazione dalla riga di comando con adb (se la tua app non dispone già di questo):

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

Se non avete potuto dipendere da Guava for Futures, dovrete effettuare alcune modifiche. Innanzitutto, restituisci "Hello World" la stringa e stampare i risultati del richiamo tra più profili. In secondo luogo, poiché queste chiamate ora sono sincrone, devi inserire la chiamata tra più profili e la stampa dei risultati all'interno del listener di connessioni.

Quando esegui il codice elencato in "make a cross-profile cal" dovresti vedere due log per "Hello World", uno per ogni profilo. Se visualizzi un solo log, assicurati di aver installato la tua app in entrambi i profili e di aver concesso autorizzazione.