একাধিক ব্যবহারকারীকে ম্যানেজ করা

এই ডেভেলপার গাইডে ব্যাখ্যা করা হয়েছে যে কীভাবে আপনার ডিভাইস নীতি কন্ট্রোলার (DPC) ডেডিকেটেড ডিভাইসে একাধিক Android ব্যবহারকারীকে ম্যানেজ করতে পারে।

এক নজরে

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

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

ডেডিকেটেড ডিভাইস ও সেকেন্ডারি ব্যবহারকারীদের ম্যানেজ করতে আপনি আগে থেকে থাকা DPC ব্যবহার করেন। আপনার DPC-তে একটি অ্যাডমিন কম্পোনেন্ট নতুন সেকেন্ডারি ব্যবহারকারী তৈরি করার সময় নিজেকে অ্যাডমিন হিসেবে সেট করে।

প্রাইমারি ব্যবহারকারী এবং দুজন সেকেন্ডারি ব্যবহারকারী।
ছবি ১. একই DPC থেকে অ্যাডমিন দ্বারা ম্যানেজ করা প্রাইমারি ও সেকেন্ডারি ব্যবহারকারী

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

ডেডিকেটেড ডিভাইসে একাধিক ব্যবহারকারীকে ম্যানেজ করার জন্য সাধারণত Android 9.0 প্রয়োজন হয়, তবে এই ডেভেলপার গাইডে ব্যবহৃত কিছু পদ্ধতি Android-এর আগের ভার্সনেও উপলভ্য।

সেকেন্ডারি ব্যবহারকারী

সেকেন্ডারি ব্যবহারকারীরা ওয়াই-ফাইয়ের সাথে কানেক্ট করতে এবং নতুন নেটওয়ার্ক কনফিগার করতে পারবেন। তবে, তারা নেটওয়ার্ক এডিট করতে বা মুছে ফেলতে পারবেন না, এমনকি তাদের তৈরি করা নেটওয়ার্কও নয়।

ব্যবহারকারী তৈরি করুন

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

  1. DevicePolicyManager.createAndManageUser() নম্বরে কল করুন। ক্ষণস্থায়ী ব্যবহারকারী তৈরি করতে, ফ্ল্যাগ আর্গুমেন্টে MAKE_USER_EPHEMERAL অন্তর্ভুক্ত করুন।
  2. ব্যাকগ্রাউন্ডে ব্যবহারকারীকে শুরু করতে DevicePolicyManager.startUserInBackground() কল করুন। ব্যবহারকারী রান করা শুরু করে কিন্তু আপনি চাইবেন ব্যবহারকারীকে ফোরগ্রাউন্ডে আনার আগে এবং ডিভাইস ব্যবহারকারী ব্যক্তিকে এটি দেখানোর আগে সেট-আপ সম্পূর্ণ করতে।
  3. সেকেন্ডারি ব্যবহারকারীর অ্যাডমিনে, DevicePolicyManager.setAffiliationIds() কল করুন যাতে নতুন ব্যবহারকারীকে প্রাইমারি ব্যবহারকারীর সাথে অ্যাফিলিয়েট করা যায়। নিচে DPC কোঅর্ডিনেশন দেখুন।
  4. সম্পূর্ণরূপে ম্যানেজ করা ডিভাইসের অ্যাডমিনে ফিরে গিয়ে, ব্যবহারকারীকে ফোরগ্রাউন্ডে সুইচ করতে DevicePolicyManager.switchUser() কল করুন।

আপনার DPC-তে কীভাবে ধাপ ১ যোগ করবেন তা নিম্নলিখিত স্যাম্পেল থেকে দেখুন:

Kotlin

val dpm = getContext().getSystemService(Context.DEVICE_POLICY_SERVICE)
        as DevicePolicyManager

// If possible, reuse an existing affiliation ID across the
// primary user and (later) the ephemeral user.
val identifiers = dpm.getAffiliationIds(adminName)
if (identifiers.isEmpty()) {
    identifiers.add(UUID.randomUUID().toString())
    dpm.setAffiliationIds(adminName, identifiers)
}

