برنامه های افزودنی و دستورات محلی، برنامه های افزودنی و دستورات محلی

Android Management API (AMAPI) SDK یک برنامه افزودنی مشخص شده با 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 در مثال).
،

Android Management API (AMAPI) SDK یک برنامه افزودنی مشخص شده با 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 در مثال).