ادغام با AMAPI SDK، ادغام با AMAPI SDK

AMAPI SDK یک برنامه افزودنی مشخص شده با EMM را قادر می‌سازد تا مستقیماً با خط‌مشی دستگاه Android ارتباط برقرار کند. در حال حاضر شامل پشتیبانی از اجرای محلی Commands و فقط دستور ClearAppData است. برای ادغام با SDK مراحل زیر باید انجام شود:

  1. کتابخانه را به برنامه افزونه اضافه کنید .
  2. از API های ارائه شده برای صدور دستورات در صورت لزوم استفاده کنید.
  3. اگر SDK هدف >= 30 باشد، عنصر جستجو را اضافه کنید .
  4. به صورت اختیاری، می‌توانید اجرای سرویس را برای گوش دادن به تماس‌های تغییر وضعیت فرمان ارائه دهید.
  5. دستگاه ارائه با خط مشی توسعه پذیری .

پیش نیازها

  • اطمینان حاصل کنید که minSdkVersion برنامه افزونه حداقل روی سطح API 21 تنظیم شده است.

افزودن کتابخانه به برنامه افزودنی

در فایل build.gradle سطح بالای خود، مخزن Google Maven را که حاوی کتابخانه SDK است به ماژول های مربوطه اضافه کنید و وابستگی را به کتابخانه اضافه کنید:

repositories {
  ...
  google()
}

سپس کتابخانه را به بلوک وابستگی های ماژول خود اضافه کنید:

dependencies {
  implementation 'com.google.android.libraries.enterprise.amapi:amapi:1.0.0'
}

درخواست ها را به Android Device Policy ارسال کنید

اکنون باید امکان ارسال درخواست به ADP وجود داشته باشد. درخواست های زیر پشتیبانی می شوند.

صدور فرمان

برنامه افزودنی می تواند درخواست کند که دستورات با استفاده از ADP صادر شود. IssueCommandRequest شامل شی درخواست است که شامل جزئیات فرمان صادر شده و پارامترهای خاص است. اطلاعات بیشتر در مورد آن را می توان در Javadoc یافت.

قطعه زیر نحوه صدور درخواست برای پاک کردن داده های بسته را نشان می دهد:

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 با وضعیت دستور فعلی و شناسه فرمان بازگردانده می شود که بعداً می تواند برای پرس و جو از وضعیت هر فرمان طولانی استفاده شود.

دریافت فرمان

برنامه افزودنی همچنین می‌تواند وضعیت درخواست‌های دستوری صادر شده قبلی را جویا شود. برای بازیابی وضعیت یک فرمان، به شناسه فرمان (که در درخواست فرمان صدور موجود است) نیاز دارید. قطعه زیر ارسال یک درخواست GetCommand به 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());
  }
  ...

افزودن عنصر پرس و جو

اگر برنامه شما SDK 30 و بالاتر را هدف قرار می‌دهد، عنصر query در مانیفست مورد نیاز است تا مشخص شود که با ADP تعامل دارد.

<queries>
    <package android:name="com.google.android.apps.work.clouddpc" />
</queries>

برای اطلاعات بیشتر به فیلتر قابلیت مشاهده بسته در Android مراجعه کنید.

به فراخوان های تغییر وضعیت فرمان گوش دهید

  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" />
    

پیکربندی خط مشی

 "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 یک رابط است و بنابراین آزمایش اجازه می دهد تا به راحتی یک پیاده سازی قابل آزمایش ارائه شود.

تست یکپارچه سازی

اطلاعات زیر برای آزمایش با خط‌مشی دستگاه Android مورد نیاز است:

  1. نام بسته برنامه افزودنی.
  2. هش SHA-256 رمزگذاری شده هگز امضای مرتبط با بسته برنامه.
  3. به صورت اختیاری، در صورت آزمایش پاسخ به تماس - نام کاملاً واجد شرایط سرویس از سرویس تازه معرفی شده برای پشتیبانی از پاسخ به تماس. (نام کاملاً واجد شرایط CommandService در مثال).