// Pass an affiliation ID to the ephemeral user in the admin extras.
val adminExtras = PersistableBundle()
adminExtras.putString(AFFILIATION_ID_KEY, identifiers.first())
// Include any other config for the new user here ...

// Create the ephemeral user, using this component as the admin.
try {
    val ephemeralUser = dpm.createAndManageUser(
            adminName,
            "tmp_user",
            adminName,
            adminExtras,
            DevicePolicyManager.MAKE_USER_EPHEMERAL or
                    DevicePolicyManager.SKIP_SETUP_WIZARD)

} catch (e: UserManager.UserOperationException) {
    if (e.userOperationResult ==
            UserManager.USER_OPERATION_ERROR_MAX_USERS) {
        // Find a way to free up users...
    }
}

জাভা

DevicePolicyManager dpm = (DevicePolicyManager)
    getContext().getSystemService(Context.DEVICE_POLICY_SERVICE);

// If possible, reuse an existing affiliation ID across the
// primary user and (later) the ephemeral user.
Set<String> identifiers = dpm.getAffiliationIds(adminName);
if (identifiers.isEmpty()) {
  identifiers.add(UUID.randomUUID().toString());
  dpm.setAffiliationIds(adminName, identifiers);
}

// Pass an affiliation ID to the ephemeral user in the admin extras.
PersistableBundle adminExtras = new PersistableBundle();
adminExtras.putString(AFFILIATION_ID_KEY, identifiers.iterator().next());
// Include any other config for the new user here ...

// Create the ephemeral user, using this component as the admin.
try {
  UserHandle ephemeralUser = dpm.createAndManageUser(
      adminName,
      "tmp_user",
      adminName,
      adminExtras,
      DevicePolicyManager.MAKE_USER_EPHEMERAL |
          DevicePolicyManager.SKIP_SETUP_WIZARD);

} catch (UserManager.UserOperationException e) {
  if (e.getUserOperationResult() ==
      UserManager.USER_OPERATION_ERROR_MAX_USERS) {
    // Find a way to free up users...
  }
}

আপনি যখন কোনও নতুন ব্যবহারকারী তৈরি বা শুরু করেন, তখন আপনি UserOperationException ব্যতিক্রম ধরে এবং getUserOperationResult() কল করে যেকোনও ব্যর্থতার কারণ চেক করতে পারেন। ব্যবহারকারীর সীমা অতিক্রম করা ব্যর্থতার সাধারণ কারণ:

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

শনাক্তকরণ

নতুন ব্যবহারকারী তৈরি করার পরে, আপনাকে একটি স্থায়ী ক্রমিক সংখ্যা সহ ব্যবহারকারীকে রেফার করতে হবে। UserHandle সেভ করে রাখবেন না কারণ আপনি ব্যবহারকারী তৈরি ও মুছে দেওয়ার সময় সিস্টেম এগুলি রিসাইকেল করে। UserManager.getSerialNumberForUser() নম্বরে কল করে সিরিয়াল নম্বর পান:

Kotlin

// After calling createAndManageUser() use a device-unique serial number
// (that isn’t recycled) to identify the new user.
secondaryUser?.let {
    val userManager = getContext().getSystemService(UserManager::class.java)
    val ephemeralUserId = userManager!!.getSerialNumberForUser(it)
    // Save the serial number to storage  ...
}

জাভা

// After calling createAndManageUser() use a device-unique serial number
// (that isn’t recycled) to identify the new user.
if (secondaryUser != null) {
  UserManager userManager = getContext().getSystemService(UserManager.class);
  long ephemeralUserId = userManager.getSerialNumberForUser(secondaryUser);
  // Save the serial number to storage  ...
}

ব্যবহারকারীর কনফিগারেশন

আপনার ব্যবহারকারীদের প্রয়োজন অনুযায়ী, আপনি সেকেন্ডারি ব্যবহারকারীদের সেটআপ কাস্টমাইজ করতে পারেন। createAndManageUser() কল করার সময় আপনি নিম্নলিখিত ফ্ল্যাগ অন্তর্ভুক্ত করতে পারবেন:

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

