Приложения расширения и локальные команды,Приложения расширения и локальные команды

SDK Android Management API (AMAPI) позволяет приложению расширения, указанному EMM, напрямую взаимодействовать с политикой устройств Android (ADP) и выполнять Commands на устройстве.

Интеграция с AMAPI SDK предоставляет дополнительную информацию об этой библиотеке и о том, как добавить ее в ваше приложение.

После интеграции SDK ваше приложение-расширение сможет взаимодействовать с ADP, чтобы:

Выдать команду

Приложение расширения может запрашивать команды для выдачи с помощью ADP. IssueCommandRequest содержит объект запроса, который будет содержать подробную информацию о выдаваемой команде и конкретных параметрах.

В следующем фрагменте показано, как отправить запрос на очистку данных пакета:

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();
  }
...

В предыдущем примере показана выдача запроса на очистку данных приложения для указанных пакетов и ожидание успешного выполнения команды. В случае успешного выполнения объект Command будет возвращен с текущим статусом команды и идентификатором команды, который позже можно будет использовать для запроса статуса любых долго выполняющихся команд.

Получить команду

Приложение расширения может запрашивать статус ранее отправленных командных запросов. Чтобы получить статус команды, вам понадобится идентификатор команды (доступный в запросе команды). В следующем фрагменте показано, как отправить 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());
  }
  ...

Прослушивание обратных вызовов изменения статуса команды

Приложение-расширение может зарегистрировать обратный вызов для получения обновлений об изменениях статуса длительно выполняемых команд, выполнив следующие действия:

  1. Изменения статуса команды уведомляются CommandListener , реализуйте этот интерфейс в своем приложении и обеспечьте реализацию обработки полученных обновлений статуса.
  2. Расширьте NotificationReceiverService и предоставьте экземпляр CommandListener .
  3. Укажите имя класса расширенного NotificationReceiverService в политике API управления Android ( см. Конфигурацию политики ).

    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. Добавьте службу в свой AndroidManifest.xml и убедитесь, что она экспортирована.

    <service
     android:name = ".notification.SampleCommandService"
     android:exported = "true" />
    

Конфигурация политики

Чтобы приложение расширения могло напрямую взаимодействовать с ADP, EMM должен предоставить политику 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"
   }
 }]

Тестирование

Модульное тестирование

LocalCommandClient является интерфейсом и, таким образом, позволяет предоставить тестируемую реализацию.

Интеграционное тестирование

Для тестирования с помощью ADP потребуется следующая информация:

  1. Имя пакета приложения расширения.
  2. Хэш SHA-256 в шестнадцатеричной кодировке подписи, связанной с пакетом приложения.
  3. Необязательно, если тестируется обратный вызов — полное имя службы из вновь представленной службы для поддержки обратного вызова. (В примере полное имя CommandService ).
,

SDK Android Management API (AMAPI) позволяет приложению расширения, указанному EMM, напрямую взаимодействовать с политикой устройств Android (ADP) и выполнять Commands на устройстве.

Интеграция с AMAPI SDK предоставляет дополнительную информацию об этой библиотеке и о том, как добавить ее в ваше приложение.

После интеграции SDK ваше приложение-расширение сможет взаимодействовать с ADP, чтобы:

Выдать команду

Приложение расширения может запрашивать команды для выдачи с помощью ADP. IssueCommandRequest содержит объект запроса, который будет содержать подробную информацию о выдаваемой команде и конкретных параметрах.

В следующем фрагменте показано, как отправить запрос на очистку данных пакета:

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();
  }
...

В предыдущем примере показана выдача запроса на очистку данных приложения для указанных пакетов и ожидание успешного выполнения команды. В случае успешного выполнения объект Command будет возвращен с текущим статусом команды и идентификатором команды, который позже можно будет использовать для запроса статуса любых длительно выполняющихся команд.

Получить команду

Приложение расширения может запрашивать статус ранее отправленных командных запросов. Чтобы получить статус команды, вам понадобится идентификатор команды (доступный в запросе команды). В следующем фрагменте показано, как отправить 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());
  }
  ...

Прослушивание обратных вызовов изменения статуса команды

Приложение-расширение может зарегистрировать обратный вызов для получения обновлений об изменениях статуса длительно выполняемых команд, выполнив следующие действия:

  1. Изменения статуса команды уведомляются CommandListener , реализуйте этот интерфейс в своем приложении и обеспечьте реализацию обработки полученных обновлений статуса.
  2. Расширьте NotificationReceiverService и предоставьте экземпляр CommandListener .
  3. Укажите имя класса расширенного NotificationReceiverService в политике API управления Android ( см. Конфигурацию политики ).

    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. Добавьте службу в свой AndroidManifest.xml и убедитесь, что она экспортирована.

    <service
     android:name = ".notification.SampleCommandService"
     android:exported = "true" />
    

Конфигурация политики

Чтобы приложение расширения могло напрямую взаимодействовать с ADP, EMM должен предоставить политику 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"
   }
 }]

Тестирование

Модульное тестирование

LocalCommandClient является интерфейсом и, таким образом, позволяет предоставить тестируемую реализацию.

Интеграционное тестирование

Для тестирования с помощью ADP потребуется следующая информация:

  1. Имя пакета приложения расширения.
  2. Хэш SHA-256 в шестнадцатеричной кодировке подписи, связанной с пакетом приложения.
  3. Необязательно, если тестируется обратный вызов — полное имя службы из вновь представленной службы для поддержки обратного вызова. (В примере полное имя CommandService ).