拡張機能アプリとローカル コマンド

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

上記の例では、指定された IP アドレスに対して 実行して、コマンドが正常に発行されるまで待機します。条件 正常に発行されると、Command オブジェクトが現在の コマンド ステータスとコマンド ID が含まれています。この ID は、後でコマンドのステータスをクエリするために 実行することもできます。

コマンドの取得

拡張機能アプリは、以前に発行されたコマンド リクエストのステータスをクエリできます。宛先 コマンドのステータスを取得するには、コマンド ID( issue command request)でなければなりません。次のスニペットは、 ADP に 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());
  }
  ...

コマンド ステータス変更のコールバックをリッスンする

拡張機能アプリはコールバックを登録して、ステータスの変更に関する最新情報を受け取ることができます。 実行するためのコマンドは次のとおりです。

  1. コマンドのステータスの変更は CommandListener に通知されます。これを実装してください インターフェースを実装し、API 呼び出しの ステータス アップデートを受信しました。
  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. アプリに関連付けられた署名の 16 進数でエンコードされた SHA-256 ハッシュ パッケージ化されています。
  3. コールバックをテストする場合(省略可) - サービスの完全修飾名。 コールバックをサポートするように新しく導入されたサービスを使用します。( CommandService など)。