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

تتيح حزمة تطوير البرامج (SDK) الخاصة بواجهة Android Management API (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 من خلال طريقة getCommandListener.
  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) التطبيق دور COMPANION_APP باستخدام حقل roles في سياسة التطبيق.

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

للاطّلاع على خيارات إضافية متاحة، يُرجى الرجوع إلى توفير الجهاز باستخدام سياسات أدوار التطبيق.

الاختبار

اختبار الوحدة

LocalCommandClient هي واجهة، وبالتالي تسمح بتوفير تنفيذ قابل للاختبار.

اختبار التكامل

ستكون المعلومات التالية مطلوبة للاختبار باستخدام "منصة عرض إعلانات Google":

  1. اسم حزمة تطبيق الإضافة
  2. تجزئة SHA-256 بترميز base64 للتوقيع المرتبط بحزمة التطبيق.
  3. اختياري: إذا كنت تختبر عملية رد الاتصال، أدخِل الاسم المؤهَّل بالكامل للخدمة من الخدمة التي تم تقديمها حديثًا لدعم عملية رد الاتصال. (الاسم المؤهَّل بالكامل لـ CommandService في المثال).