שילוב עם AMAPI SDK

AMAPI SDK מאפשר לאפליקציית תוסף שצוינה על ידי EMM לתקשר ישירות עם Android Device Policy. נכון לעכשיו, היא כוללת תמיכה בהרצה מקומית של Commands, ורק בפקודה ClearAppData. כדי לשלב עם ה-SDK:

  1. הוספת ספרייה לאפליקציית התוסף.
  2. השתמשו בממשקי ה-API שסופקו כדי להפק את הפקודות לפי הצורך.
  3. יש להוסיף רכיב שאילתות, אם ערכת ה-SDK של היעד היא >= 30.
  4. אפשר גם לספק הטמעת שירות כדי להאזין לקריאות חוזרות לשינוי סטטוס הפקודה.
  5. הקצאת המכשיר באמצעות מדיניות אפשרויות הרחבה.

דרישות מוקדמות

  • מוודאים שה-minSdkVersion של אפליקציית התוסף מוגדר לרמת API 21 לפחות.

מוסיף ספרייה ליישום התוסף

בקובץ build.gradle ברמה העליונה, מוסיפים את מאגר Google Maven, שמכיל את ספריית ה-SDK למודולים הרלוונטיים, ומוסיפים את התלות לספרייה:

repositories {
  ...
  google()
}

לאחר מכן מוסיפים את הספרייה לקטע של יחסי התלות של המודול:

dependencies {
  implementation 'com.google.android.libraries.enterprise.amapi:amapi:1.0.0'
}

שליחת בקשות אל אפליקציית Device Policy ל-Android

עכשיו אמורה להיות אפשרות לשלוח בקשות ל-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());
  }
  ...

הוספת רכיב שאילתות

אם האפליקציה מטרגטת SDK 30 ואילך, יש צורך ברכיב שאילתות במניפסט כדי לציין שתקיים אינטראקציה עם ADP.

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

למידע נוסף, ראו סינון הרשאות גישה של חבילות ב-Android .

האזנה לקריאות חוזרות לשינוי סטטוס הפקודה

  1. הודעה על שינויים בסטטוס הפקודה נשלחת ל-CommandListener, יש להטמיע את הממשק הזה באפליקציה ולציין את אופן הטיפול בעדכוני הסטטוס שהתקבלו.
  2. Extend NotificationReceiverService ומופע של CommandListener.
  3. ציון שם המחלקה של NotificationReceiverService במדיניות המורחבת של Android Management API (פרטים נוספים בתצורת המדיניות).

    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 הוא ממשק ולכן הבדיקות מאפשרות לבצע בקלות הטמעה שניתנת לבדיקה.

בדיקות שילוב

כדי לבצע בדיקה באמצעות אפליקציית Device Policy ל-Android, נדרשים הפרטים הבאים:

  1. שם החבילה של אפליקציית התוסף.
  2. גיבוב SHA-256 עם קידוד הקסדצימלי של החתימה המשויכת לחבילת האפליקציות.
  3. אופציונלי: אם רוצים לבדוק את הקריאה החוזרת (callback) – שם מלא של השירות מהשירות החדש שהושק כדי לתמוך בהתקשרות חזרה. (השם המלא של CommandService בדוגמה).