Mit dem Android Management API (AMAPI) SDK kann eine EMM-spezifische Erweiterungs-App
direkt mit Android Device Policy (ADP) kommunizieren und Commands
ausführen
auf dem Gerät.
Integration mit dem AMAPI SDK bietet weitere Informationen über und wie Sie sie zu Ihrer Anwendung hinzufügen können.
Nach der Integration des SDK kann Ihre Erweiterungs-App mit ADP kommunizieren, um:
Ausgabebefehl
Eine Erweiterungs-App kann Befehle anfordern, die über ADP ausgegeben werden.
IssueCommandRequest
enthält das Anfrageobjekt mit Details zu
den ausgegebenen Befehl und bestimmte Parameter.
Das folgende Snippet zeigt, wie Sie eine Anfrage zum Löschen der Paketdaten senden:
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();
}
...
Das Beispiel oben zeigt, wie eine Anfrage für eindeutige App-Daten
Pakete und warten, bis der Befehl erfolgreich ausgegeben wurde. Wenn
ausgegeben wurde, wird ein Command
-Objekt mit dem aktuellen
Befehlsstatus und die Befehls-ID, die später zur Abfrage des Status
alle lang andauernden Befehle.
Befehl abrufen
Eine Erweiterungs-App kann den Status zuvor gesendeter Befehlsanfragen abfragen. Bis
Status eines Befehls abrufen möchten, benötigen Sie die Befehls-ID (verfügbar unter
Befehlsanfrage ausgeben). Das folgende Snippet zeigt, wie ein
GetCommandRequest
zu 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());
}
...
Callbacks für Änderung des Befehlsstatus beobachten
Eine Erweiterungs-App kann einen Callback registrieren, um Updates zu Statusänderungen zu erhalten. lang andauernden Befehlen folgendermaßen:
- Änderungen des Befehlsstatus werden an
CommandListener
benachrichtigt, implementieren Sie dies Benutzeroberfläche in Ihrer App und implementieren Sie den Umgang mit dem Status-Updates erhalten hat. NotificationReceiverService
erweitern undCommandListener
bereitstellen Instanz.Gib den Klassennamen des erweiterten
NotificationReceiverService
in Android an Management API-Richtlinie (siehe Richtlinienkonfiguration)import com.google.android.managementapi.commands.CommandListener; import com.google.android.managementapi.notification.NotificationReceiverService; ... public class SampleCommandService extends NotificationReceiverService { @Override protected void setupInjection() { // (Optional) If using DI and needs initialisation then use this method. } @Override public CommandListener getCommandListener() { // return the concrete implementation from previous step return ...; } }
Fügen Sie den Dienst Ihrer
AndroidManifest.xml
hinzu und achten Sie darauf, dass er exportiert wurde.<service android:name = ".notification.SampleCommandService" android:exported = "true" />
Richtlinienkonfiguration
Damit die Erweiterungs-App direkt mit ADP kommunizieren kann, muss der EMM-Anbieter
eine extensionConfig
-Richtlinie zur Verfügung stellen.
"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"
}
}]
Test
Unittest
LocalCommandClient
ist eine Schnittstelle und ermöglicht daher die Bereitstellung einer testbaren
Implementierung.
Integrationstests
Für Tests mit ADP sind folgende Informationen erforderlich:
- Paketname der Erweiterungs-App.
- Der hex-codierte SHA-256-Hash der mit der Anwendung verknüpften Signatur Paket.
- Optional beim Testen des Callbacks: vollständig qualifizierter Name des Dienstes von
den neu eingeführten Dienst
zur Unterstützung von Callbacks hinzugefügt. (Voll qualifizierter Name von
CommandService
im Beispiel).