ডেডিকেটেড ডিভাইস কুকবুক

এই কুকবুক ডেভেলপার ও সিস্টেম ইন্টিগ্রেটরদের তাদের ডেডিকেটেড ডিভাইস সলিউশন উন্নত করতে সাহায্য করে। ডেডিকেটেড-ডিভাইসের আচরণ সংক্রান্ত সমস্যার সমাধান খুঁজতে আমাদের কীভাবে-করবেন রেসিপি অনুসরণ করুন। এই কুকবুক সেইসব ডেভেলপারদের জন্য সবচেয়ে ভাল কাজ করে যাদের আগে থেকেই ডেডিকেটেড ডিভাইস অ্যাপ আছে—আপনি যদি সবে শুরু করে থাকেন, তাহলে ডেডিকেটেড ডিভাইসের ওভারভিউ পড়ুন।

কাস্টম Home অ্যাপ

আপনি Android হোম স্ক্রিন ও লঞ্চার পরিবর্তন করার জন্য কোনও অ্যাপ ডেভেলপ করলে, এই রেসিপিগুলি কাজে লাগবে।

হোম অ্যাপ হিসেবে সেট করা

আপনি নিজের অ্যাপকে ডিভাইসের হোম অ্যাপ হিসেবে সেট করতে পারেন যাতে ডিভাইস চালু হওয়ার সাথে সাথে এটি অটোমেটিক চালু হয়ে যায়। এছাড়াও, আপনি হোম বোতাম চালু করতে পারেন যা লক টাস্ক মোডে আপনার অনুমোদিত তালিকার অ্যাপকে ফোরগ্রাউন্ডে নিয়ে আসে।

সব হোম অ্যাপ CATEGORY_HOME ইনটেন্ট ক্যাটেগরি ম্যানেজ করে—এইভাবে সিস্টেম কোনও হোম অ্যাপকে শনাক্ত করে। ডিফল্ট হোম অ্যাপ হিসেবে সেট করতে, আপনার অ্যাপের কোনও একটি অ্যাক্টিভিটিকে পছন্দের হোম ইনটেন্ট হ্যান্ডলার হিসেবে সেট করুন, এর জন্য DevicePolicyManager.addPersistentPreferredActivity() কল করুন, যেমনটি নিম্নলিখিত উদাহরণে দেখানো হয়েছে:

Kotlin

// Create an intent filter to specify the Home category.
val filter = IntentFilter(Intent.ACTION_MAIN)
filter.addCategory(Intent.CATEGORY_HOME)
filter.addCategory(Intent.CATEGORY_DEFAULT)

// Set the activity as the preferred option for the device.
val activity = ComponentName(context, KioskModeActivity::class.java)
val dpm = context.getSystemService(Context.DEVICE_POLICY_SERVICE)
        as DevicePolicyManager
dpm.addPersistentPreferredActivity(adminName, filter, activity)

জাভা

// Create an intent filter to specify the Home category.
IntentFilter filter = new IntentFilter(Intent.ACTION_MAIN);
filter.addCategory(Intent.CATEGORY_HOME);
filter.addCategory(Intent.CATEGORY_DEFAULT);

// Set the activity as the preferred option for the device.
ComponentName activity = new ComponentName(context, KioskModeActivity.class);
DevicePolicyManager dpm =
    (DevicePolicyManager) context.getSystemService(Context.DEVICE_POLICY_SERVICE);
dpm.addPersistentPreferredActivity(adminName, filter, activity);

আপনাকে এখনও অ্যাপ ম্যানিফেস্ট ফাইলে ইনটেন্ট ফিল্টার ঘোষণা করতে হবে, যেমনটি নিম্নলিখিত XML স্নিপেটে দেখানো হয়েছে:

<activity
        android:name=".KioskModeActivity"
        android:label="@string/kiosk_mode"
        android:launchMode="singleInstance"
        android:excludeFromRecents="true">
    <intent-filter>
        <action android:name="android.intent.action.MAIN"/>
        <category android:name="android.intent.category.HOME"/>
        <category android:name="android.intent.category.DEFAULT"/>
    </intent-filter>
</activity>

সাধারণত, আপনি চাইবেন না যে আপনার লঞ্চার অ্যাপ ওভারভিউ স্ক্রিনে দেখা যাক। তবে, আপনাকে অ্যাক্টিভিটি ঘোষণায় excludeFromRecents যোগ করতে হবে না, কারণ সিস্টেম লক টাস্ক মোডে চলার সময় Android-এর লঞ্চার প্রথমে লঞ্চ করা অ্যাক্টিভিটি লুকিয়ে রাখে।

