এক্সটেনশন অ্যাপ্লিকেশন এবং স্থানীয় কমান্ড, এক্সটেনশন অ্যাপ্লিকেশন এবং স্থানীয় কমান্ড

Android ম্যানেজমেন্ট এপিআই (AMAPI) SDK একটি EMM-নির্দিষ্ট এক্সটেনশন অ্যাপকে Android ডিভাইস নীতি (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 অবজেক্ট বর্তমান কমান্ডের স্থিতি এবং কমান্ড আইডি সহ ফেরত দেওয়া হবে যা পরবর্তীতে দীর্ঘ চলমান কমান্ডের স্থিতি অনুসন্ধান করতে ব্যবহার করা যেতে পারে।

কমান্ড পান

একটি এক্সটেনশন অ্যাপ পূর্বে জারি করা কমান্ড অনুরোধের স্থিতি জিজ্ঞাসা করতে পারে। একটি কমান্ডের স্থিতি পুনরুদ্ধার করতে, আপনার কমান্ড আইডি প্রয়োজন হবে (ইস্যু কমান্ড অনুরোধ থেকে উপলব্ধ)। নিম্নলিখিত স্নিপেট দেখায় কিভাবে 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 উদাহরণ প্রদান করুন।
  3. অ্যান্ড্রয়েড ম্যানেজমেন্ট এপিআই নীতিতে বর্ধিত 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" />
    

নীতি কনফিগারেশন

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 এর সম্পূর্ণ যোগ্য নাম)।
,

Android ম্যানেজমেন্ট এপিআই (AMAPI) SDK একটি EMM-নির্দিষ্ট এক্সটেনশন অ্যাপকে Android ডিভাইস নীতি (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 অবজেক্ট বর্তমান কমান্ডের স্থিতি এবং কমান্ড আইডি সহ ফেরত দেওয়া হবে যা পরবর্তীতে দীর্ঘ চলমান কমান্ডের স্থিতি অনুসন্ধান করতে ব্যবহার করা যেতে পারে।

কমান্ড পান

একটি এক্সটেনশন অ্যাপ পূর্বে জারি করা কমান্ড অনুরোধের স্থিতি জিজ্ঞাসা করতে পারে। একটি কমান্ডের স্থিতি পুনরুদ্ধার করতে, আপনার কমান্ড আইডি প্রয়োজন হবে (ইস্যু কমান্ড অনুরোধ থেকে উপলব্ধ)। নিম্নলিখিত স্নিপেট দেখায় কিভাবে 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 উদাহরণ প্রদান করুন।
  3. অ্যান্ড্রয়েড ম্যানেজমেন্ট এপিআই নীতিতে বর্ধিত 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" />
    

নীতি কনফিগারেশন

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 এর সম্পূর্ণ যোগ্য নাম)।