ব্যবহারকারীর লাইফসাইকেল অনুসরণ করা

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

onUserStarted()
সিস্টেম কোনও ব্যবহারকারীকে শুরু করার পরে কল করা হয়েছে। এই ব্যবহারকারী এখনও সেট-আপ করছেন অথবা ব্যাকগ্রাউন্ডে রান করছেন। আপনি startedUser আর্গুমেন্ট থেকে ব্যবহারকারীকে পেতে পারেন।
onUserSwitched()
সিস্টেম অন্য ব্যবহারকারীতে পরিবর্তন করার পরে কল করা হয়েছে। switchedUser আর্গুমেন্ট থেকে আপনি নতুন ব্যবহারকারী পেতে পারেন যা এখন ফোরগ্রাউন্ডে চলছে।
onUserStopped()
সিস্টেম কোনও ব্যবহারকারীকে থামানোর পরে কল করা হয় কারণ তারা লগ-আউট করেছেন, নতুন ব্যবহারকারীতে পরিবর্তন করেছেন (যদি ব্যবহারকারী ক্ষণস্থায়ী হয়) বা আপনার DPC ব্যবহারকারীকে থামিয়ে দিয়েছে। আপনি stoppedUser আর্গুমেন্ট থেকে ব্যবহারকারীকে পেতে পারেন।
onUserAdded()
সিস্টেম নতুন ব্যবহারকারী যোগ করলে কল করা হয়। সাধারণত, আপনার DPC কলব্যাক পেলে, সেকেন্ডারি ব্যবহারকারী সম্পূর্ণ সেট-আপ করা হয় না। আপনি newUser আর্গুমেন্ট থেকে ব্যবহারকারীকে পেতে পারেন।
onUserRemoved()
সিস্টেম কোনও ব্যবহারকারীকে মুছে দেওয়ার পরে কল করা হয়েছে। ব্যবহারকারীকে আগেই মুছে দেওয়া হয়েছে বলে, removedUser আর্গুমেন্ট দ্বারা উপস্থাপিত ব্যবহারকারীকে আপনি অ্যাক্সেস করতে পারবেন না।

সিস্টেম কখন কোনও ব্যবহারকারীকে ফোরগ্রাউন্ডে নিয়ে আসে বা ব্যাকগ্রাউন্ডে পাঠায় তা জানতে, অ্যাপ ACTION_USER_FOREGROUND এবং ACTION_USER_BACKGROUND ব্রডকাস্টের জন্য রিসিভার রেজিস্টার করতে পারে।

ব্যবহারকারীদের খুঁজে নিন

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

Kotlin

// The device is stored for the night. Stop all running secondary users.
dpm.getSecondaryUsers(adminName).forEach {
    dpm.stopUser(adminName, it)
}

জাভা

// The device is stored for the night. Stop all running secondary users.
for (UserHandle user : dpm.getSecondaryUsers(adminName)) {
  dpm.stopUser(adminName, user);
}

সেকেন্ডারি ব্যবহারকারীর স্ট্যাটাস জানতে আপনি অন্যান্য পদ্ধতি কল করতে পারেন:

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

ব্যবহারকারী পরিচালনা

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

লগ-আউট করুন

Android 9.0-এ লক স্ক্রিনে একটি লগ-আউট বোতাম যোগ করা হয়েছে যাতে ডিভাইস ব্যবহারকারী ব্যক্তি তার সেশন শেষ করতে পারেন। বোতামে ট্যাপ করার পরে, সিস্টেম সেকেন্ডারি ব্যবহারকারীকে বন্ধ করে দেয়, ব্যবহারকারী ক্ষণস্থায়ী হলে তাকে মুছে দেয় এবং প্রাইমারি ব্যবহারকারী ফোরগ্রাউন্ডে ফিরে আসে। প্রাইমারি ব্যবহারকারী ফোরগ্রাউন্ডে থাকলে Android বোতামটি লুকায় কারণ প্রাইমারি ব্যবহারকারী লগ-আউট করতে পারেন না।

