SDK Android Management API (AMAPI) 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ị.
Phần 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 này vào ứng dụng.
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 để:
Ra lệnh
Ứng dụng tiện ích có thể yêu cầu phát 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ần đưa ra và các tham số cụ thể.
Đoạn mã sau đây cho biết cách đưa ra 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 yêu cầu xoá dữ liệu ứng dụng cho các gói được chỉ định và chờ cho đến khi lệnh được đưa ra thành công. Nếu được phát hành thành công, một đối tượng Command
sẽ được trả về cùng với trạng thái lệnh hiện tại và mã lệnh. Sau này, bạn có thể dùng mã lệnh này để truy vấn trạng thái của mọi lệnh chạy trong thời gian dài.
Lệnh nhận
Ứ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 đó. Để truy xuất trạng thái của một lệnh, bạn sẽ cần mã lệnh (có trong yêu cầu phát lệnh). Đoạn mã sau đây cho biết cách gửi GetCommandRequest
đến 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 lệnh
Ứng dụng tiện ích có thể tuỳ ý đăng ký lệnh gọi lại để nhận thông tin cập nhật về các thay đổi trạng thái của các lệnh chạy trong thời gian dài theo các bước sau:
- Các thay đổi về trạng thái lệnh sẽ được thông báo cho
CommandListener
, triển khai giao diện này trong ứng dụng và cung cấp cách triển khai để xử lý các bản cập nhật trạng thái đã nhận. - Mở rộng
NotificationReceiverService
và cung cấp một thực thểCommandListener
thông qua phương thứcgetCommandListener
. Chỉ định tên lớp của
NotificationReceiverService
mở rộng trong chính sách Android Management API (xem phần 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 public CommandListener getCommandListener() { // return the concrete implementation from previous step return ...; } }
Định 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 và do đó cho phép cung cấp một phương thức triển khai có thể kiểm thử.
Kiểm thử tích hợp
Bạn sẽ cần những thông tin sau để kiểm thử với ADP:
- Tên gói của ứng dụng tiện ích.
- Hàm băm SHA-256 được mã hoá thập lục phân của chữ ký liên kết với gói ứng dụng.
- Không bắt buộc, nếu kiểm thử 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ụ).