Pakiet SDK interfejsu Android Management API (AMAPI) umożliwia aplikacji rozszerzenia określonej przez EMM komunikowanie się bezpośrednio z Android Device Policy (ADP) i wykonywanie na urządzeniu Commands
.
Więcej informacji o integracji z pakietem SDK AMAPI znajdziesz w tej bibliotece oraz w instrukcji dodawania jej do aplikacji.
Po zintegrowaniu pakietu SDK aplikacja rozszerzenia może komunikować się z ADP, aby:
- wysyłać żądania poleceń
- zapytać o stan żądań poleceń
- otrzymywać powiadomienia o zmianach stanu poleceń,
Wydawanie poleceń
Aplikacja rozszerzenia może żądać wydawania poleceń za pomocą ADP.
IssueCommandRequest
zawiera obiekt żądania, który zawiera szczegóły polecenia do wykonania i określone parametry.
Ten fragment kodu pokazuje, jak wysłać żądanie o wyczyszczenie danych pakietu:
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();
}
...
Poprzedni przykład pokazuje wysłanie żądania wyczyszczenia danych aplikacji w przypadku określonych pakietów i czekanie na wykonanie polecenia. Jeśli polecenie zostanie wysłane pomyślnie, zwróci obiekt Command
z bieżącym stanem polecenia i identyfikatorem polecenia, którego można później użyć do zapytania o stan dowolnego długotrwałego polecenia.
Pobierz polecenie
Aplikacja rozszerzenia może sprawdzać stan wcześniej wysłanych żądań poleceń. Aby pobrać stan polecenia, musisz podać identyfikator polecenia (dostępny w żądaniu wydania polecenia). Ten fragment kodu pokazuje, jak wysłać do ADP wiadomość GetCommandRequest
.
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());
}
...
Nasłuchiwanie wywołań zwrotnych zmiany stanu polecenia
Aplikacja rozszerzenia może opcjonalnie zarejestrować wywołanie zwrotne, aby otrzymywać informacje o zmianach stanu długotrwałych poleceń. Aby to zrobić:
- Zmiany stanu polecenia są powiadamiane
CommandListener
. W swojej aplikacji zaimplementuj ten interfejs i określ sposób obsługi otrzymanych aktualizacji stanu. - Rozszerz
NotificationReceiverService
i podaj wystąpienieCommandListener
za pomocą metodygetCommandListener
. W zasadach interfejsu API do zarządzania Androida (patrz Konfiguracja zasad) podaj nazwę klasy rozszerzonego interfejsu
NotificationReceiverService
.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 ...; } }
Konfiguracja zasad
Aby umożliwić aplikacji rozszerzenia komunikowanie się bezpośrednio z ADP, EMM musi udostępnić zasadę 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"
}
}]
Testowanie
Testowanie jednostkowe
LocalCommandClient
to interfejs, który umożliwia przetestowanie implementacji.
Testowanie integracji
Do testowania za pomocą ADP potrzebne są te informacje:
- Nazwa pakietu aplikacji rozszerzenia.
- Zaszyfrowany szesnastkowo identyfikator SHA-256 podpisu powiązanego z pakietem aplikacji.
- Opcjonalnie, jeśli testujesz wywołanie zwrotne – pełna i jednoznaczna nazwa usługi z nowo wprowadzonej usługi, która ma obsługiwać wywołania zwrotne. (w tym przykładzie pełna nazwa
CommandService
).