Android ডিফল্ট হিসেবে সেশন শেষ করার বোতাম দেখায় না, তবে আপনার অ্যাডমিন (সম্পূর্ণভাবে ম্যানেজ করা ডিভাইসের) DevicePolicyManager.setLogoutEnabled()-এ কল করে এটি চালু করতে পারেন। বোতামের বর্তমান স্ট্যাটাস কনফার্ম করতে হলে, DevicePolicyManager.isLogoutEnabled() নম্বরে কল করুন।

সেকেন্ডারি ব্যবহারকারীর অ্যাডমিন প্রোগ্রাম্যাটিক্যালি ব্যবহারকারীকে লগ-আউট করতে এবং প্রাইমারি ব্যবহারকারীর কাছে ফিরে যেতে পারেন। প্রথমে, সেকেন্ডারি ও প্রাইমারি ব্যবহারকারী অ্যাফিলিয়েট করা আছে কিনা তা কনফার্ম করুন, তারপর DevicePolicyManager.logoutUser()-এ কল করুন। লগ-আউট করা ব্যবহারকারী যদি ক্ষণস্থায়ী ব্যবহারকারী হন, তাহলে সিস্টেম ব্যবহারকারীকে বন্ধ করে দেয় এবং তারপর মুছে দেয়।

ব্যবহারকারীদের স্যুইচ করুন

অন্য সেকেন্ডারি ব্যবহারকারীতে পরিবর্তন করতে, সম্পূর্ণভাবে ম্যানেজ করা ডিভাইসের অ্যাডমিন DevicePolicyManager.switchUser()-এ কল করতে পারেন। সুবিধার জন্য, আপনি প্রাইমারি ব্যবহারকারীতে পাল্টাতে null পাস করতে পারেন।

কোনও ব্যবহারকারীকে থামানো

সেকেন্ডারি ব্যবহারকারীকে থামাতে, সম্পূর্ণভাবে ম্যানেজ করা ডিভাইসের মালিকানা থাকা DPC DevicePolicyManager.stopUser() কল করতে পারে। বন্ধ করা ব্যবহারকারী যদি একজন ক্ষণস্থায়ী ব্যবহারকারী হন, তাহলে ব্যবহারকারীকে বন্ধ করা হয় এবং তারপর মুছে ফেলা হয়।

ডিভাইসে সর্বাধিক যতজন ব্যবহারকারী একসাথে কাজ করতে পারেন, সেই সংখ্যা যাতে অতিক্রম না হয়, তার জন্য আমরা যখনই সম্ভব ব্যবহারকারীদের কাজ বন্ধ করার পরামর্শ দিই।

ব্যবহারকারীকে মুছে ফেলা

সেকেন্ডারি ব্যবহারকারীকে স্থায়ীভাবে মুছে দিতে, DPC নিম্নলিখিত DevicePolicyManager পদ্ধতির মধ্যে যেকোনও একটি কল করতে পারে:

  • সম্পূর্ণ ম্যানেজ করা ডিভাইসের অ্যাডমিন removeUser()-এ কল করতে পারবেন।
  • সেকেন্ডারি ব্যবহারকারীর অ্যাডমিন wipeData() নম্বরে কল করতে পারেন।

ব্যবহারকারী লগ-আউট করলে, বন্ধ করলে বা অন্য কোনও অ্যাকাউন্টে সুইচ করলে, সিস্টেম ক্ষণস্থায়ী ব্যবহারকারীকে মুছে দেয়।

ডিফল্ট UI বন্ধ করুন

আপনার DPC ব্যবহারকারীদের ম্যানেজ করার জন্য UI প্রদান করলে, আপনি Android-এর বিল্ট-ইন মাল্টি-ইউজার ইন্টারফেস বন্ধ করতে পারবেন। আপনি DevicePolicyManager.setLogoutEnabled() কল করে এবং DISALLOW_USER_SWITCH বিধিনিষেধ যোগ করে এটি করতে পারেন, যেমনটি নিম্নলিখিত উদাহরণে দেখানো হয়েছে:

