एक्सटेंशन ऐप्लिकेशन और लोकल निर्देश

Android Management API (AMAPI) SDK की मदद से, EMM के लिए तय किया गया एक्सटेंशन ऐप्लिकेशन, Android Device Policy (ADP) से सीधे कम्यूनिकेट कर सकता है. साथ ही, Commands डिवाइस पर को लागू कर सकता है.

AMAPI SDK के साथ इंटिग्रेट करने से, इस लाइब्रेरी के बारे में ज़्यादा जानकारी मिलती है. साथ ही, यह भी पता चलता है कि इसे अपने ऐप्लिकेशन में कैसे जोड़ा जाए.

एसडीके को इंटिग्रेट करने के बाद, आपका एक्सटेंशन ऐप्लिकेशन, ADP से इन कामों के लिए कम्यूनिकेट कर सकता है:

कमांड जारी करना

एक्सटेंशन ऐप्लिकेशन, ADP का इस्तेमाल करके कमांड जारी करने का अनुरोध कर सकता है. IssueCommandRequest में अनुरोध ऑब्जेक्ट होता है. इसमें जारी किए जाने वाले कमांड और खास पैरामीटर के बारे में जानकारी होती है.

यहां दिए गए स्निपेट में, पैकेज का डेटा मिटाने का अनुरोध जारी करने का तरीका बताया गया है:

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

पहले दिए गए उदाहरण में, तय किए गए पैकेज के लिए ऐप्लिकेशन का डेटा मिटाने का अनुरोध जारी करने और कमांड के सफलतापूर्वक जारी होने तक इंतज़ार करने का तरीका बताया गया है. अगर कमांड सफलतापूर्वक जारी हो जाता है, तो Command ऑब्जेक्ट दिखेगा. इसमें कमांड का मौजूदा स्टेटस और कमांड आईडी होगा. इसका इस्तेमाल, लंबे समय तक चलने वाले किसी भी कमांड का स्टेटस क्वेरी करने के लिए किया जा सकता है.

कमांड पाना

एक्सटेंशन ऐप्लिकेशन, पहले जारी किए गए कमांड के अनुरोधों का स्टेटस क्वेरी कर सकता है. कमांड का स्टेटस पाने के लिए, आपको कमांड आईडी की ज़रूरत होगी. यह आईडी, कमांड जारी करने के अनुरोध से उपलब्ध होता है. यहां दिए गए स्निपेट में, ADP को GetCommandRequest भेजने का तरीका बताया गया है.

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

कमांड के स्टेटस में होने वाले बदलावों के कॉलबैक के बारे में सूचनाएं पाना

एक्सटेंशन ऐप्लिकेशन, लंबे समय तक चलने वाले कमांड के स्टेटस में होने वाले बदलावों के बारे में अपडेट पाने के लिए, कॉलबैक रजिस्टर कर सकता है. इसके लिए, यह तरीका अपनाएं:

  1. कमांड के स्टेटस में होने वाले बदलावों के बारे में, CommandListener को सूचना दी जाती है. अपने ऐप्लिकेशन में इस इंटरफ़ेस को लागू करें और यह बताएं कि मिले हुए स्टेटस अपडेट को कैसे मैनेज किया जाए.
  2. NotificationReceiverService को बढ़ाएं और CommandListener इंस्टेंस उपलब्ध कराएं getCommandListener तरीके से.
  3. अपने ऐप्लिकेशन को COMPANION_APP की भूमिका असाइन करने के लिए, ऐप्लिकेशन की नीति कॉन्फ़िगर करें. इसके लिए, नीति का कॉन्फ़िगरेशन देखें.

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

नीति का कॉन्फ़िगरेशन

एक्सटेंशन ऐप्लिकेशन को ADP से सीधे कम्यूनिकेट करने की अनुमति देने के लिए, EMM को ऐप्लिकेशन की नीति में मौजूद roles फ़ील्ड का इस्तेमाल करके, ऐप्लिकेशन को COMPANION_APP की भूमिका असाइन करनी होगी.

 "applications": [{
   "packageName": "com.amapi.extensibility.demo",
   "installType": "FORCE_INSTALLED",
   "roles": [
     { "roleType": "COMPANION_APP" }
   ]
 }]

उपलब्ध अन्य विकल्पों के बारे में जानने के लिए, ऐप्लिकेशन की भूमिकाओं की नीतियों के साथ डिवाइस को प्रोविज़न करना देखें.

टेस्ट करना

यूनिट टेस्ट करना

LocalCommandClient एक इंटरफ़ेस है. इसलिए, यह टेस्ट किए जा सकने वाले तरीके को लागू करने की अनुमति देता है.

इंटिग्रेशन टेस्ट करना

ADP के साथ टेस्ट करने के लिए, आपको यह जानकारी देनी होगी:

  1. एक्सटेंशन ऐप्लिकेशन का पैकेज नाम.
  2. ऐप्लिकेशन पैकेज से जुड़े सिग्नेचर का base64-कोड में बदला गया SHA-256 हैश.
  3. ज़रूरी नहीं, अगर कॉलबैक की जांच की जा रही है, तो कॉलबैक की सुविधा देने के लिए, हाल ही में लॉन्च की गई सेवा का पूरी तरह क्वालिफ़ाइड नाम. (उदाहरण में, CommandService का पूरी तरह क्वालिफ़ाइड नाम).