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 çalıştırmasını sağlar.

AMAPI SDK ile entegrasyon, bu kitaplık ve onu uygulamanıza nasıl ekleyeceğiniz hakkında daha fazla bilgi sağlar.

SDK entegre edildikten sonra, uzantı uygulamanız ADP ile iletişim kurarak şunları yapabilir:

Sorun Komutu

Uzantı uygulamaları, ADP kullanılarak komut verilmesini isteyebilir. IssueCommandRequest, yayınlanacak komutla ilgili ayrıntıları ve belirli parametreleri içerecek istek nesnesini içerir.

Aşağıdaki snippet'te, paketin verilerini temizlemek için nasıl istekte bulunulacağı 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 yayınlanana kadar beklenmesi gösterilmektedir. Başarıyla yayınlanırsa mevcut komut durumunu ve daha sonra uzun süre çalışan komutların durumunu sorgulamak için kullanılabilecek komut kimliğini içeren bir Command nesnesi döndürülür.

Komut Alma

Uzantı uygulamaları, önceden yayınlanan komut isteklerinin durumunu sorgulayabilir. Bir komutun durumunu almak için komut kimliğine ihtiyacınız vardır (sorun komut isteğinden edinilebilir). Aşağıdaki snippet'te, ADP'ye GetCommandRequest işleminin 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.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üncellemeleri almak için bir geri çağırma kaydedebilir:

  1. Komut durumu değişiklikleri CommandListener'e bildirilir, bu arayüzü uygulamanıza uygular ve alınan durum güncellemelerinin nasıl işleneceğine dair uygulama sağlar.
  2. NotificationReceiverService öğesini genişletin ve CommandListener örneği sağlayın.
  3. Android Management API politikasında genişletilmiş NotificationReceiverService sınıf adını belirtin (Politika Yapılandırması bölümüne bakın).

    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. Hizmeti AndroidManifest.xml cihazınıza ekleyin ve dışa aktarıldığından emin olun.

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

Politika Yapılandırması

Uzantı uygulamasının ADP ile doğrudan iletişim kurmasını sağlamak 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üzdür ve bu nedenle test edilebilir bir uygulama sağlanmasına olanak tanır.

Entegrasyon testi

ADP ile test yapmak için aşağıdaki bilgiler gerekir:

  1. Uzantı uygulamasının paket adı.
  2. Uygulama paketiyle ilişkili İmza'nın onaltılık kodlanmış SHA-256 karması.
  3. İsteğe bağlı olarak, geri çağırma test ediliyorsa, geri çağırmayı desteklemek için yeni kullanıma sunulan hizmetten alınan hizmetin tam adı. (Örnekte CommandService öğesinin tam adı).