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

تتيح حزمة تطوير البرامج (SDK) لواجهة برمجة التطبيقات لإدارة Android (AMAPI) لتطبيق إضافة خاص بخدمة إدارة الخدمات الجوّالة للمؤسسات (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();
  }
...

يُظهر المثال السابق إصدار طلب واضح لبيانات التطبيق لحِزم محدّدة والانتظار حتى يتم إصدار الأمر بنجاح. وفي حال إصدار الأمر بنجاح، سيتم عرض كائن 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 وتقديم مثيل CommandListener.
  3. حدِّد اسم فئة النطاق NotificationReceiverService الموسّع في سياسة Management 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 في المثال).