Mengintegrasikan dengan AMAPI SDK

AMAPI SDK memungkinkan aplikasi ekstensi yang ditentukan EMM berkomunikasi langsung dengan Android Device Policy. Saat ini, alat ini mencakup dukungan untuk eksekusi lokal Commands, dan hanya perintah ClearAppData. Langkah-langkah berikut harus dilakukan untuk berintegrasi dengan SDK:

  1. Tambahkan library ke aplikasi ekstensi.
  2. Gunakan API yang disediakan untuk memberikan perintah seperti yang diperlukan.
  3. Tambahkan elemen kueri, jika SDK target >= 30.
  4. Secara opsional, Anda dapat memberikan implementasi layanan untuk memproses callback perubahan status perintah.
  5. Menyediakan perangkat dengan kebijakan ekstensibilitas.

Prasyarat

  • Pastikan minSdkVersion aplikasi ekstensi disetel setidaknya ke API level 21.

Menambahkan library ke aplikasi ekstensi

Di file build.gradle tingkat atas, tambahkan repositori Maven Google yang berisi library SDK ke modul yang relevan dan tambahkan dependensi ke library:

repositories {
  ...
  google()
}

Kemudian, tambahkan library ke blok dependensi modul Anda:

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

Mengirim permintaan ke Android Device Policy

Sekarang seharusnya permintaan dapat dikirim ke ADP. Permintaan berikut didukung.

Perintah Penerbitan

Aplikasi ekstensi dapat meminta agar perintah dikeluarkan menggunakan ADP. IssueCommandRequest berisi objek permintaan yang akan memuat detail tentang perintah yang akan dikeluarkan dan parameter tertentu. Informasi lebih lanjut mengenai hal ini dapat ditemukan di Javadoc.

Cuplikan berikut menunjukkan cara mengeluarkan permintaan untuk menghapus data paket:

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();
  }
...

Contoh di atas menunjukkan penerbitan permintaan data aplikasi yang jelas untuk paket yang ditentukan dan menunggu hingga perintah berhasil dikeluarkan. Jika berhasil dikeluarkan, objek Command akan ditampilkan dengan status perintah saat ini dan ID perintah yang nantinya dapat digunakan untuk membuat kueri status dari perintah yang berjalan lama.

Mendapatkan Perintah

Aplikasi ekstensi juga dapat mengkueri status permintaan perintah yang dikeluarkan sebelumnya. Untuk mengambil status perintah, Anda memerlukan ID perintah (tersedia dari permintaan perintah penerbitan). Cuplikan berikut menunjukkan pengiriman permintaan GetCommand ke ADP.

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());
  }
  ...

Menambahkan elemen kueri

Jika aplikasi Anda menargetkan SDK 30 dan yang lebih baru, elemen kueri diperlukan dalam manifes untuk menentukan bahwa aplikasi akan berinteraksi dengan ADP.

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

Lihat Pemfilteran visibilitas paket di Android untuk mengetahui informasi selengkapnya.

Memproses callback perubahan status Perintah

  1. Perubahan status perintah diberitahukan ke CommandListener, terapkan antarmuka ini di aplikasi Anda, dan berikan implementasi mengenai cara menangani pembaruan status yang diterima.
  2. Memperluas NotificationReceiverService dan menyediakan instance CommandListener.
  3. Menentukan nama class NotificationReceiverService yang diperluas di kebijakan Android Management API (lihat Konfigurasi Kebijakan).

    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. Tambahkan layanan ke AndroidManifest.xml dan pastikan layanan tersebut diekspor.

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

Konfigurasi Kebijakan

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

Pengujian

Pengujian unit

LocalCommandClient adalah antarmuka, sehingga pengujian memungkinkan untuk menyediakan implementasi yang dapat diuji dengan mudah.

Pengujian integrasi

Informasi berikut akan diperlukan untuk pengujian dengan Android Device Policy:

  1. Nama paket aplikasi ekstensi.
  2. Hash SHA-256 berenkode heksadesimal dari Tanda Tangan yang terkait dengan paket aplikasi.
  3. Secara opsional, jika callback pengujian - nama layanan yang sepenuhnya memenuhi syarat dari layanan yang baru diperkenalkan untuk mendukung callback. (Nama CommandService yang sepenuhnya memenuhi syarat dalam contoh).