التكامل مع حزمة تطوير برامج AMAPI

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

  1. ثبِّت مكتبة إلى تطبيق الإضافة.
  2. استخدِم واجهات برمجة التطبيقات المقدَّمة لإصدار الأوامر حسب الحاجة.
  3. إضافة عنصر طلبات البحث، إذا كانت حزمة SDK المستهدفة >= 30.
  4. اختياريًا، يمكنك توفير تنفيذ الخدمة للاستماع إلى استدعاءات تغيير حالة الأمر.
  5. عليك تزويد الجهاز بسياسة القابلية للتوسع.

المتطلبات الأساسية

  • تأكَّد من ضبط minSdkVersion لتطبيق الإضافة على المستوى 21 من واجهة برمجة التطبيقات على الأقل.

جارٍ إضافة مكتبة إلى تطبيق الإضافة

في ملف Build.grale ذي المستوى الأعلى، أضِف مستودع 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());
  }
  ...

إضافة عنصر طلبات البحث

إذا كان تطبيقك يستهدِف الإصدار 30 من حزمة SDK أو إصدارًا أحدث، يجب استخدام عنصر طلبات البحث في البيان لتحديد أنّه سيتفاعل مع ADP.

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

يمكنك الاطّلاع على فلترة مستوى رؤية الحِزم على Android للحصول على مزيد من المعلومات.

الاستماع إلى طلبات معاودة الاتصال لتغيير حالة الطلبات

  1. يتم إرسال إشعار إلى CommandListener بالتغييرات في حالة الأوامر، وقم بتنفيذ هذه الواجهة في تطبيقك وتوفير عملية تنفيذ حول كيفية التعامل مع تحديثات الحالة التي تم تلقيها.
  2. Extend NotificationReceivedrService وقدِّم مثيل CommandListener.
  3. حدِّد اسم فئة NotificationReceivedrService الموسَّع في سياسة واجهة برمجة التطبيقات لإدارة 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 Device Policy:

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