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

کیت توسعه نرم‌افزار (SDK) رابط برنامه‌نویسی کاربردی مدیریت اندروید (AMAPI) به یک برنامه افزودنی مشخص‌شده توسط EMM این امکان را می‌دهد که مستقیماً با خط‌مشی دستگاه اندروید (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 با وضعیت دستور فعلی و شناسه دستور بازگردانده می‌شود که بعداً می‌توان از آن برای پرس‌وجوی وضعیت هر دستور طولانی در حال اجرا استفاده کرد.

دریافت فرمان

یک برنامه افزودنی می‌تواند وضعیت درخواست‌های دستوری که قبلاً صادر شده‌اند را بررسی کند. برای بازیابی وضعیت یک دستور، به شناسه دستور (که از درخواست دستور issue قابل دسترسی است) نیاز دارید. قطعه کد زیر نحوه ارسال 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 بسط داده و از طریق متد getCommandListener یک نمونه CommandListener ارائه می‌دهد.
  3. سیاست برنامه را طوری پیکربندی کنید که نقش COMPANION_APP را به برنامه شما اختصاص دهد ( به پیکربندی سیاست مراجعه کنید).

    import com.google.android.managementapi.commands.CommandListener;
    import com.google.android.managementapi.notification.NotificationReceiverService;
    
    ...
    
    public class SampleCommandService extends NotificationReceiverService {
    
     @Override
     public CommandListener getCommandListener() {
       // return the concrete implementation from previous step
       return ...;
     }
    }
    

پیکربندی سیاست

برای اینکه برنامه‌ی افزونه بتواند مستقیماً با ADP ارتباط برقرار کند، EMM باید با استفاده از فیلد roles در سیاست برنامه، نقش COMPANION_APP را به برنامه اختصاص دهد.

 "applications": [{
   "packageName": "com.amapi.extensibility.demo",
   "installType": "FORCE_INSTALLED",
   "roles": [
     { "roleType": "COMPANION_APP" }
   ]
 }]

برای گزینه‌های بیشتر موجود، به سیاست‌های «ارائه دستگاه با نقش‌های برنامه» مراجعه کنید.

آزمایش

تست واحد

LocalCommandClient یک رابط است و بنابراین امکان ارائه یک پیاده‌سازی قابل آزمایش را فراهم می‌کند.

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

برای آزمایش با ADP به اطلاعات زیر نیاز است:

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