Uzantı uygulamaları ve yerel komutlar

Android Management API (AMAPI) SDK'sı, EMM tarafından belirtilen bir uzantı uygulamasının doğrudan Android Device Policy (ADP) ile 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 iletişim kurarak şunları yapabilir:

Komut verme

Bir uzantı uygulaması, ADP kullanılarak komut verilmesini isteyebilir. IssueCommandRequest, gönderilecek komut ve belirli parametreler hakkında ayrıntılar içeren istek nesnesini içerir.

Aşağıdaki snippet'te, paketin verilerini temizleme isteği 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 verisi isteği gönderilmesi ve komutun başarıyla gönderilmesi için bekleme gösterilmektedir. Başarılı bir şekilde yayınlanırsa mevcut komut durumu ve komut kimliği içeren bir Command nesnesi döndürülür. Bu nesne daha sonra uzun süre çalışan komutların durumunu sorgulamak için kullanılabilir.

Get Command

Uzantı uygulamaları, daha önce gönderilen komut isteklerinin durumunu sorgulayabilir. Bir komutun durumunu almak için komut kimliğine (sipariş komutu isteğinde bulunarak edinebilirsiniz) 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 çağırmalarını dinleme

Bir uzantı uygulaması, aşağıdaki adımları uygulayarak uzun süre çalışan komutların durum değişiklikleriyle ilgili güncellemeler almak için isteğe bağlı olarak geri çağırma işlevi kaydedebilir:

  1. Komut durumu değişiklikleri CommandListener'a bildirilir. Bu arayüzü uygulamanıza uygulayın ve alınan durum güncellemelerinin nasıl ele alınacağına dair uygulama sağlayın.
  2. NotificationReceiverService sınıfını genişletin ve getCommandListener yöntemi aracılığıyla bir CommandListener örneği sağlayın.
  3. Android Management API politikasında genişletilmiş NotificationReceiverService sınıfının adını belirtin (Politika Yapılandırması'na bakın).

    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ı

Uzatma uygulamasının ADP ile doğrudan iletişim kurabilmesi için EMM'nin bir extensionConfig politikası sağlaması gerekir.

 "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"
   }
 }]

Test

Birim testi

LocalCommandClient bir arayüz olduğundan test edilebilir bir uygulama sunmanıza olanak tanır.

Entegrasyon testi

ADP ile test yapmak için aşağıdaki bilgilere ihtiyacınız olacaktır:

  1. Uzantı uygulamasının paket adı.
  2. Uygulama paketiyle ilişkili imzanın onaltılık kodlanmış SHA-256 karması.
  3. İsteğe bağlı olarak, geri çağırma testi yapılıyorsa geri çağırmayı desteklemek için yeni kullanıma sunulan hizmetten hizmetin tam nitelikli adı. (Örnekte CommandService için tam nitelikli ad).