Ứng dụng tiện ích và lệnh cục bộ

Android Management API (AMAPI) SDK cho phép ứng dụng tiện ích do EMM chỉ định giao tiếp trực tiếp với Android Device Policy (ADP) và thực thi Commands trên thiết bị.

Tích hợp với SDK AMAPI cung cấp thêm thông tin về thư viện này và cách thêm thư viện vào ứng dụng của bạn.

Sau khi tích hợp SDK, ứng dụng tiện ích của bạn có thể giao tiếp với ADP để:

Lệnh thực thi

Ứng dụng tiện ích có thể yêu cầu phát hành các lệnh bằng ADP. IssueCommandRequest chứa đối tượng yêu cầu sẽ chứa thông tin chi tiết về lệnh được phát hành và các thông số cụ thể.

Đoạn mã sau đây cho biết cách đưa ra một yêu cầu xoá dữ liệu của gói:

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

Ví dụ trước cho thấy việc đưa ra một yêu cầu dữ liệu ứng dụng rõ ràng cho các gói dữ liệu và chờ cho đến khi lệnh được phát hành thành công. Nếu đã cấp thành công, một đối tượng Command sẽ được trả về cùng với giá trị hiện tại trạng thái lệnh và mã nhận dạng lệnh mà sau này có thể được dùng để truy vấn trạng thái của bất kỳ lệnh chạy nào trong thời gian dài.

Nhận lệnh

Ứng dụng tiện ích có thể truy vấn trạng thái của các yêu cầu lệnh đã đưa ra trước đó. Người nhận truy xuất trạng thái của lệnh, bạn sẽ cần ID lệnh (có sẵn từ yêu cầu lệnh phát hành). Đoạn mã sau đây cho biết cách gửi một GetCommandRequest cho 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());
  }
  ...

Nghe lệnh gọi lại thay đổi trạng thái Command

Ứng dụng tiện ích có thể đăng ký lệnh gọi lại để nhận thông tin cập nhật về các thay đổi về trạng thái của các lệnh chạy trong thời gian dài bằng cách làm theo những bước sau:

  1. Các thay đổi về trạng thái lệnh sẽ được thông báo cho CommandListener. Hãy triển khai lệnh này giao diện trong ứng dụng của bạn và cung cấp cách triển khai về cách xử lý đã nhận được thông tin cập nhật trạng thái.
  2. Mở rộng NotificationReceiverService và cung cấp CommandListener thực thể.
  3. Chỉ định tên lớp của NotificationReceiverService mở rộng trong Android Chính sách API Quản lý (xem Cấu hình chính sách).

    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. Thêm dịch vụ vào AndroidManifest.xml của bạn và đảm bảo rằng dịch vụ đó đã được xuất.

    <service
     android:name = ".notification.SampleCommandService"
     android:exported = "true" />
    

Cấu hình chính sách

Để cho phép ứng dụng tiện ích giao tiếp trực tiếp với ADP, EMM phải cung cấp chính sách 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"
   }
 }]

Thử nghiệm

Kiểm thử đơn vị

LocalCommandClient là một giao diện có thể kiểm thử được trong quá trình triển khai.

Kiểm thử tích hợp

Bạn cần có những thông tin sau để kiểm thử bằng ADP:

  1. Tên gói của ứng dụng tiện ích.
  2. Hàm băm SHA-256 được mã hoá theo hệ thập lục phân của Chữ ký được liên kết với ứng dụng .
  3. Không bắt buộc, nếu thử nghiệm lệnh gọi lại - tên đủ điều kiện của dịch vụ từ dịch vụ mới được giới thiệu để hỗ trợ lệnh gọi lại. (Tên đủ điều kiện của CommandService trong ví dụ).