আলাদা আলাদা টাস্ক দেখুন

লঞ্চার-টাইপ অ্যাপের জন্য FLAG_ACTIVITY_NEW_TASK একটি উপযোগী ফ্ল্যাগ হতে পারে কারণ প্রতিটি নতুন টাস্ক ওভারভিউ স্ক্রিনে একটি আলাদা আইটেম হিসেবে দেখা যায়। ওভারভিউ স্ক্রিনে টাস্ক সম্পর্কে আরও জানতে, সাম্প্রতিক স্ক্রিন পড়ুন।

পাবলিক কিয়স্ক

এই রেসিপিগুলি সর্বজনীন স্থানে অযত্নহীন ডিভাইসের জন্য দুর্দান্ত তবে এটিও করতে পারে অনেক ডেডিকেটেড ডিভাইস ব্যবহারকারীদের তাদের কাজে ফোকাস করতে সাহায্য করুন।

ডিভাইস লক ডাউন করুন

ডিভাইসগুলি যাতে তাদের উদ্দেশ্যমূলক উদ্দেশ্যে ব্যবহার করা হয় তা নিশ্চিত করতে, আপনি সারণী ১-এ তালিকাভুক্ত ব্যবহারকারীর বিধিনিষেধ যোগ করতে পারেন।

টেবিল ১। কিয়স্ক ডিভাইসের জন্য ব্যবহারকারীর উপর বিধিনিষেধ
ব্যবহারকারীর উপর বিধিনিষেধ বর্ণনা
DISALLOW_FACTORY_RESET ডিভাইস ব্যবহারকারীকে ডিভাইসটি তার ফ্যাক্টরি ডিফল্টে রিসেট করা থেকে আটকায়। সম্পূর্ণ ম্যানেজ করা ডিভাইসের অ্যাডমিন এবং প্রাথমিক ব্যবহারকারী এই বিধিনিষেধ সেট করতে পারবেন।
DISALLOW_SAFE_BOOT ডিভাইস ব্যবহারকারীকে নিরাপদ মোডে ডিভাইস চালু করতে বাধা দেয় যেখানে সিস্টেম অটোমেটিক আপনার অ্যাপ চালু করবে না। সম্পূর্ণভাবে ম্যানেজ করা ডিভাইসের অ্যাডমিন এবং প্রাথমিক ব্যবহারকারী এই বিধিনিষেধ সেট করতে পারবেন।
DISALLOW_MOUNT_PHYSICAL_MEDIA ডিভাইস ব্যবহারকারীকে ডিভাইসের সাথে অ্যাটাচ করা যেকোনও স্টোরেজ ভলিউম মাউন্ট করা থেকে আটকায়। সম্পূর্ণ ম্যানেজ করা ডিভাইসের অ্যাডমিন এবং প্রাইমারি ব্যবহারকারী এই বিধিনিষেধ সেট করতে পারবেন।
DISALLOW_ADJUST_VOLUME ডিভাইস মিউট করে এবং ডিভাইস ব্যবহারকারীকে সাউন্ড ভলিউম ও ভাইব্রেশন সেটিংস পরিবর্তন করতে বাধা দেয়। আপনার কিয়স্কে মিডিয়া প্লেব্যাক বা অ্যাক্সেসিবিলিটি ফিচারের জন্য অডিওর প্রয়োজন নেই তা চেক করুন। সম্পূর্ণভাবে ম্যানেজ করা ডিভাইসের অ্যাডমিন, প্রাইমারি ব্যবহারকারী, সেকেন্ডারি ব্যবহারকারী এবং অফিস প্রোফাইল এই বিধিনিষেধ সেট করতে পারে।
DISALLOW_ADD_USER ডিভাইস ব্যবহারকারীকে নতুন ব্যবহারকারী যোগ করতে বাধা দেয়, যেমন সেকেন্ডারি ব্যবহারকারী বা সীমাবদ্ধ ব্যবহারকারী। সিস্টেম অটোমেটিক এই ব্যবহারকারীর বিধিনিষেধ সম্পূর্ণ ম্যানেজ করা ডিভাইসে যোগ করে, তবে এটি মুছে দেওয়া হয়ে থাকতে পারে। সম্পূর্ণভাবে ম্যানেজ করা ডিভাইসের অ্যাডমিন এবং প্রাথমিক ব্যবহারকারী এই বিধিনিষেধ সেট করতে পারবেন।

