אפליקציות של תוספים ופקודות מקומיות

ה-SDK של Android Management API (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 יוחזר עם הערך הנוכחי את סטטוס הפקודה ואת מזהה הפקודה, שבו ניתן להשתמש מאוחר יותר כדי לשלוח שאילתה על הסטטוס של פקודות שפועלות לאורך זמן.

קבלת פקודה

אפליקציית תוספים יכולה לשלוח שאילתות לגבי הסטטוס של בקשות לפקודות שהונפקו בעבר. שפת תרגום לאחזר סטטוס של פקודה, יש צורך במזהה הפקודה (זמין בקשה לפתרון הבעיה). בקטע הקוד הבא מוסבר איך לשלוח 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());
  }
  ...

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

אפליקציית תוסף יכולה לרשום קריאה חוזרת כדי לקבל עדכונים לגבי שינויים בסטטוס של פקודות שפועלות לאורך זמן, לפי השלבים הבאים:

  1. שינויים בסטטוס הפקודות מקבלים התראה על כך ל-CommandListener, צריך להטמיע את זה בממשק באפליקציה ולהסביר איך לטפל התקבלו עדכוני סטטוס.
  2. להאריך את 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" />
    

הגדרת המדיניות

כדי לאפשר לאפליקציית התוסף לתקשר ישירות עם 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"
   }
 }]

בדיקה

בדיקות יחידה (unit testing)

LocalCommandClient הוא ממשק ולכן הוא מאפשר לספק דוגמה יישום בפועל.

בדיקת אינטגרציה

כדי לבצע בדיקה באמצעות ADP תצטרכו את הפרטים הבאים:

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