AMAPI SDK के साथ इंटिग्रेट करना

AMAPI SDK टूल, ईएमएम के हिसाब से बनाया गया एक्सटेंशन ऐप्लिकेशन चालू करता है, ताकि वह सीधे Android Device Policy के साथ काम कर सके. फ़िलहाल, इसमें Commands को लोकल तौर पर लागू करने और सिर्फ़ ClearAppData कमांड के लिए सहायता शामिल है. SDK टूल के साथ इंटिग्रेट करने के लिए, नीचे दिया गया तरीका अपनाएं:

  1. एक्सटेंशन ऐप्लिकेशन में लाइब्रेरी जोड़ें.
  2. ज़रूरत के हिसाब से निर्देश जारी करने के लिए, दिए गए एपीआई का इस्तेमाल करें.
  3. अगर टारगेट SDK टूल >= 30 है, तो क्वेरी एलिमेंट जोड़ें.
  4. इसके अलावा, कमांड स्टेटस बदलने वाले कॉलबैक सुनने के लिए, सेवा लागू की जा सकती है.
  5. एक्सटेंसेबिलिटी नीति के साथ डिवाइस का प्रावधान करें.

ज़रूरी शर्तें

  • पक्का करें कि एक्सटेंशन ऐप्लिकेशन का minSdkVersion कम से कम एपीआई लेवल 21 पर सेट हो.

एक्सटेंशन ऐप्लिकेशन में लाइब्रेरी जोड़ी जा रही है

अपनी टॉप-लेवल बिल्ड.ग्रेडल फ़ाइल में Google Maven रिपॉज़िटरी जोड़ें. इसमें, SDK टूल की लाइब्रेरी को काम के मॉड्यूल में जोड़ें और लाइब्रेरी में डिपेंडेंसी जोड़ें:

repositories {
  ...
  google()
}

इसके बाद, लाइब्रेरी को अपने मॉड्यूल के डिपेंडेंसी ब्लॉक में जोड़ें:

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

Android Device Policy को अनुरोध भेजना

अब एडीपी को अनुरोध भेजा जा सकता है. ये अनुरोध स्वीकार किए जाते हैं.

समस्या से जुड़ा निर्देश

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

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

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

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

निर्देश पाएं

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

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

क्वेरी एलिमेंट जोड़ा जा रहा है

अगर आपका ऐप्लिकेशन, SDK टूल 30 और उसके बाद के वर्शन को टारगेट करता है, तो मेनिफ़ेस्ट में क्वेरी एलिमेंट की ज़रूरत होगी, ताकि यह बताया जा सके कि वह ADP के साथ इंटरैक्ट करेगा.

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

ज़्यादा जानकारी के लिए, Android पर पैकेज की जानकारी देखने की सुविधा को फ़िल्टर करना देखें.

निर्देश की स्थिति बदलने वाले कॉलबैक सुनें

  1. कमांड की स्थिति में होने वाले बदलावों की सूचना CommandListener को दी जाती है. इस इंटरफ़ेस को अपने ऐप्लिकेशन में लागू करें. साथ ही, यह भी बताएं कि मिलने वाले स्टेटस के अपडेट को कैसे मैनेज किया जाए.
  2. NotificationReceiverService को बढ़ाएं और CommandListener इंस्टेंस दें.
  3. Android management API नीति (नीति का कॉन्फ़िगरेशन देखें) में, expand NotificationReceiverService की क्लास का नाम तय करें.

    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. सेवा को अपने AndroidManifest.xml में जोड़ें और पक्का करें कि इसे एक्सपोर्ट कर दिया गया हो.

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

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

 "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 एक इंटरफ़ेस है और इसलिए टेस्टिंग की मदद से टेस्ट किया जा सकने वाला आसानी से लागू किया जा सकता है.

इंटिग्रेशन की जांच करना

Android Device Policy के साथ जांच करने के लिए, इस जानकारी की ज़रूरत होगी:

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