แอปส่วนขยายและคำสั่งในเครื่อง

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());
  }
  ...

ฟังการเรียกกลับการเปลี่ยนแปลงสถานะคําสั่ง

แอปส่วนขยายจะลงทะเบียนการเรียกกลับเพื่อรับข้อมูลอัปเดตเกี่ยวกับการเปลี่ยนแปลงสถานะของคําสั่งที่ทำงานอยู่นานโดยทำตามขั้นตอนต่อไปนี้

  1. การเปลี่ยนแปลงสถานะคําสั่งจะได้รับการแจ้งเตือนไปยัง CommandListener ให้ใช้อินเทอร์เฟซนี้ในแอปและระบุวิธีใช้งานเพื่อจัดการกับการอัปเดตสถานะที่ได้รับ
  2. ขยาย NotificationReceiverService และระบุอินสแตนซ์ CommandListener ผ่านเมธอด getCommandListener
  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
     public CommandListener getCommandListener() {
       // return the concrete implementation from previous step
       return ...;
     }
    }
    

การกําหนดค่านโยบาย

หากต้องการให้แอปส่วนขยายสื่อสารกับ 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"
   }
 }]

การทดสอบ

การทดสอบ 1 หน่วย

LocalCommandClient เป็นอินเทอร์เฟซ จึงช่วยให้สามารถติดตั้งใช้งานที่ทดสอบได้

การทดสอบการผสานรวม

คุณจะต้องระบุข้อมูลต่อไปนี้เพื่อทดสอบกับ ADP

  1. ชื่อแพ็กเกจของแอปส่วนขยาย
  2. แฮช SHA-256 ที่เข้ารหัสฐาน 16 ของลายเซ็นที่เชื่อมโยงกับแพ็กเกจแอป
  3. ไม่บังคับ หากทดสอบการเรียกกลับ - ชื่อที่สมบูรณ์ในตัวเองของบริการจากบริการที่เปิดตัวใหม่เพื่อรองรับการเรียกกลับ (ชื่อที่สมบูรณ์ของ CommandService ในตัวอย่าง)