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

অ্যান্ড্রয়েড ম্যানেজমেন্ট এপিআই (AMAPI) SDK একটি EMM-নির্দিষ্ট এক্সটেনশন অ্যাপকে সরাসরি অ্যান্ড্রয়েড ডিভাইস পলিসি (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 এক্সটেন্ড করুন এবং getCommandListener মেথডের মাধ্যমে একটি CommandListener ইনস্ট্যান্স প্রদান করুন।
  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. অ্যাপ প্যাকেজের সাথে সংশ্লিষ্ট সিগনেচারের বেস৬৪-এনকোডেড SHA-256 হ্যাশ।
  3. ঐচ্ছিকভাবে, কলব্যাক পরীক্ষা করার জন্য, কলব্যাক সমর্থনকারী নতুন প্রবর্তিত সার্ভিসটির সম্পূর্ণ নাম (full qualified name) দিতে হবে। (উদাহরণে CommandService এর সম্পূর্ণ নাম)।