নিম্নলিখিত স্নিপেট থেকে আপনি কীভাবে বিধিনিষেধ সেট করবেন তা দেখানো হয়েছে:

Kotlin

// If the system is running in lock task mode, set the user restrictions
// for a kiosk after launching the activity.
arrayOf(
        UserManager.DISALLOW_FACTORY_RESET,
        UserManager.DISALLOW_SAFE_BOOT,
        UserManager.DISALLOW_MOUNT_PHYSICAL_MEDIA,
        UserManager.DISALLOW_ADJUST_VOLUME,
        UserManager.DISALLOW_ADD_USER).forEach { dpm.addUserRestriction(adminName, it) }

জাভা

// If the system is running in lock task mode, set the user restrictions
// for a kiosk after launching the activity.
String[] restrictions = {
    UserManager.DISALLOW_FACTORY_RESET,
    UserManager.DISALLOW_SAFE_BOOT,
    UserManager.DISALLOW_MOUNT_PHYSICAL_MEDIA,
    UserManager.DISALLOW_ADJUST_VOLUME,
    UserManager.DISALLOW_ADD_USER};

for (String restriction: restrictions) dpm.addUserRestriction(adminName, restriction);

আপনার অ্যাপ অ্যাডমিন মোডে থাকলে আপনি হয়ত এইসব বিধিনিষেধ সরাতে চাইবেন যাতে আইটি অ্যাডমিন ডিভাইস রক্ষণাবেক্ষণের জন্য এইসব ফিচার ব্যবহার করতে পারেন। বিধিনিষেধ সরিয়ে দিতে, DevicePolicyManager.clearUserRestriction() নম্বরে কল করুন।

সমস্যা সংক্রান্ত ডায়ালগ ব্লক করুন

কিছু পরিবেশে, যেমন রিটেল ডেমো বা সর্বজনীন তথ্য ডিসপ্লে, আপনি হয়ত ব্যবহারকারীদের সমস্যার ডায়ালগ দেখাতে চাইবেন না। Android 9.0 (API লেভেল 28) বা তার পরবর্তী যেকোনও ভার্সনে, ক্র্যাশ হওয়া বা কাজ না করা অ্যাপের জন্য সিস্টেমের ত্রুটি সংক্রান্ত ডায়ালগ আপনি DISALLOW_SYSTEM_ERROR_DIALOGS ব্যবহারকারীর সীমাবদ্ধতা যোগ করে বন্ধ করতে পারবেন। সিস্টেম এমনভাবে কাজ না করা অ্যাপ রিস্টার্ট করে যেন ডিভাইসের ব্যবহারকারী ডায়ালগ থেকে অ্যাপটি বন্ধ করে দিয়েছেন। আপনি কীভাবে এটি করতে পারেন তা নিম্নলিখিত উদাহরণ থেকে দেখুন:

Kotlin

override fun onEnabled(context: Context, intent: Intent) {
    val dpm = getManager(context)
    val adminName = getWho(context)

    dpm.addUserRestriction(adminName, UserManager.DISALLOW_SYSTEM_ERROR_DIALOGS)
}

জাভা

public void onEnabled(Context context, Intent intent) {
  DevicePolicyManager dpm = getManager(context);
  ComponentName adminName = getWho(context);

  dpm.addUserRestriction(adminName, UserManager.DISALLOW_SYSTEM_ERROR_DIALOGS);
}

প্রাইমারি বা সেকেন্ডারি ব্যবহারকারীর অ্যাডমিন এই বিধিনিষেধ সেট করলে, সিস্টেম শুধু সেই ব্যবহারকারীর জন্য সমস্যার ডায়ালগ বক্স দেখায় না। সম্পূর্ণরূপে ম্যানেজ করা ডিভাইসের অ্যাডমিন এই বিধিনিষেধ সেট করলে, সিস্টেম সব ব্যবহারকারীর জন্য ডায়ালগ বন্ধ করে দেয়।

স্ক্রিন চালু রাখুন

