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

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

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

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 ऑब्जेक्ट दिखाया जाएगा. इसका इस्तेमाल, लंबे समय तक चलने वाले किसी भी निर्देश की स्थिति के बारे में क्वेरी करने के लिए किया जा सकता है.

Get 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 को बड़ा करें और getCommandListener तरीके से CommandListener इंस्टेंस दें.
  3. Android Management API की नीति में, एक्सटेंड किए गए NotificationReceiverService की क्लास का नाम बताएं (नीति कॉन्फ़िगरेशन देखें).

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

टेस्ट करना

यूनिट टेस्टिंग

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

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

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

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