تطبيقات الإضافات والأوامر المحلية

تتيح حزمة تطوير البرامج (SDK) لواجهة برمجة تطبيقات إدارة Android (AMAPI) لتطبيق إضافة مخصصة لإدارة الخدمات الجوّالة للمؤسسات (EMM) من أجل التواصل مباشرةً مع تطبيق Android Device Policy (ADP) وتنفيذ Commands على الجهاز.

يوفّر الدمج مع حزمة تطوير البرامج (SDK) AMAPI) مزيدًا من المعلومات حول هذه المكتبة وكيفية إضافتها إلى تطبيقك.

بعد دمج حزمة تطوير البرامج (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 الموسّع في 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 في المثال).