Kotlin

// Explicitly disallow logging out using Android UI (disabled by default).
dpm.setLogoutEnabled(adminName, false)

// Disallow switching users in Android's UI. This DPC can still
// call switchUser() to manage users.
dpm.addUserRestriction(adminName, UserManager.DISALLOW_USER_SWITCH)

জাভা

// Explicitly disallow logging out using Android UI (disabled by default).
dpm.setLogoutEnabled(adminName, false);

// Disallow switching users in Android's UI. This DPC can still
// call switchUser() to manage users.
dpm.addUserRestriction(adminName, UserManager.DISALLOW_USER_SWITCH);

যে ব্যক্তি ডিভাইসটি ব্যবহার করছেন তিনি Android-এর বিল্ট-ইন UI-এর মাধ্যমে সেকেন্ডারি ব্যবহারকারী যোগ করতে পারবেন না কারণ সম্পূর্ণভাবে ম্যানেজ করা ডিভাইসের অ্যাডমিন অটোমেটিক DISALLOW_ADD_USER ব্যবহারকারীর উপর বিধিনিষেধ যোগ করেন।

সেশন মেসেজ

ডিভাইস ব্যবহারকারী ব্যক্তি নতুন ব্যবহারকারীতে পাল্টে গেলে, Android একটি প্যানেল দেখায় যাতে পাল্টে যাওয়ার বিষয়টি হাইলাইট করা যায়। Android-এ নিম্নলিখিত মেসেজ দেখানো হয়:

  • ডিভাইস প্রাইমারি ব্যবহারকারী থেকে সেকেন্ডারি ব্যবহারকারীতে পাল্টে গেলে Start-user-session মেসেজ দেখানো হয়।
  • ডিভাইস সেকেন্ডারি ব্যবহারকারীর থেকে প্রাইমারি ব্যবহারকারীর কাছে ফিরে এলে ব্যবহারকারী-সেশন-শেষ মেসেজ দেখানো হয়।

দুটি সেকেন্ডারি ব্যবহারকারীর মধ্যে পরিবর্তন করার সময় সিস্টেম মেসেজ দেখায় না।

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

সিস্টেম মাত্র কয়েক সেকেন্ডের জন্য মেসেজ দেখায়, তাই প্রতিটি মেসেজ সংক্ষিপ্ত ও স্পষ্ট বাক্যাংশ হওয়া উচিত। মেসেজ কাস্টমাইজ করতে, আপনার অ্যাডমিন DevicePolicyManager মেথড setStartUserSessionMessage() এবং setEndUserSessionMessage() কল করতে পারেন, যেমনটি নিম্নলিখিত উদাহরণে দেখানো হয়েছে:

Kotlin

// Short, easy-to-read messages shown at the start and end of a session.
// In your app, store these strings in a localizable resource.
internal val START_USER_SESSION_MESSAGE = "Starting guest session…"
internal val END_USER_SESSION_MESSAGE = "Stopping & clearing data…"

// ...
dpm.setStartUserSessionMessage(adminName, START_USER_SESSION_MESSAGE)
dpm.setEndUserSessionMessage(adminName, END_USER_SESSION_MESSAGE)

জাভা

// Short, easy-to-read messages shown at the start and end of a session.
// In your app, store these strings in a localizable resource.
private static final String START_USER_SESSION_MESSAGE = "Starting guest session…";
private static final String END_USER_SESSION_MESSAGE = "Stopping & clearing data…";

// ...
dpm.setStartUserSessionMessage(adminName, START_USER_SESSION_MESSAGE);
dpm.setEndUserSessionMessage(adminName, END_USER_SESSION_MESSAGE);

আপনার কাস্টম মেসেজ মুছে দিতে এবং Android-এর ডিফল্ট মেসেজে ফিরে যেতে null পাস করুন। আপনাকে বর্তমান মেসেজের টেক্সট চেক করতে হলে, getStartUserSessionMessage() অথবা getEndUserSessionMessage()-এ কল করুন।

