擴充功能應用程式和本機指令

Android Management API (AMAPI) SDK 可讓 EMM 指定的擴充功能應用程式 直接與 Android Device Policy (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 物件,其中包含目前的 指令狀態和指令 ID,之後可用來查詢 或任何長按指令

取得指令

擴充功能應用程式可以查詢先前發出的指令要求狀態。目的地: 擷取指令的狀態,就必須取得指令 ID (可在 發出指令要求)。下列程式碼片段說明如何傳送 將 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. 在 Android 中指定擴充 NotificationReceiverService 的類別名稱 Management API 政策 (請參閱政策設定)。

    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)。