Le SDK de l'API Android Management (AMAPI) permet à une application d'extension spécifiée par un fournisseur EMM de communiquer directement avec Android Device Policy (ADP) et d'exécuter Commands
sur l'appareil.
Intégration au SDK AMAPI fournit plus d'informations sur cette bibliothèque et sur la façon de l'ajouter à votre application.
Une fois le SDK intégré, votre application d'extension peut communiquer avec ADP pour:
- envoyer des requêtes de commande ;
- interroger l'état des requêtes de commande
- recevoir les modifications de l'état des commandes
Envoyer une commande
Une application d'extension peut demander l'émission de commandes à l'aide d'ADP.
IssueCommandRequest
contient l'objet de requête qui contient des informations sur la commande à émettre et des paramètres spécifiques.
L'extrait de code suivant montre comment envoyer une requête pour effacer les données du package:
import android.util.Log;
...
import com.google.android.managementapi.commands.LocalCommandClientFactory;
import com.google.android.managementapi.commands.model.Command;
import com.google.android.managementapi.commands.model.GetCommandRequest;
import com.google.android.managementapi.commands.model.IssueCommandRequest;
import com.google.android.managementapi.commands.model.IssueCommandRequest.ClearAppsData;
import com.google.common.collect.ImmutableList;
import com.google.common.util.concurrent.FutureCallback;
import com.google.common.util.concurrent.Futures;
import com.google.common.util.concurrent.MoreExecutors;
...
void issueClearAppDataCommand(ImmutableList<String> packageNames) {
Futures.addCallback(
LocalCommandClientFactory.create(getContext())
.issueCommand(createClearAppRequest(packageNames)),
new FutureCallback<Command>() {
@Override
public void onSuccess(Command result) {
// Process the returned command result here
Log.i(TAG, "Successfully issued command");
}
@Override
public void onFailure(Throwable t) {
Log.e(TAG, "Failed to issue command", t);
}
},
MoreExecutors.directExecutor());
}
IssueCommandRequest createClearAppRequest(ImmutableList<String> packageNames) {
return IssueCommandRequest.builder()
.setClearAppsData(
ClearAppsData.builder()
.setPackageNames(packageNames)
.build()
)
.build();
}
...
L'exemple précédent montre comment envoyer une requête de données d'application claire pour des packages spécifiés et attendre que la commande ait été envoyée. Si la commande est émise avec succès, un objet Command
est renvoyé avec l'état de la commande actuelle et l'ID de commande, qui peut ensuite être utilisé pour interroger l'état de toute commande de longue durée.
Obtenir la commande
Une application d'extension peut interroger l'état des requêtes de commande précédemment émises. Pour récupérer l'état d'une commande, vous avez besoin de l'ID de commande (disponible dans la requête de commande d'émission). L'extrait suivant montre comment envoyer un GetCommandRequest
à ADP.
import android.util.Log;
...
import com.google.android.managementapi.commands.LocalCommandClientFactory;
...
import com.google.android.managementapi.commands.model.GetCommandRequest;
import com.google.common.util.concurrent.FutureCallback;
import com.google.common.util.concurrent.Futures;
import com.google.common.util.concurrent.MoreExecutors;
...
void getCommand(String commandId) {
Futures.addCallback(
LocalCommandClientFactory.create(getApplication())
.getCommand(GetCommandRequest.builder().setCommandId(commandId).build()),
new FutureCallback<Command>() {
@Override
public void onSuccess(Command result) {
// Process the returned command result here
Log.i(Constants.TAG, "Successfully issued command");
}
@Override
public void onFailure(Throwable t) {
Log.e(Constants.TAG, "Failed to issue command", t);
}
},
MoreExecutors.directExecutor());
}
...
Écouter les rappels de modification de l'état de la commande
Une application d'extension peut éventuellement enregistrer un rappel pour recevoir des informations sur les modifications d'état des commandes de longue durée en procédant comme suit:
- Les modifications de l'état de la commande sont communiquées à
CommandListener
. Implémentez cette interface dans votre application et indiquez comment gérer les mises à jour d'état reçues. - Étendez
NotificationReceiverService
et fournissez une instanceCommandListener
via la méthodegetCommandListener
. Spécifiez le nom de classe de l'
NotificationReceiverService
étendue dans la règle de l'API Android Management (voir la section "Configuration des règles").import com.google.android.managementapi.commands.CommandListener; import com.google.android.managementapi.notification.NotificationReceiverService; ... public class SampleCommandService extends NotificationReceiverService { @Override public CommandListener getCommandListener() { // return the concrete implementation from previous step return ...; } }
Configuration des règles
Pour permettre à l'application d'extension de communiquer directement avec ADP, l'EMM doit fournir une stratégie extensionConfig
.
"applications": [{
"packageName": "com.amapi.extensibility.demo",
...
"extensionConfig": {
"signingKeyFingerprintsSha256": [
// Include signing key of extension app
],
// Optional if callback is implemented
"notificationReceiver": "com.amapi.extensibility.demo.notification.SampleCommandService"
}
}]
Tests
Tests unitaires
LocalCommandClient
est une interface et permet ainsi de fournir une implémentation testable.
Tests d'intégration
Vous aurez besoin des informations suivantes pour effectuer des tests avec ADP:
- Nom du package de l'application d'extension.
- Hachage SHA-256 à encodage hexadécimal de la signature associée au package d'application.
- Facultatif, si vous testez le rappel : nom complet du service du nouveau service pour prendre en charge le rappel. (nom complet de
CommandService
dans l'exemple).