Uzantı uygulamaları ve yerel komutlar

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:

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:

  1. 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.
  2. NotificationReceiverService öğesini genişletin ve getCommandListener yöntemiyle CommandListener örneği sağlayın.
  3. Uygulamanıza COMPANION_APP rolü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:

  1. Uzantı uygulamasının paket adı.
  2. Uygulama paketiyle ilişkilendirilmiş imzanın base64 kodlu SHA-256 karması.
  3. İ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ı).