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

Android Management API (AMAPI) SDK ทำให้แอปส่วนขยายที่ระบุ 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 กลับมาพร้อมไฟล์ สถานะคำสั่ง และ ID คำสั่ง ซึ่งสามารถใช้ในภายหลังเพื่อค้นหาสถานะของ คำสั่งใดๆ ที่ทำงานเป็นเวลานาน

รับคำสั่ง

แอปส่วนขยายสามารถค้นหาสถานะของคำขอคำสั่งที่ออกก่อนหน้านี้ได้ ถึง เรียกสถานะของคำสั่ง คุณจะต้องมีรหัสคำสั่ง (มีอยู่ใน ออกคำขอคำสั่ง) ข้อมูลโค้ดต่อไปนี้แสดงวิธีส่ง 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 สำหรับการเปลี่ยนสถานะคำสั่ง

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

  1. การแจ้งการเปลี่ยนแปลงสถานะคำสั่งไปที่ CommandListener เพื่อเริ่มใช้งาน ไว้ในแอปและแสดงการใช้งานวิธีจัดการ ได้รับการอัปเดตสถานะแล้ว
  2. ขยาย NotificationReceiverService และให้บริการ CommandListener อินสแตนซ์
  3. ระบุชื่อคลาสของ NotificationReceiverService แบบขยายใน Android นโยบาย 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"
   }
 }]

การทดสอบ

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

LocalCommandClient เป็นอินเทอร์เฟซ จึงช่วยให้สามารถทดสอบ การใช้งานของคุณ

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

ต้องใช้ข้อมูลต่อไปนี้เพื่อทดสอบกับ ADP

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