कई उपयोगकर्ताओं को मैनेज करना

इस डेवलपर की गाइड में बताया गया है कि आपकी डिवाइस नीति नियंत्रक (DPC) किस तरह काम कर सकती है खास तरह के डिवाइसों पर कई Android उपयोगकर्ताओं को मैनेज करने की सुविधा मिलती है.

खास जानकारी

आपके डीपीसी की मदद से कई लोग एक खास डिवाइस को शेयर कर सकते हैं. आपका DPC जो पूरी तरह से मैनेज किए जा रहे डिवाइस पर काम करते हैं, दो तरह के उपयोगकर्ता बनाए और मैनेज किए जा सकते हैं:

  • सेकंडरी यूज़र वे Android उपयोगकर्ता होते हैं जिनके पास अलग-अलग ऐप्लिकेशन और डेटा सेव किया जाता है सेशन के बीच स्विच करें. एडमिन कॉम्पोनेंट की मदद से, उपयोगकर्ता को मैनेज किया जा सकता है. ये उपयोगकर्ता ऐसे मामलों में उपयोगी होता है, जहां डिवाइस को शिफ़्ट की शुरुआत में पिक अप किया जाता है, जैसे डिलीवरी ड्राइवर या सुरक्षा कर्मचारी.
  • कुछ समय के लिए उपयोगकर्ता ऐसे सेकंडरी उपयोगकर्ता होते हैं जिन्हें सिस्टम, उपयोगकर्ता के होने पर मिटा देता है बंद हो जाता है, स्विच दूर हो जाता है या डिवाइस फिर चालू हो जाता है. ये उपयोगकर्ता मामलों के लिए उपयोगी हैं जहां सेशन खत्म होने के बाद डेटा मिटाया जा सकता है. जैसे, सार्वजनिक ऐक्सेस कियॉस्क.

खास डिवाइस और दूसरे डिवाइस को मैनेज करने के लिए, अपने मौजूदा 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...
    }
}

Java

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  ...
}

Java

// 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 की 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)
}

Java

// 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 देखें कोऑर्डिनेशन पर सेट किया गया है.

यूज़र मैनेजमेंट

अगर आपको उपयोगकर्ता के लाइफ़साइकल को पूरी तरह से मैनेज करना है, तो इस बात पर बारीकी से कंट्रोल होना कि डिवाइस, उपयोगकर्ताओं को कब और कैसे बदलता है. उदाहरण के लिए, आपके उपयोगकर्ता को तब हटा सकता है, जब किसी डिवाइस का कुछ समय से इस्तेमाल नहीं किया गया हो या किसी व्यक्ति की शिफ़्ट खत्म होने से पहले, सर्वर को कोई भी ऐसा ऑर्डर न भेजें जो नहीं भेजा गया है.

लॉगआउट करें

Android 9.0 के ज़रिए लॉक स्क्रीन पर लॉग-आउट करने का बटन जोड़ा गया, ताकि डिवाइस अपना सत्र खत्म कर सकता है. बटन पर टैप करने के बाद, सिस्टम दूसरा उपयोगकर्ता, अगर यह कुछ समय के लिए है, तो उपयोगकर्ता को मिटा दिया जाता है और मुख्य उपयोगकर्ता वापस लौटता है वीडियो को फ़ोरग्राउंड में ले जाएं. जब मुख्य उपयोगकर्ता फ़ोरग्राउंड है, क्योंकि प्राइमरी यूज़र लॉग आउट नहीं कर सकता.

Android, डिफ़ॉल्ट रूप से सेशन खत्म करने का बटन नहीं दिखाता है. हालांकि, आपका एडमिन (किसी पूरी तरह से प्रबंधित डिवाइस) पर कॉल करके इसे चालू कर सकते हैं DevicePolicyManager.setLogoutEnabled(). अगर आपको बटन की मौजूदा स्थिति की पुष्टि करें, DevicePolicyManager.isLogoutEnabled().

दूसरे उपयोगकर्ता का एडमिन, उपयोगकर्ता को प्रोग्राम के हिसाब से लॉग आउट कर सकता है और वापस कर सकता है मुख्य उपयोगकर्ता को दिखाता है. सबसे पहले, यह पुष्टि करें कि सेकंडरी और मुख्य उपयोगकर्ता सहयोगी (अफ़िलिएट) है, फिर DevicePolicyManager.logoutUser() पर कॉल करें. अगर आपने लॉग आउट हो चुका उपयोगकर्ता एक अल्पकालिक उपयोगकर्ता है, तो सिस्टम बंद हो जाता है और फिर उपयोगकर्ता.

उपयोगकर्ताओं को स्विच करें

किसी दूसरे सेकंडरी उपयोगकर्ता पर स्विच करने के लिए, पूरी तरह से मैनेज किए जा रहे डिवाइस का एडमिन यह कर सकता है: DevicePolicyManager.switchUser() को कॉल करें. सुविधा के रूप में, आप मुख्य उपयोगकर्ता पर स्विच करने के लिए, null को पास कर सकता है.

