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,之後可用來查詢
或任何長按指令
取得指令
擴充功能應用程式可以查詢先前發出的指令要求狀態。目的地:
擷取指令的狀態,就必須取得指令 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());
}
...
監聽指令狀態變更回呼
擴充功能應用程式可以註冊回呼,接收狀態變更的更新 長時間執行指令
- 系統會向
CommandListener
通知指令狀態變更,請實作 所提供的實作功能,並可解釋如何處理 已收到狀態更新。 - 擴充
NotificationReceiverService
並提供CommandListener
執行個體。 在 Android 中指定擴充
NotificationReceiverService
的類別名稱 Management 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 ...; } }
將服務新增至
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"
}
}]
測試
單元測試
LocalCommandClient
是介面,因此可提供可供測試的
。
整合測試
如要使用 ADP 進行測試,須提供下列資訊:
- 擴充功能應用程式的套件名稱。
- 應用程式相關簽名的十六進位編碼 SHA-256 雜湊 套件。
- 選擇是否測試回呼,也就是來自以下來源的服務完整名稱:
支援回呼的新服務(完整名稱
CommandService
)。