আপনি কিয়স্ক তৈরি করলে, আপনার অ্যাপের অ্যাক্টিভিটি চলাকালীন ডিভাইসকে স্লিপ মোডে যাওয়া থেকে আটকাতে পারবেন। নিচের উদাহরণে যেভাবে দেখানো হয়েছে সেই হিসেবে আপনার অ্যাপের উইন্ডোতে FLAG_KEEP_SCREEN_ON লেআউট ফ্ল্যাগ যোগ করুন:

Kotlin

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    // Keep the screen on and bright while this kiosk activity is running.
    window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON)
}

জাভা

@Override
protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);

  // Keep the screen on and bright while this kiosk activity is running.
  getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
}

ডিভাইসটি AC, USB বা ওয়্যারলেস চার্জারের সাথে প্লাগ-ইন করা আছে কিনা তা আপনি চেক করে দেখতে পারেন। ব্যাটারি-পরিবর্তন ব্রডকাস্টের জন্য রেজিস্টার করুন এবং চার্জিং স্ট্যাটাস জানতে BatteryManager ভ্যালু ব্যবহার করুন। এমনকি ডিভাইস আনপ্লাগ হয়ে গেলে আপনি আইটি অ্যাডমিনকে রিমোট অ্যালার্ট পাঠাতে পারবেন। ধাপে-ধাপে দেওয়া নির্দেশাবলীর জন্য, ব্যাটারি লেভেল ও চার্জিংয়ের স্ট্যাটাস মনিটর করুন পড়ুন।

এছাড়াও, আপনি STAY_ON_WHILE_PLUGGED_IN গ্লোবাল সেটিং সেট করতে পারেন যাতে পাওয়ার সোর্সের সাথে কানেক্ট করা অবস্থায় ডিভাইস চালু থাকে। Android 6.0 (API লেভেল ২৩) বা তার পরবর্তী ভার্সনে সম্পূর্ণভাবে ম্যানেজ করা ডিভাইসের অ্যাডমিনরা নিচের উদাহরণে দেখানো DevicePolicyManager.setGlobalSetting() কল করতে পারবেন:

Kotlin

val pluggedInto = BatteryManager.BATTERY_PLUGGED_AC or
        BatteryManager.BATTERY_PLUGGED_USB or
        BatteryManager.BATTERY_PLUGGED_WIRELESS
dpm.setGlobalSetting(adminName,
        Settings.Global.STAY_ON_WHILE_PLUGGED_IN, pluggedInto.toString())

জাভা

int pluggedInto = BatteryManager.BATTERY_PLUGGED_AC |
    BatteryManager.BATTERY_PLUGGED_USB |
    BatteryManager.BATTERY_PLUGGED_WIRELESS;
dpm.setGlobalSetting( adminName,
    Settings.Global.STAY_ON_WHILE_PLUGGED_IN, String.valueOf(pluggedInto));

অ্যাপ প্যাকেজ

এই বিভাগে ডেডিকেটেড ডিভাইসে দক্ষতার সাথে অ্যাপ ইনস্টল করার রেসিপি রয়েছে।

অ্যাপ প্যাকেজ ক্যাশে করুন

শেয়ার করা ডিভাইসের সব ব্যবহারকারী যদি একই অ্যাপের সেট শেয়ার করেন, তাহলে যতটা সম্ভব অ্যাপ ডাউনলোড করা এড়িয়ে যাওয়া উচিত। Android 9.0 (API লেভেল ২৮) বা তার পরবর্তী ভার্সনে, শিফটে কাজ করা কর্মীদের ডিভাইসের মতো নির্দিষ্ট সংখ্যক ব্যবহারকারীর শেয়ার করা ডিভাইসে ব্যবহারকারী প্রভিশনিং স্ট্রিমলাইন করতে, আপনি মাল্টি-ইউজার সেশনের জন্য প্রয়োজনীয় অ্যাপ প্যাকেজ (APK) ক্যাশে করতে পারবেন।