उपयोगकर्ता को रोकना

किसी सेकंडरी उपयोगकर्ता को रोकने के लिए, पूरी तरह से मैनेज किए जा रहे डिवाइस का मालिकाना हक रखने वाला DPC कॉल कर सकता है DevicePolicyManager.stopUser(). अगर रोका गया उपयोगकर्ता थोड़े समय के लिए डिवाइस का इस्तेमाल करने वाला उपयोगकर्ता, उपयोगकर्ता को रोका जाता है और फिर मिटा दिया जाता है.

हमारा सुझाव है कि जब भी संभव हो उपयोगकर्ताओं को अपने डिवाइस की वाई-फ़ाई से नीचे रहने में मदद करें सक्रिय उपयोगकर्ताओं की अधिकतम संख्या.

उपयोगकर्ता को हटाना

किसी सेकंडरी उपयोगकर्ता को हमेशा के लिए मिटाने के लिए, DPC इनमें से किसी एक उपयोगकर्ता को कॉल कर सकता है DevicePolicyManager तरीका:

  • पूरी तरह से मैनेज किए जा रहे डिवाइस का एडमिन, removeUser() को कॉल कर सकता है.
  • सेकंडरी उपयोगकर्ता का एडमिन, wipeData() को कॉल कर सकता है.

सिस्टम, कुछ समय के लिए डिवाइस इस्तेमाल करने वाले ऐसे उपयोगकर्ताओं को मिटा देता है जो लॉग आउट होने, बंद किए जाने या स्विच किए गए होते हैं दूर हैं.

डिफ़ॉल्ट यूज़र इंटरफ़ेस (यूआई) को बंद करें

अगर आपका DPC, उपयोगकर्ताओं को मैनेज करने के लिए यूज़र इंटरफ़ेस (यूआई) उपलब्ध कराता है, तो 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)

Java

// 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 के पहले से मौजूद यूज़र इंटरफ़ेस (यूआई) से सेकंडरी उपयोगकर्ता नहीं जोड़ सकता क्योंकि पूरी तरह से प्रबंधित डिवाइस के व्यवस्थापक DISALLOW_ADD_USER उपयोगकर्ता पर लगी पाबंदी.

सेशन के मैसेज

जब डिवाइस का इस्तेमाल करने वाला व्यक्ति किसी नए उपयोगकर्ता पर स्विच करता है, तो Android इन कामों के लिए एक पैनल दिखाता है उस स्विच को हाइलाइट करें. Android यह मैसेज दिखाता है:

  • डिवाइस के सेकंडरी पर स्विच होने पर, उपयोगकर्ता के सेशन शुरू करने का मैसेज दिखता है प्राथमिक उपयोगकर्ता से उपयोगकर्ता.
  • डिवाइस के प्राइमरी उपयोगकर्ता को वापस आने पर, असली उपयोगकर्ता के सेशन का मैसेज दिखता है किसी सेकंडरी उपयोगकर्ता से मिला हो.

दो सेकंडरी उपयोगकर्ताओं के बीच स्विच करने पर, सिस्टम मैसेज नहीं दिखाता.

ऐसा हो सकता है कि मैसेज सभी स्थितियों के लिए सही न हों. इसलिए, इन्हें बदला जा सकता है इन मैसेज का टेक्स्ट. उदाहरण के लिए, अगर आपके समाधान में, कुछ समय के लिए प्रोफ़ाइल बनाने वाले उपयोगकर्ता का इस्तेमाल किया जाता है है, तो आप इसे संदेश में इस तरह देख सकते हैं: ब्राउज़र बंद करना सेशन और निजी डेटा मिटाया जा रहा है...

सिस्टम कुछ सेकंड के लिए ही मैसेज दिखाता है. इसलिए, हर मैसेज एक छोटा और साफ़ वाक्यांश होना चाहिए. मैसेज को पसंद के मुताबिक बनाने के लिए, आपका एडमिन कॉल कर सकता है 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)

Java

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

Java

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 के दो इंस्टेंस की ज़रूरत होती है—एक पूरी तरह से प्रबंधित डिवाइस हो, जबकि दूसरा डिवाइस, सेकंडरी उपयोगकर्ता का मालिक हो. कॉन्टेंट बनाते समय जब कोई नया उपयोगकर्ता होता है, तो पूरी तरह से मैनेज किए गए डिवाइस का एडमिन, खुद नए उपयोगकर्ता के एडमिन के तौर पर सेट होना चाहिए.

संबद्ध उपयोगकर्ता

इस डेवलपर की गाइड में मौजूद कुछ एपीआई सिर्फ़ तब काम करते हैं, जब सेकंडरी उपयोगकर्ता अफ़िलिएट हैं. क्योंकि 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 ...
}

Java

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)
}

Java

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

अन्य संसाधन

खास तरह के डिवाइसों के बारे में ज़्यादा जानने के लिए, ये दस्तावेज़ पढ़ें: