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

AMAPI SDK (Android Management API) ช่วยให้แอปส่วนขยายที่ 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. กำหนดค่านโยบายแอปพลิเคชันเพื่อกำหนดบทบาท 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" }
   ]
 }]

ดูตัวเลือกเพิ่มเติมที่มีได้ที่ หัวข้อจัดเตรียมอุปกรณ์ด้วยนโยบายบทบาทของแอป

การทดสอบ

การทำ Unit Test

LocalCommandClient เป็นอินเทอร์เฟซ จึงอนุญาตให้ระบุการใช้งานที่ทดสอบได้

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

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

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