ক্যাশে করা APK (যা ডিভাইসে আগে থেকেই ইনস্টল করা আছে) ইনস্টল করার প্রসেস দুটি ধাপে সম্পন্ন হয়:

  1. সম্পূর্ণভাবে ম্যানেজ করা ডিভাইসের অ্যাডমিন কম্পোনেন্ট (বা কোনও প্রতিনিধি—নিচে দেখুন) ডিভাইসে রাখার জন্য APK-এর তালিকা সেট করে।
  2. অ্যাফিলিয়েটেড সেকেন্ডারি ব্যবহারকারীর (বা তার প্রতিনিধির) অ্যাডমিন কম্পোনেন্ট ব্যবহারকারীর হয়ে ক্যাশে করা APK ইনস্টল করতে পারবে। সম্পূর্ণভাবে ম্যানেজ করা ডিভাইসের অ্যাডমিন, প্রাথমিক ব্যবহারকারী বা অ্যাফিলিয়েটেড অফিস প্রোফাইল (বা তাদের প্রতিনিধি) প্রয়োজন হলে ক্যাশে করা অ্যাপ ইনস্টল করতে পারবেন।

ডিভাইসে রাখার জন্য APK-এর তালিকা সেট করতে, অ্যাডমিন DevicePolicyManager.setKeepUninstalledPackages() কল করেন। এই পদ্ধতিটি ডিভাইসে APK ইনস্টল করা আছে কিনা তা চেক করে না—এটি কার্যকর যদি আপনি ব্যবহারকারীর জন্য প্রয়োজন হওয়ার ঠিক আগে একটি অ্যাপ ইনস্টল করতে চান। আগে থেকে সেট করা প্যাকেজের তালিকা পেতে, আপনি DevicePolicyManager.getKeepUninstalledPackages() কল করতে পারেন। আপনি পরিবর্তন সহ setKeepUninstalledPackages() কল করার পরে অথবা সেকেন্ডারি ব্যবহারকারীকে মুছে দেওয়া হলে, সিস্টেম আর প্রয়োজন নেই এমন যেকোনও ক্যাশে করা APK মুছে দেয়।

ক্যাশে করা APK ইনস্টল করতে, DevicePolicyManager.installExistingPackage() কল করুন। এই পদ্ধতিটি শুধুমাত্র এমন একটি অ্যাপ ইনস্টল করতে পারে যা সিস্টেম ইতিমধ্যেই ক্যাশে করেছে—আপনার ডেডিকেটেড ডিভাইস সমাধান (বা ডিভাইসের ব্যবহারকারী) অবশ্যই প্রথমে অ্যাপটি ইনস্টল করতে হবে আপনি এই পদ্ধতি কল করার আগে ডিভাইসে.

সম্পূর্ণরূপে ম্যানেজ করা ডিভাইস এবং সেকেন্ডারি ব্যবহারকারীর অ্যাডমিনে আপনি কীভাবে এইসব API কল ব্যবহার করতে পারেন তা নিম্নলিখিত স্যাম্পেল থেকে জানতে পারবেন:

Kotlin

// Set the package to keep. This method assumes that the package is already
// installed on the device by managed Google Play.
val cachedAppPackageName = "com.example.android.myapp"
dpm.setKeepUninstalledPackages(adminName, listOf(cachedAppPackageName))

// ...

// The admin of a secondary user installs the app.
val success = dpm.installExistingPackage(adminName, cachedAppPackageName)

জাভা

// Set the package to keep. This method assumes that the package is already
// installed on the device by managed Google Play.
String cachedAppPackageName = "com.example.android.myapp";
List<String> packages = new ArrayList<String>();
packages.add(cachedAppPackageName);
dpm.setKeepUninstalledPackages(adminName, packages);

// ...

// The admin of a secondary user installs the app.
boolean success = dpm.installExistingPackage(adminName, cachedAppPackageName);

অ্যাপের দায়িত্ব অর্পণ করুন

অ্যাপ ক্যাশিং ম্যানেজ করার জন্য আপনি অন্য অ্যাপকে দায়িত্ব দিতে পারেন। আপনার সমাধানের ফিচার আলাদা করতে অথবা আইটি অ্যাডমিনদের নিজস্ব অ্যাপ ব্যবহার করার সুবিধা দিতে আপনি এটি করতে পারেন। প্রতিনিধি অ্যাপ অ্যাডমিন কম্পোনেন্টের মতো একই অনুমতি পায়। যেমন, সেকেন্ডারি ব্যবহারকারীর অ্যাডমিনের অ্যাপ ডেলিগেট installExistingPackage()-এ কল করতে পারলেও setKeepUninstalledPackages()-এ কল করতে পারবে না।