আপনার DPC-কে ব্যবহারকারীর বর্তমান লোকেলের জন্য লোকালাইজড মেসেজ সেট করতে হবে। ব্যবহারকারীর লোকেল পরিবর্তন হলে আপনাকে মেসেজও আপডেট করতে হবে:

Kotlin

override fun onReceive(context: Context?, intent: Intent?) {
    // Added the <action android:name="android.intent.action.LOCALE_CHANGED" />
    // intent filter for our DeviceAdminReceiver subclass in the app manifest file.
    if (intent?.action === ACTION_LOCALE_CHANGED) {

        // Android's resources return a string suitable for the new locale.
        getManager(context).setStartUserSessionMessage(
                getWho(context),
                context?.getString(R.string.start_user_session_message))

        getManager(context).setEndUserSessionMessage(
                getWho(context),
                context?.getString(R.string.end_user_session_message))
    }
    super.onReceive(context, intent)
}

জাভা

public void onReceive(Context context, Intent intent) {
  // Added the <action android:name="android.intent.action.LOCALE_CHANGED" />
  // intent filter for our DeviceAdminReceiver subclass in the app manifest file.
  if (intent.getAction().equals(ACTION_LOCALE_CHANGED)) {

    // Android's resources return a string suitable for the new locale.
    getManager(context).setStartUserSessionMessage(
        getWho(context),
        context.getString(R.string.start_user_session_message));

    getManager(context).setEndUserSessionMessage(
        getWho(context),
        context.getString(R.string.end_user_session_message));
  }
  super.onReceive(context, intent);
}

DPC কোঅর্ডিনেশন

সেকেন্ডারি ব্যবহারকারী ম্যানেজ করার জন্য সাধারণত আপনার DPC-এর দুটি ইনস্ট্যান্স প্রয়োজন—একটি সম্পূর্ণ ম্যানেজ করা ডিভাইসের মালিকানা গ্রহণ করে এবং অন্যটি সেকেন্ডারি ব্যবহারকারীর মালিকানা গ্রহণ করে। নতুন ব্যবহারকারী তৈরি করার সময়, সম্পূর্ণ ম্যানেজ করা ডিভাইসের অ্যাডমিন, নতুন ব্যবহারকারীর অ্যাডমিন হিসেবে নিজের আরেকটি ইনস্ট্যান্স সেট করে।

অ্যাফিলিয়েটেড ব্যবহারকারী

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

সেট-আপ করুন

লোকজনকে ব্যবহার করতে দেওয়ার আগে নতুন সেকেন্ডারি ব্যবহারকারী (সেকেন্ডারি ব্যবহারকারীর মালিকানা থাকা DPC থেকে) সেট-আপ করুন। আপনি DeviceAdminReceiver.onEnabled() কলব্যাক থেকে এই সেট-আপ করতে পারবেন। আপনি আগে createAndManageUser()-এ কলে কোনও অ্যাডমিন এক্সট্রা সেট করে থাকলে, আপনি intent আর্গুমেন্ট থেকে ভ্যালু পেতে পারেন। নিম্নলিখিত উদাহরণে দেখানো হয়েছে যে কীভাবে DPC কলব্যাকে নতুন সেকেন্ডারি ব্যবহারকারীকে অ্যাফিলিয়েট করে:

Kotlin

override fun onEnabled(context: Context?, intent: Intent?) {
    super.onEnabled(context, intent)

    // Get the affiliation ID (our DPC previously put in the extras) and
    // set the ID for this new secondary user.
    intent?.getStringExtra(AFFILIATION_ID_KEY)?.let {
        val dpm = getManager(context)
        dpm.setAffiliationIds(getWho(context), setOf(it))
    }
    // Continue setup of the new secondary user ...
}

জাভা

