AMAPI SDK'sı ile entegrasyon

AMAPI SDK, EMM tarafından belirtilen bir uzantı uygulamasının doğrudan Android Device Policy ile iletişim kurmasını sağlar. Şu anda Commands yerel yürütme desteği ve yalnızca ClearAppData komutunu içermektedir. SDK ile entegrasyon için aşağıdaki adımlar uygulanmalıdır:

  1. Kitaplığı uzantı uygulamasına ekleyin.
  2. Gerektiğinde komut vermek için sağlanan API'lerden yararlanın.
  3. Hedef SDK >= 30 ise sorgu öğesi ekleyin.
  4. İsteğe bağlı olarak komut durum değişikliği geri çağırmalarını dinlemek için hizmet uygulaması sağlayabilirsiniz.
  5. Cihazı genişletilebilirlik politikasıyla sağlayın.

Ön koşullar

  • Uzantı uygulamasının minSdkVersion değerinin en az API düzeyi 21'e ayarlandığından emin olun.

Uzantı uygulamasına kitaplık ekleniyor

Üst düzey build.gradle dosyanıza, SDK kitaplığını içeren Google Maven deposunu ilgili modüllere ve bağımlılığı kitaplığa ekleyin:

repositories {
  ...
  google()
}

Ardından kitaplığı modülünüzün bağımlılık blokuna ekleyin:

dependencies {
  implementation 'com.google.android.libraries.enterprise.amapi:amapi:1.0.0'
}

Android Device Policy'ye istek gönderme

Artık ADP'ye istek gönderebilirsiniz. Aşağıdaki istekler desteklenir.

Sorun Komutu

Uzantı uygulaması, ADP kullanılarak komutların verilmesini isteyebilir. IssueCommandRequest'i, verilecek komut ve belirli parametrelerle ilgili ayrıntıları içeren istek nesnesini içerir. Bununla ilgili daha fazla bilgiyi Javadoc'ta bulabilirsiniz.

Aşağıdaki snippet'te paket verilerini temizlemek için nasıl istek göndereceğiniz 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();
  }
...

Yukarıdaki örnekte, belirtilen paketler için net bir uygulama verileri isteği gönderme ve komut başarıyla yayınlanana kadar bekleme gösterilmektedir. Başarılı bir şekilde yayınlanan bir Command nesnesi, geçerli komut durumu ve daha sonra uzun süre çalışan komutların durumunu sorgulamak için kullanılabilecek komut kimliğiyle birlikte döndürülür.

Komut Alma

Uzantı uygulaması daha önce gönderilen komut isteklerinin durumunu da sorgulayabilir. Bir komutun durumunu almak için komut kimliğine ihtiyacınız vardır (sorun komut isteğinden kullanılabilir). Aşağıdaki snippet'te ADP'ye GetCommand isteği gönderme 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());
  }
  ...

Sorgular öğesi ekleniyor

Uygulamanız SDK 30 ve sonraki sürümleri hedefliyorsa manifest'te ADP ile etkileşime gireceğini belirtmek için sorgu öğesi gerekir.

<queries>
    <package android:name="com.google.android.apps.work.clouddpc" />
</queries>

Daha fazla bilgi için Android'de paket görünürlüğü filtreleme konusuna bakın.

Komut durum değişikliği geri çağırmalarını dinleme

  1. Komut durumu değişiklikleri CommandListener'a bildirilir, uygulamanızda bu arayüzü uygulayın ve alınan durum güncellemelerinin nasıl işleneceği konusunda uygulama sağlayın.
  2. NotificationReceiverService kapsamını 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ı'na 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 dosyanıza ekleyin ve dışa aktarıldığından emin olun.

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

Politika Yapılandırması

 "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, kolayca test edilebilir bir uygulamanın sağlanmasına olanak tanır.

Entegrasyon testi

Android Device Policy ile test etmek için aşağıdaki bilgiler gerekecektir:

  1. Uzantı uygulamasının paket adı.
  2. Uygulama paketiyle ilişkili İmza'nın on altılı kodlanmış SHA-256 karması.
  3. İsteğe bağlı olarak, geri çağırma test ediliyorsa geri çağırmayı desteklemek için sunulan yeni hizmetteki hizmetin tam nitelikli adı. (Örnekte CommandService'in tam adı).