একটি ডেলিগেট কল করতে DevicePolicyManager.setDelegatedScopes() এবং অন্তর্ভুক্ত করুন DELEGATION_KEEP_UNINSTALLED_PACKAGES স্কোপ আর্গুমেন্টে। নিম্নলিখিত উদাহরণ থেকে আপনি জানতে পারবেন যে কীভাবে অন্য অ্যাপকে প্রতিনিধি হিসেবে সেট করবেন:

Kotlin

var delegatePackageName = "com.example.tools.kept_app_assist"

// Check that the package is installed before delegating.
try {
    context.packageManager.getPackageInfo(delegatePackageName, 0)
    dpm.setDelegatedScopes(
            adminName,
            delegatePackageName,
            listOf(DevicePolicyManager.DELEGATION_KEEP_UNINSTALLED_PACKAGES))
} catch (e: PackageManager.NameNotFoundException) {
    // The delegate app isn't installed. Send a report to the IT admin ...
}

জাভা

String delegatePackageName = "com.example.tools.kept_app_assist";

// Check that the package is installed before delegating.
try {
  context.getPackageManager().getPackageInfo(delegatePackageName, 0);
  dpm.setDelegatedScopes(
      adminName,
      delegatePackageName,
      Arrays.asList(DevicePolicyManager.DELEGATION_KEEP_UNINSTALLED_PACKAGES));
} catch (PackageManager.NameNotFoundException e) {
  // The delegate app isn't installed. Send a report to the IT admin ...
}

সবকিছু ঠিকঠাক থাকলে, ডেলিগেট অ্যাপ ACTION_APPLICATION_DELEGATION_SCOPES_CHANGED ব্রডকাস্ট পায় এবং ডেলিগেট হয়ে যায়। অ্যাপটি এই গাইডে উল্লিখিত পদ্ধতিগুলি কল করতে পারে, যেন এটি ডিভাইসের মালিক বা প্রোফাইলের মালিক। DevicePolicyManager মেথড কল করার সময়, প্রতিনিধি অ্যাডমিন কম্পোনেন্ট আর্গুমেন্টের জন্য null পাস করে।

অ্যাপ প্যাকেজ ইনস্টল করুন

কখনও কখনও ডেডিকেটেড ডিভাইসে স্থানীয়ভাবে ক্যাশে করা কাস্টম অ্যাপ ইনস্টল করা উপযোগী হয়। যেমন, ডেডিকেটেড ডিভাইস প্রায়শই সীমিত ব্যান্ডউইথ বা ইন্টারনেট কানেকশন নেই এমন পরিবেশে বা এলাকায় ব্যবহার করা হয়। আপনার ডেডিকেটেড ডিভাইস সলিউশন যেন আপনার গ্রাহকদের ব্যান্ডউইথের কথা মাথায় রাখে। আপনার অ্যাপ PackageInstaller ক্লাস ব্যবহার করে অন্য অ্যাপ প্যাকেজ (APK) ইনস্টল করা শুরু করতে পারে।

যেকোনও অ্যাপ APK ইনস্টল করতে পারলেও, সম্পূর্ণভাবে ম্যানেজ করা ডিভাইসের অ্যাডমিন ব্যবহারকারীর ইন্টার‍্যাকশন ছাড়াই প্যাকেজ ইনস্টল (বা আনইনস্টল) করতে পারবেন। অ্যাডমিন হয়ত ডিভাইস, অ্যাফিলিয়েট করা সেকেন্ডারি ব্যবহারকারী বা অ্যাফিলিয়েট করা অফিস প্রোফাইল ম্যানেজ করেন। ইনস্টলেশন সম্পূর্ণ হওয়ার পরে, সিস্টেম একটি বিজ্ঞপ্তি পোস্ট করে যা ডিভাইসের সব ব্যবহারকারী দেখতে পান। বিজ্ঞপ্তিটি ডিভাইস ব্যবহারকারীদের জানায় যে অ্যাপটি তাদের অ্যাডমিন দ্বারা ইনস্টল (বা আপডেট) করা হয়েছে।

টেবিল ২। ব্যবহারকারীর ইন্টার‍্যাকশন ছাড়াই প্যাকেজ ইনস্টলেশন কাজ করে এমন Android ভার্সন
Android ভার্সন ইনস্টল ও আনইনস্টল করার জন্য অ্যাডমিন কম্পোনেন্ট
Android 9.0 (API লেভেল 28) বা তার পরবর্তী যেকোনও ভার্সন অ্যাফিলিয়েট করা সেকেন্ডারি ব্যবহারকারী এবং অফিস প্রোফাইল—দু'টিই সম্পূর্ণভাবে ম্যানেজ করা ডিভাইসে
Android 6.0 (API লেভেল 23) বা তার পরবর্তী যেকোনও ভার্সন সম্পূর্ণরূপে ম্যানেজ করা ডিভাইস

