Erweiterungs-Apps und lokale Befehle

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:

  1. Ä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.
  2. NotificationReceiverService erweitern und CommandListener bereitstellen Instanz.
  3. 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 ...;
      }
    }
    
  4. 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:

  1. Paketname der Erweiterungs-App.
  2. Der hex-codierte SHA-256-Hash der mit der Anwendung verknüpften Signatur Paket.
  3. 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).