Aplikasi ekstensi dan perintah lokal

Android Management API (AMAPI) SDK memungkinkan aplikasi ekstensi yang ditentukan EMM untuk berkomunikasi langsung dengan Android Device Policy (ADP) dan menjalankan Commands di perangkat.

Berintegrasi dengan AMAPI SDK memberikan informasi lebih lanjut tentang pustaka ini dan cara menambahkannya ke aplikasi Anda.

Setelah SDK mengintegrasikan, aplikasi ekstensi Anda dapat berkomunikasi dengan ADP untuk:

Menerbitkan Perintah

Aplikasi ekstensi dapat meminta agar perintah dikeluarkan menggunakan ADP. IssueCommandRequest berisi objek permintaan yang akan berisi detail tentang perintah yang akan dikeluarkan dan parameter tertentu.

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 sebelumnya menunjukkan penerbitan permintaan data aplikasi yang jelas untuk paket dan menunggu sampai perintah itu berhasil dikeluarkan. Jika berhasil dikeluarkan, objek Command akan ditampilkan dengan status perintah dan ID perintah yang nantinya dapat digunakan untuk menanyakan status perintah yang berjalan lama.

Mendapatkan Perintah

Aplikasi ekstensi dapat melakukan kueri status permintaan perintah yang dikeluarkan sebelumnya. Kepada mengambil status perintah, Anda akan membutuhkan ID perintah (tersedia dari mengeluarkan permintaan perintah). Cuplikan berikut menunjukkan cara mengirim GetCommandRequest 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());
  }
  ...

Memproses callback perubahan status Perintah

Aplikasi ekstensi dapat mendaftarkan callback untuk menerima update perubahan status perintah yang berjalan lama dengan mengikuti langkah-langkah berikut:

  1. Perubahan status perintah diberitahukan ke CommandListener, implementasikan perintah ini di aplikasi Anda dan memberikan implementasi tentang cara menangani menerima pembaruan status.
  2. Perluas NotificationReceiverService dan berikan CommandListener di instance Compute Engine.
  3. Menentukan nama class NotificationReceiverService yang diperluas di Android Kebijakan 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 diekspor.

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

Konfigurasi Kebijakan

Agar aplikasi ekstensi dapat berkomunikasi langsung dengan ADP, EMM harus menyediakan kebijakan extensionConfig.

 "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 memungkinkan untuk menyediakan terlepas dari implementasi layanan.

Pengujian integrasi

Informasi berikut diperlukan untuk menguji dengan ADP:

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