আপনি কীভাবে এক বা একাধিক APK-র কপি ডেডিকেটেড ডিভাইসে ডিস্ট্রিবিউট করবেন তা নির্ভর করবে ডিভাইসগুলি কতটা দূরে আছে এবং সম্ভবত ডিভাইসগুলি একে অপরের থেকে কতটা দূরে আছে তার উপর। ডেডিকেটেড ডিভাইসে APK ইনস্টল করার আগে আপনার সমাধানকে নিরাপত্তা সংক্রান্ত পেশাদার পদ্ধতি অনুসরণ করতে হবে।

আপনি PackageInstaller.Session ব্যবহার করে এমন একটি সেশন তৈরি করতে পারেন যা ইনস্টল করার জন্য এক বা একাধিক APK-কে সারিবদ্ধ করে। নিম্নলিখিত উদাহরণে আমরা আমাদের অ্যাক্টিভিটিতে (singleTop মোড) স্ট্যাটাস ফিডব্যাক পাই কিন্তু আপনি কোনও পরিষেবা বা ব্রডকাস্ট রিসিভার ব্যবহার করতে পারেন:

Kotlin

// First, create a package installer session.
val packageInstaller = context.packageManager.packageInstaller
val params = PackageInstaller.SessionParams(
        PackageInstaller.SessionParams.MODE_FULL_INSTALL)
val sessionId = packageInstaller.createSession(params)
val session = packageInstaller.openSession(sessionId)

// Add the APK binary to the session. The APK is included in our app binary
// and is read from res/raw but file storage is a more typical location.
// The I/O streams can't be open when installation begins.
session.openWrite("apk", 0, -1).use { output ->
    getContext().resources.openRawResource(R.raw.app).use { input ->
        input.copyTo(output, 2048)
    }
}

// Create a status receiver to report progress of the installation.
// We'll use the current activity.
// Here we're requesting status feedback to our Activity but this can be a
// service or broadcast receiver.
val intent = Intent(context, activity.javaClass)
intent.action = "com.android.example.APK_INSTALLATION_ACTION"
val pendingIntent = PendingIntent.getActivity(context, 0, intent, 0)
val statusReceiver = pendingIntent.intentSender

// Start the installation. Because we're an admin of a fully managed device,
// there isn't any user interaction.
session.commit(statusReceiver)

জাভা

// First, create a package installer session.
PackageInstaller packageInstaller = context.getPackageManager().getPackageInstaller();
PackageInstaller.SessionParams params = new PackageInstaller.SessionParams(
    PackageInstaller.SessionParams.MODE_FULL_INSTALL);
int sessionId = packageInstaller.createSession(params);
PackageInstaller.Session session = packageInstaller.openSession(sessionId);

// Add the APK binary to the session. The APK is included in our app binary
// and is read from res/raw but file storage is a more typical location.
try (
    // These I/O streams can't be open when installation begins.
    OutputStream output = session.openWrite("apk", 0, -1);
    InputStream input = getContext().getResources().openRawResource(R.raw.app);
) {
  byte[] buffer = new byte[2048];
  int n;
  while ((n = input.read(buffer)) >= 0) {
    output.write(buffer, 0, n);
  }
}

// Create a status receiver to report progress of the installation.
// We'll use the current activity.
// Here we're requesting status feedback to our Activity but this can be a
// service or broadcast receiver.
Intent intent = new Intent(context, getActivity().getClass());
intent.setAction("com.android.example.APK_INSTALLATION_ACTION");
PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, 0);
IntentSender statusReceiver = pendingIntent.getIntentSender();

// Start the installation. Because we're an admin of a fully managed device,
// there isn't any user interaction.
session.commit(statusReceiver);

ইনটেন্ট ব্যবহার করে ইনস্টলেশন সম্পর্কে সেশন স্ট্যাটাস সংক্রান্ত মতামত পাঠায়। স্ট্যাটাস জানতে প্রতিটি ইনটেন্টের EXTRA_STATUS ফিল্ড চেক করুন। মনে রাখবেন, অ্যাডমিনরা STATUS_PENDING_USER_ACTION স্ট্যাটাস আপডেট পান না কারণ ডিভাইস ব্যবহারকারীকে ইনস্টলেশন অনুমোদন করতে হয় না।

