Android Management API (AMAPI) SDK'sı, EMM tarafından belirtilen bir uzantı uygulamasının Android Device Policy (ADP) ile doğrudan iletişim kurmasını ve cihazda Commands yürütmesini sağlar.
AMAPI SDK'sı ile entegrasyon, bu kitaplık ve uygulamanıza nasıl ekleneceği hakkında daha fazla bilgi sağlar.
SDK entegre edildikten sonra uzantı uygulamanız, ADP ile aşağıdaki amaçlarla iletişim kurabilir:
- send command requests (Komut istekleri gönderme)
- komut isteklerinin durumunu sorgulama
- komut durumu değişikliklerini alma
Komut Verme
Bir uzantı uygulaması, ADP kullanılarak komut verilmesini isteyebilir.
IssueCommandRequest, verilecek komut ve belirli parametrelerle ilgili ayrıntıları içeren istek nesnesini içerir.
Aşağıdaki snippet'te, paketin verilerini temizleme isteğinin nasıl gönderileceği gösterilmektedir:
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();
}
...
Önceki örnekte, belirtilen paketler için net bir uygulama verileri isteği gönderilmesi ve komut başarıyla gönderilene kadar beklenmesi gösterilmektedir. Başarıyla verilirse mevcut komut durumu ve komut kimliğiyle birlikte bir Command nesnesi döndürülür. Komut kimliği, daha sonra uzun süren komutların durumunu sorgulamak için kullanılabilir.
Komut alma
Uzantı uygulaması, daha önce verilen komut isteklerinin durumunu sorgulayabilir. Bir komutun durumunu almak için komut kimliğine (sorun komutu isteğinden alınabilir) ihtiyacınız vardır. Aşağıdaki snippet'te ADP'ye nasıl GetCommandRequest gönderileceği gösterilmektedir.
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());
}
...
Komut durumu değişikliği geri aramalarını dinleme
Bir uzantı uygulaması, isteğe bağlı olarak aşağıdaki adımları uygulayarak uzun süren komutların durum değişiklikleriyle ilgili güncellemeleri almak için geri çağırma kaydı yapabilir:
- Komut durumu değişiklikleri
CommandListener'e bildirilir. Bu arayüzü uygulamanızda uygulayın ve alınan durum güncellemelerinin nasıl işleneceğiyle ilgili uygulama sağlayın. NotificationReceiverServiceöğesini genişletin vegetCommandListeneryöntemiyleCommandListenerörneği sağlayın.Uygulamanıza
COMPANION_APProlünü atamak için uygulama politikasını yapılandırın (bkz. Politika Yapılandırması).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 ...; } }
Politika Yapılandırması
EMM'nin, uzantı uygulamasının doğrudan ADP ile iletişim kurabilmesi için uygulama politikasındaki roles alanını kullanarak uygulamaya COMPANION_APP rolünü ataması gerekir.
"applications": [{
"packageName": "com.amapi.extensibility.demo",
"installType": "FORCE_INSTALLED",
"roles": [
{ "roleType": "COMPANION_APP" }
]
}]
Diğer seçenekler için Cihazı uygulama rolü politikalarıyla sağlama başlıklı makaleyi inceleyin.
Uygulama rollerini yönetme başlıklı makaleyi inceleyin.Test
Birim testi
LocalCommandClient bir arayüzdür ve bu nedenle test edilebilir bir uygulama sağlamaya olanak tanır.
Entegrasyon testi
ADP ile test yapmak için aşağıdaki bilgiler gereklidir:
- Uzantı uygulamasının paket adı.
- Uygulama paketiyle ilişkilendirilmiş imzanın base64 kodlu SHA-256 karması.
- İsteğe bağlı olarak, geri aramayı test ediyorsanız geri aramayı desteklemek için yeni kullanıma sunulan hizmetten gelen hizmetin tam nitelikli adı. (Örnekteki
CommandServiceöğesinin tam nitelikli adı).