ডেডিকেটেড ডিভাইস রান্নার বই

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

কাস্টম হোম অ্যাপ

আপনি যদি অ্যান্ড্রয়েড হোম স্ক্রীন এবং লঞ্চার প্রতিস্থাপন করার জন্য একটি অ্যাপ তৈরি করেন তবে এই রেসিপিগুলি কার্যকর।

হোম অ্যাপ হোন

আপনি আপনার অ্যাপটিকে ডিভাইসের হোম অ্যাপ হিসাবে সেট করতে পারেন যাতে ডিভাইসটি শুরু হলে এটি স্বয়ংক্রিয়ভাবে চালু হয়। এছাড়াও আপনি হোম বোতামটি সক্ষম করতে পারেন যা আপনার অনুমোদিত অ্যাপটিকে লক টাস্ক মোডে অগ্রভাগে নিয়ে আসে।

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

কোটলিন

// 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 লঞ্চার-টাইপ অ্যাপ্লিকেশানগুলির জন্য একটি দরকারী পতাকা হতে পারে কারণ প্রতিটি নতুন টাস্ক ওভারভিউ স্ক্রিনে একটি পৃথক আইটেম হিসাবে উপস্থিত হয়৷ ওভারভিউ স্ক্রিনে কাজ সম্পর্কে আরও জানতে, সাম্প্রতিক স্ক্রীন পড়ুন।

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

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

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

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

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

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

কোটলিন

// 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 ব্যবহারকারী সীমাবদ্ধতা যোগ করে ক্র্যাশ বা প্রতিক্রিয়াশীল অ্যাপগুলির জন্য সিস্টেম ত্রুটি ডায়ালগগুলিকে দমন করতে পারেন৷ সিস্টেমটি প্রতিক্রিয়াহীন অ্যাপগুলিকে পুনরায় চালু করে যেন ডিভাইস ব্যবহারকারী ডায়ালগ থেকে অ্যাপটি বন্ধ করে দেয়। নিম্নলিখিত উদাহরণ দেখায় কিভাবে আপনি এটি করতে পারেন:

কোটলিন

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 লেআউট পতাকা যোগ করুন:

কোটলিন

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 স্তর 23) বা উচ্চতর, নিম্নলিখিত উদাহরণে দেখানো হিসাবে DevicePolicyManager.setGlobalSetting() কল করতে পারেন:

কোটলিন

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 লেভেল 28) বা তার পরের ব্যবহারকারীদের একটি নির্দিষ্ট সেটের সাথে শেয়ার করা ডিভাইসে ব্যবহারকারীর বিধানকে স্ট্রীমলাইন করতে, যেমন শিফট কর্মীদের জন্য ডিভাইস, আপনি বহু-ব্যবহারকারীর সেশনের জন্য প্রয়োজনীয় অ্যাপ প্যাকেজগুলি (APKs) ক্যাশে করতে পারেন৷

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

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

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

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

নিম্নলিখিত নমুনা দেখায় যে আপনি কীভাবে এই API কলগুলি সম্পূর্ণরূপে পরিচালিত ডিভাইস এবং সেকেন্ডারি ব্যবহারকারীর প্রশাসকের মধ্যে ব্যবহার করতে পারেন:

কোটলিন

// 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);

অ্যাপ্লিকেশানগুলি অর্পণ করুন

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

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

কোটলিন

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 9.0 (API স্তর 28) বা উচ্চতর অধিভুক্ত সেকেন্ডারি ব্যবহারকারী এবং কাজের প্রোফাইল—উভয়ই সম্পূর্ণরূপে পরিচালিত ডিভাইসে
Android 6.0 (API স্তর 23) বা উচ্চতর সম্পূর্ণরূপে পরিচালিত ডিভাইস

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

আপনি একটি সেশন তৈরি করতে PackageInstaller.Session ব্যবহার করতে পারেন যা ইনস্টলেশনের জন্য এক বা একাধিক APK সারিবদ্ধ করে। নিম্নলিখিত উদাহরণে আমরা আমাদের কার্যকলাপে স্ট্যাটাস প্রতিক্রিয়া পাই ( সিঙ্গেলটপ মোড) তবে আপনি একটি পরিষেবা বা সম্প্রচার রিসিভার ব্যবহার করতে পারেন:

কোটলিন

// 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 কল করতে পারেন। সম্পূর্ণরূপে পরিচালিত ডিভাইস, ব্যবহারকারী এবং কাজের প্রোফাইলের অ্যাডমিনরা সমর্থিত অ্যান্ড্রয়েড সংস্করণে ব্যবহারকারীর ইন্টারঅ্যাকশন ছাড়াই প্যাকেজগুলি আনইনস্টল করতে পারে ( টেবিল 2 দেখুন)।

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

অ্যান্ড্রয়েড ডিভাইসগুলি সিস্টেম এবং অ্যাপ্লিকেশন সফ্টওয়্যারে ওভার-দ্য-এয়ার (OTA) আপডেটগুলি গ্রহণ করে৷ ছুটির দিন বা অন্যান্য ব্যস্ত সময়গুলির মতো জটিল সময়গুলিতে OS সংস্করণ হিমায়িত করতে, উত্সর্গীকৃত ডিভাইসগুলি 90 দিন পর্যন্ত OTA সিস্টেম আপডেটগুলি স্থগিত করতে পারে৷ আরও জানতে, সিস্টেম আপডেটগুলি পরিচালনা করুন পড়ুন।

দূরবর্তী কনফিগারেশন

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

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

উন্নয়ন সেটআপ

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

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

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

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

অতিরিক্ত সম্পদ

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