অ্যাপ আনইনস্টল করতে, আপনি PackageInstaller.uninstall-এ কল করতে পারেন। সম্পূর্ণভাবে ম্যানেজ করা ডিভাইস, ব্যবহারকারী ও অফিস প্রোফাইলের অ্যাডমিনরা, ব্যবহারকারীর ইন্টার‍্যাকশন ছাড়াই, মানানসই Android ভার্সন (সারণী ২ দেখুন) রান করা প্যাকেজ আনইনস্টল করতে পারবেন।

সিস্টেম আপডেট ফ্রিজ করুন

Android ডিভাইস সিস্টেম ও অ্যাপ্লিকেশন সফ্টওয়্যারের জন্য ওভার-দ্য-এয়ার (OTA) আপডেট পায়। ছুটির দিন বা অন্যান্য ব্যস্ত সময়ের মতো গুরুত্বপূর্ণ সময় OS ভার্সন ফ্রিজ করতে, ডেডিকেটেড ডিভাইস ৯০ দিন পর্যন্ত OTA সিস্টেম আপডেট সাসপেন্ড করতে পারে। আরও জানতে, সিস্টেম আপডেট ম্যানেজ করুন নিবন্ধটি পড়ুন।

রিমোট কনফিগ

Android-এর ম্যানেজ করা কনফিগারেশন আইটি অ্যাডমিনদের আপনার অ্যাপ রিমোটলি কনফিগার করার অনুমতি দেয়। আইটি অ্যাডমিনদের জন্য আপনার অ্যাপ আরও উপযোগী করে তুলতে, আপনি হয়ত হোয়াইটলিস্ট, নেটওয়ার্ক হোস্ট বা কন্টেন্ট URL-এর মতো সেটিংস প্রকাশ করতে চাইবেন।

আপনার অ্যাপ যদি এর কনফিগারেশন প্রকাশ করে, তাহলে আপনার ডকুমেন্টেশনে সেটিংস অন্তর্ভুক্ত করতে ভুলবেন না। আপনার অ্যাপের কনফিগারেশন প্রকাশ করা এবং সেটিংসে পরিবর্তন করার ব্যাপারে প্রতিক্রিয়া জানানোর বিষয়ে আরও জানতে, ম্যানেজ করা কনফিগারেশন সেট-আপ করুন নিবন্ধটি পড়ুন।

ডেভেলপমেন্ট সেট-আপ

ডেডিকেটেড ডিভাইসের জন্য সমাধান ডেভেলপ করার সময়, ফ্যাক্টরি রিসেট না করেই সম্পূর্ণরূপে ম্যানেজ করা ডিভাইসের অ্যাডমিন হিসেবে আপনার অ্যাপ সেট করা কখনও কখনও উপযোগী হয়। সম্পূর্ণরূপে ম্যানেজ করা ডিভাইসের অ্যাডমিন সেট করতে, এইসব ধাপ অনুসরণ করুন:

  1. ডিভাইসে আপনার ডিভাইস নীতি কন্ট্রোলার (DPC) অ্যাপ তৈরি ও ইনস্টল করুন।
  2. ডিভাইসে কোনও অ্যাকাউন্ট নেই তা চেক করুন।
  3. Android ডিবাগ ব্রিজ (adb) শেলে নিম্নলিখিত কমান্ড রান করুন। আপনাকে উদাহরণে com.example.dpc/.MyDeviceAdminReceiver-এর জায়গায় আপনার অ্যাপের অ্যাডমিন কম্পোনেন্টের নাম লিখতে হবে:

    adb shell dpm set-device-owner com.example.dpc/.MyDeviceAdminReceiver

গ্রাহকদের আপনার সমাধান ডিপ্লয় করতে সাহায্য করার জন্য, আপনাকে অন্যান্য এনরোলমেন্ট পদ্ধতি দেখতে হবে। ডেডিকেটেড ডিভাইসের জন্য আমরা QR-কোড এনরোলমেন্ট করার সাজেশন দিই।

অতিরিক্ত রিসোর্স

ডেডিকেটেড ডিভাইস সম্পর্কে আরও জানতে, নিম্নলিখিত ডকুমেন্ট পড়ুন: