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

এই বিকাশকারীর নির্দেশিকা ব্যাখ্যা করে যে কীভাবে আপনার ডিভাইস পলিসি কন্ট্রোলার (DPC) ডেডিকেটেড ডিভাইসে একাধিক Android ব্যবহারকারীদের পরিচালনা করতে পারে৷

ওভারভিউ

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

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

আপনি ডেডিকেটেড ডিভাইস এবং সেকেন্ডারি ব্যবহারকারীদের পরিচালনা করতে আপনার বিদ্যমান DPC ব্যবহার করেন। যখন আপনি তাদের তৈরি করেন তখন আপনার DPC-তে একটি প্রশাসক উপাদান নতুন মাধ্যমিক ব্যবহারকারীদের জন্য প্রশাসক হিসাবে সেট করে।

প্রাথমিক ব্যবহারকারী এবং দুই মাধ্যমিক ব্যবহারকারী।
চিত্র 1. একই DPC থেকে প্রশাসকদের দ্বারা পরিচালিত প্রাথমিক এবং মাধ্যমিক ব্যবহারকারীরা৷

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

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

মাধ্যমিক ব্যবহারকারী

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

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

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

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

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

কোটলিন

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() কল করে ক্রমিক নম্বর পান:

কোটলিন

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

কোটলিন

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

লগআউট

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

কোটলিন

// 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 সুইচটি হাইলাইট করার জন্য একটি প্যানেল দেখায়৷ অ্যান্ড্রয়েড নিম্নলিখিত বার্তাগুলি দেখায়:

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

দুটি মাধ্যমিক ব্যবহারকারীর মধ্যে স্যুইচ করার সময় সিস্টেমটি বার্তাগুলি দেখায় না।

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

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

কোটলিন

// 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 ব্যবহারকারীর বর্তমান লোকেলের জন্য স্থানীয় বার্তা সেট করা উচিত। ব্যবহারকারীর লোকেল পরিবর্তন হলে আপনাকে বার্তাগুলি আপডেট করতে হবে:

কোটলিন

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-এর দুটি দৃষ্টান্ত প্রয়োজন—একটি সম্পূর্ণরূপে পরিচালিত ডিভাইসের মালিক এবং অন্যটি সেকেন্ডারি ব্যবহারকারীর মালিক। একটি নতুন ব্যবহারকারী তৈরি করার সময়, সম্পূর্ণরূপে পরিচালিত ডিভাইসের প্রশাসক নতুন ব্যবহারকারীর প্রশাসক হিসাবে নিজেকে আরেকটি উদাহরণ সেট করে।

অধিভুক্ত ব্যবহারকারী

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

সেটআপ

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

কোটলিন

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() কল করুন।

প্রাথমিক ব্যবহারকারী এবং দুইটি অনুমোদিত মাধ্যমিক ব্যবহারকারী RPCs কে কল করছেন।
চিত্র 2. অ্যাফিলিয়েটেড প্রাইমারি এবং সেকেন্ডারি ব্যবহারকারীদের প্রশাসক কলিং পরিষেবা পদ্ধতি

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

কোটলিন

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

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

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