public void onEnabled(Context context, Intent intent) {
  // Get the affiliation ID (our DPC previously put in the extras) and
  // set the ID for this new secondary user.
  String affiliationId = intent.getStringExtra(AFFILIATION_ID_KEY);
  if (affiliationId != null) {
    DevicePolicyManager dpm = getManager(context);
    dpm.setAffiliationIds(getWho(context),
        new HashSet<String>(Arrays.asList(affiliationId)));
  }
  // Continue setup of the new secondary user ...
}

DPC-এর মধ্যে RPC

দুটি DPC ইনস্ট্যান্স আলাদা আলাদা ব্যবহারকারীর অধীনে চলছে, তবুও যে DPC-এর কাছে ডিভাইসের মালিকানা আছে এবং সেকেন্ডারি ব্যবহারকারী একে অপরের সাথে যোগাযোগ করতে পারে। অন্য DPC-এর পরিষেবা কল করলে ব্যবহারকারীর সীমা অতিক্রম হয়ে যায়, তাই আপনার DPC bindService() কল করতে পারবে না, যেমনটা আপনি সাধারণত Android-এ করে থাকেন। অন্য ব্যবহারকারীর ডিভাইসে চলা কোনও পরিষেবার সাথে বাইন্ড করতে, DevicePolicyManager.bindDeviceAdminServiceAsUser()-এ কল করুন।

প্রাইমারি ব্যবহারকারী এবং দুজন অ্যাফিলিয়েটেড সেকেন্ডারি ব্যবহারকারী RPC কল করছেন।
ছবি ২. অ্যাফিলিয়েটেড প্রাইমারি ও সেকেন্ডারি ব্যবহারকারীদের অ্যাডমিন পরিষেবা পদ্ধতি কল করছেন

আপনার DPC শুধুমাত্র DevicePolicyManager.getBindDeviceAdminTargetUsers()-এর মাধ্যমে ফেরত পাঠানো ব্যবহারকারীদের মধ্যে চলা পরিষেবার সাথে বাইন্ড করতে পারে। নিম্নলিখিত উদাহরণে দেখানো হয়েছে যে কীভাবে সেকেন্ডারি ব্যবহারকারীর অ্যাডমিনকে সম্পূর্ণ ম্যানেজ করা ডিভাইসের অ্যাডমিনের সাথে বাইন্ড করা হয়:

Kotlin

// From a secondary user, the list contains just the primary user.
dpm.getBindDeviceAdminTargetUsers(adminName).forEach {

    // Set up the callbacks for the service connection.
    val intent = Intent(mContext, FullyManagedDeviceService::class.java)
    val serviceconnection = object : ServiceConnection {
        override fun onServiceConnected(componentName: ComponentName,
                                        iBinder: IBinder) {
            // Call methods on service ...
        }
        override fun onServiceDisconnected(componentName: ComponentName) {
            // Clean up or reconnect if needed ...
        }
    }

    // Bind to the service as the primary user [it].
    val bindSuccessful = dpm.bindDeviceAdminServiceAsUser(adminName,
            intent,
            serviceconnection,
            Context.BIND_AUTO_CREATE,
            it)
}

জাভা

// From a secondary user, the list contains just the primary user.
List<UserHandle> targetUsers = dpm.getBindDeviceAdminTargetUsers(adminName);
if (targetUsers.isEmpty()) {
  // If the users aren't affiliated, the list doesn't contain any users.
  return;
}

// Set up the callbacks for the service connection.
Intent intent = new Intent(mContext, FullyManagedDeviceService.class);
ServiceConnection serviceconnection = new ServiceConnection() {
  @Override
  public void onServiceConnected(
      ComponentName componentName, IBinder iBinder) {
    // Call methods on service ...
  }

  @Override
  public void onServiceDisconnected(ComponentName componentName) {
    // Clean up or reconnect if needed ...
  }
};

// Bind to the service as the primary user.
UserHandle primaryUser = targetUsers.get(0);
boolean bindSuccessful = dpm.bindDeviceAdminServiceAsUser(
    adminName,
    intent,
    serviceconnection,
    Context.BIND_AUTO_CREATE,
    primaryUser);

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

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