Bu geliştirici kılavuzunda, cihaz politikası denetleyicinizin (DPC) özel cihazlarda birden fazla Android kullanıcısını nasıl yönetebileceği açıklanmaktadır.
Genel bakış
DPC'niz, birden fazla kişinin tek bir özel cihazı paylaşmasına yardımcı olabilir. Tümüyle yönetilen bir cihazda çalışan DPC'niz iki tür kullanıcı oluşturabilir ve yönetebilir:
- İkincil kullanıcılar, ayrı uygulamaları ve oturumlar arasında kaydedilmiş verileri olan Android kullanıcılarıdır. Kullanıcıyı bir yönetici bileşeniyle yönetirsiniz. Bu kullanıcılar, cihazın vardiyanın başında teslim alındığı durumlarda (ör. teslimat şoförleri veya güvenlik çalışanları) faydalıdır.
- Geçici kullanıcılar, kullanıcı durduğunda, sistemden ayrıldığında veya cihaz yeniden başlatıldığında sistemin sildiği ikincil kullanıcılardır. Bu kullanıcılar, oturum sona erdikten sonra verilerin silinebileceği (ör. herkese açık internet kioskları) durumlarda kullanışlıdır.
Özel cihazı ve ikincil kullanıcıları yönetmek için mevcut DPC'nizi kullanırsınız. DPC'nizdeki bir yönetici bileşeni, yeni ikincil kullanıcıları oluşturduğunuzda kendisini bu kullanıcılar için yönetici olarak ayarlar.
İkincil kullanıcının yöneticileri, tümüyle yönetilen cihazın yöneticisiyle aynı pakete ait olmalıdır. Geliştirme sürecini basitleştirmek için cihaz ile ikincil kullanıcılar arasında bir yönetici paylaşmanızı öneririz.
Özel cihazlarda birden fazla kullanıcıyı yönetmek için genellikle Android 9.0 gerekir. Ancak bu geliştirici kılavuzunda kullanılan yöntemlerden bazıları Android'in önceki sürümlerinde de kullanılabilir.
Kullanıcı oluşturma
DPC'niz arka planda ek kullanıcılar oluşturabilir ve ardından bunları ön plana geçirebilir. Bu süreç hem ikincil hem de geçici kullanıcılar için hemen hemen aynıdır. Aşağıdaki adımları, tümüyle yönetilen cihazın ve ikincil kullanıcının yöneticilerine uygulayın:
DevicePolicyManager.createAndManageUser()
numaralı telefonu arayın. Geçici kullanıcı oluşturmak için flags bağımsız değişkenineMAKE_USER_EPHEMERAL
ifadesini ekleyin.- Kullanıcıyı arka planda başlatmak için
DevicePolicyManager.startUserInBackground()
numaralı telefonu arayın. Kullanıcı çalışmaya başlar, ancak kullanıcıyı ön plana getirip cihazı kullanan kişiye göstermeden önce kurulumu bitirmeniz gerekir. - İkincil kullanıcının yöneticisinde, yeni kullanıcıyı birincil kullanıcıyla ilişkilendirmek için
DevicePolicyManager.setAffiliationIds()
numarasını arayın. Aşağıdaki DPC koordinasyonu bölümüne bakın. - Kullanıcıyı ön plana geçirmek için tümüyle yönetilen cihazın yöneticisinde
DevicePolicyManager.switchUser()
numaralı telefonu arayın.
Aşağıdaki örnekte, 1. adımı DPC'nize nasıl ekleyebileceğiniz gösterilmektedir:
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... } }
Yeni bir kullanıcı oluşturduğunuzda veya başlattığınızda UserOperationException
istisnasını yakalayıp getUserOperationResult()
yöntemini çağırarak hataların nedenini kontrol edebilirsiniz. Kullanıcı sınırlarının aşılması, yaygın olarak görülen hata nedenleridir:
Kullanıcı oluşturma işlemi biraz zaman alabilir. Sık sık kullanıcı oluşturuyorsanız, çalışmaya hazır bir kullanıcıyı arka planda hazırlayarak kullanıcı deneyimini iyileştirebilirsiniz. Kullanıma hazır bir kullanıcının avantajları ile bir cihazda izin verilen maksimum kullanıcı sayısı arasında denge kurmanız gerekebilir.
Tanımlama
Yeni bir kullanıcı oluşturduktan sonra, kalıcı seri numarasıyla kullanıcıya başvurmalısınız. UserHandle
öğesini devam ettirmeyin çünkü siz kullanıcıları oluşturup silerken sistem bu değerleri geri dönüştürür. UserManager.getSerialNumberForUser()
numarasını arayarak seri numarasını öğrenin:
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 ... }
Kullanıcı yapılandırması
Kullanıcılarınızın ihtiyaçlarına bağlı olarak, ikincil kullanıcıların ayarlarını özelleştirebilirsiniz. createAndManageUser()
çağırırken aşağıdaki işaretleri ekleyebilirsiniz:
SKIP_SETUP_WIZARD
- Güncellemeleri kontrol edip yükleyen, kullanıcıdan Google hizmetleriyle birlikte bir Google Hesabı eklemesini isteyen ve ekran kilidi ayarlayan yeni kullanıcı kurulum sihirbazını çalıştırmayı atlar. Bu işlem biraz zaman alabilir ve tüm kullanıcılar (örneğin, herkese açık internet kioskları) için geçerli olmayabilir.
LEAVE_ALL_SYSTEM_APPS_ENABLED
- Tüm sistem uygulamalarını yeni kullanıcıda etkin durumda bırakır. Bu işareti ayarlamazsanız yeni kullanıcı, telefonun çalıştırması gereken minimum uygulama grubunu (genellikle bir dosya tarayıcısı, telefon numara çevirici, kişiler ve SMS mesajları) içerir.
Kullanıcı yaşam döngüsünü takip edin
DPC'niz (tamamen yönetilen cihazın yöneticisiyseniz) ikincil kullanıcıların ne zaman değiştiğini bilmek yararlı olabilir. Değişikliklerden sonra takip görevleri çalıştırmak için DPC'nizin DeviceAdminReceiver
alt sınıfında aşağıdaki geri çağırma yöntemlerini geçersiz kılın:
onUserStarted()
- Sistem, kullanıcıyı başlattıktan sonra çağrılır. Bu kullanıcı kurulum aşamasında veya arka planda çalışıyor olabilir. Kullanıcıyı
startedUser
bağımsız değişkeninden edinebilirsiniz. onUserSwitched()
- Sistem farklı bir kullanıcıya geçtikten sonra çağrılır. Ön planda çalışan yeni kullanıcıyı
switchedUser
bağımsız değişkeninden edinebilirsiniz. onUserStopped()
- Oturumu kapattığı, yeni bir kullanıcıya geçtiği (kullanıcı geçiciyse) veya DPC'niz kullanıcıyı durdurduğu için sistem kullanıcıyı durdurduktan sonra çağrılır. Kullanıcıyı
stoppedUser
bağımsız değişkeninden öğrenebilirsiniz. onUserAdded()
- Sistem yeni bir kullanıcı eklediğinde çağrılır. Genellikle, DPC'niz geri çağırmayı aldığında ikincil kullanıcılar tam olarak ayarlanmamıştır. Kullanıcıyı
newUser
bağımsız değişkeninden öğrenebilirsiniz. onUserRemoved()
- Sistem, kullanıcıyı sildikten sonra çağrılır. Kullanıcı zaten silindiğinden
removedUser
bağımsız değişkeniyle temsil edilen kullanıcıya erişemezsiniz.
Uygulamalar, sistemin bir kullanıcıyı ne zaman ön plana getirdiğini veya arka plana ne zaman gönderdiğini öğrenmek amacıyla ACTION_USER_FOREGROUND
ve ACTION_USER_BACKGROUND
yayınları için bir alıcı kaydedebilir.
Kullanıcıları keşfedin
Tüm ikincil kullanıcıları almak için tümüyle yönetilen bir cihazın yöneticisi DevicePolicyManager.getSecondaryUsers()
numaralı telefonu arayabilir. Sonuçlar, yöneticinin oluşturduğu tüm ikincil veya geçici kullanıcıları içerir. Sonuçlar, cihazı kullanan bir kişinin oluşturmuş olabileceği ikincil kullanıcılar (veya bir misafir kullanıcı) da içerir. İkincil kullanıcı olmadıkları için sonuçlar, iş profillerini içermez. Aşağıdaki örnekte bu yöntemi nasıl kullanabileceğiniz gösterilmektedir:
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); }
İkincil kullanıcıların durumunu öğrenmek için kullanabileceğiniz diğer yöntemler şunlardır:
DevicePolicyManager.isEphemeralUser()
- Bu kullanıcının geçici bir kullanıcı olup olmadığını öğrenmek için ikincil bir kullanıcının yöneticisinden bu yöntemi çağırın.
DevicePolicyManager.isAffiliatedUser()
- Bu kullanıcının birincil kullanıcıyla ilişkili olup olmadığını öğrenmek için ikincil bir kullanıcının yöneticisinden bu yöntemi çağırın. Satış ortaklığı hakkında daha fazla bilgi edinmek için aşağıdaki DPC koordinasyonu bölümünü inceleyin.
Kullanıcı yönetimi
Kullanıcı yaşam döngüsünü tamamen yönetmek istiyorsanız cihazın kullanıcıları ne zaman ve nasıl değiştireceği konusunda ayrıntılı kontrol için API'leri çağırabilirsiniz. Örneğin, bir cihaz belirli bir süre kullanılmadığında bir kullanıcıyı silebilir veya kullanıcının vardiyası tamamlanmadan önce gönderilmemiş siparişleri bir sunucuya gönderebilirsiniz.
Çıkış
Android 9.0, cihazı kullanan bir kişinin oturumunu sonlandırabilmesi için kilit ekranına bir çıkış yapma düğmesi ekledi. Düğmeye dokunulduktan sonra sistem, ikincil kullanıcıyı durdurur, geçici bir kullanıcıysa kullanıcıyı siler ve birincil kullanıcı ön plana döner. Birincil kullanıcı çıkış yapamadığı için Android, birincil kullanıcı ön plandayken düğmeyi gizler.
Android, oturumu sonlandır düğmesini varsayılan olarak göstermez ancak yöneticiniz (tümüyle yönetilen bir cihazın) DevicePolicyManager.setLogoutEnabled()
çağrısıyla bu düğmeyi etkinleştirebilir. Düğmenin mevcut durumunu onaylamanız gerekiyorsa DevicePolicyManager.isLogoutEnabled()
numaralı telefonu arayın.
İkincil kullanıcının yöneticisi, programlı olarak kullanıcının oturumunu kapatabilir ve birincil kullanıcıya geri dönebilir. Öncelikle, ikincil ve birincil kullanıcıların ilişkili olduğunu onaylayın, ardından DevicePolicyManager.logoutUser()
adlı kullanıcıyı arayın. Oturumunu kapatan kullanıcı geçici bir kullanıcıysa sistem, kullanıcıyı siler ve siler.
Kullanıcı değiştir
Tümüyle yönetilen bir cihazın yöneticisi, farklı bir ikincil kullanıcıya geçmek için DevicePolicyManager.switchUser()
numarasını arayabilir. Kolaylık olması açısından null
hesabını kullanarak birincil kullanıcıya geçebilirsiniz.
Kullanıcıyı durdurma
İkincil bir kullanıcıyı durdurmak için tümüyle yönetilen bir cihaza sahip olan DPC, DevicePolicyManager.stopUser()
numaralı telefonu arayabilir. Durdurulan kullanıcı geçici bir kullanıcıysa kullanıcı durdurulur ve ardından silinir.
Cihazın maksimum çalışan kullanıcı sayısının altında kalmak için mümkün olduğunda kullanıcıları durdurmanızı öneririz.
Kullanıcı silme
İkincil bir kullanıcıyı kalıcı olarak silmek için DPC aşağıdaki DevicePolicyManager
yöntemlerinden birini çağırabilir:
- Tümüyle yönetilen bir cihazın yöneticisi
removeUser()
numaralı telefonu arayabilir. - İkincil kullanıcının bir yöneticisi
wipeData()
numarasını arayabilir.
Sistem, çıkış yaptıkları, durdurulduklarında veya geçiş yaptıklarında geçici kullanıcıları siler.
Varsayılan kullanıcı arayüzünü devre dışı bırak
DPC'niz kullanıcıları yönetmek için bir kullanıcı arayüzü sağlıyorsa Android'in yerleşik çok kullanıcılı arayüzünü devre dışı bırakabilirsiniz. Bu işlemi, DevicePolicyManager.setLogoutEnabled()
yöntemini çağırıp aşağıdaki örnekte gösterildiği gibi DISALLOW_USER_SWITCH
kısıtlamasını ekleyerek yapabilirsiniz:
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);
Tümüyle yönetilen cihazların yöneticileri DISALLOW_ADD_USER
kullanıcı kısıtlamasını otomatik olarak eklediğinden, cihazı kullanan kişi Android'in yerleşik kullanıcı arayüzüyle ikincil kullanıcı ekleyemez.
Oturum mesajları
Bir cihazı kullanan kişi yeni bir kullanıcıya geçiş yaptığında Android, anahtarı vurgulayan bir panel gösterir. Android aşağıdaki mesajları gösterir:
- Cihaz, birincil kullanıcıdan ikincil bir kullanıcıya geçiş yaptığında gösterilen kullanıcı oturumu başlatma mesajı.
- Cihaz, ikincil bir kullanıcıdan birincil kullanıcıya döndüğünde gösterilen son kullanıcı oturumu mesajı.
İki ikincil kullanıcı arasında geçiş yapıldığında sistem, mesajları göstermez.
Mesajlar her durum için uygun olmayabileceğinden bu mesajların metnini değiştirebilirsiniz. Örneğin, çözümünüz geçici kullanıcı oturumları kullanıyorsa bunu mesajlara şu şekilde yansıtabilirsiniz: Tarayıcı oturumunu durdurma ve kişisel verileri silme...
Sistem, mesajı birkaç saniyeliğine gösterir. Bu nedenle her mesaj, kısa ve net bir ifade olmalıdır. Mesajları özelleştirmek için yöneticiniz DevicePolicyManager
yöntemlerini
setStartUserSessionMessage()
ve
setEndUserSessionMessage()
aşağıdaki örnekte gösterildiği gibi çağırabilir:
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);
Özel mesajlarınızı silip Android'in varsayılan mesajlarına dönmek için null
mesajını iletin. Mevcut mesaj metnini kontrol etmeniz gerekiyorsa getStartUserSessionMessage()
veya getEndUserSessionMessage()
numaralı telefonu arayın.
DPC'niz, kullanıcının geçerli yerel ayarı için yerelleştirilmiş mesajlar belirlemelidir. Ayrıca, kullanıcının yerel ayarı değiştiğinde mesajları güncellemeniz gerekir:
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 koordinasyonu
İkincil kullanıcıları yönetmek için genellikle DPC'nizin iki örneği gerekir. Bu örneklerden biri tamamen yönetilen cihaza, diğeri ise ikincil kullanıcıya aittir. Tümüyle yönetilen cihazın yöneticisi yeni bir kullanıcı oluştururken yeni kullanıcının yöneticisi olarak kendisinin başka bir örneğini ayarlar.
İlişkili kullanıcılar
Bu geliştirici kılavuzundaki API'lerden bazıları yalnızca ikincil kullanıcılar ilişkili olduğunda çalışır. Android, cihaza yeni ilişkili olmayan ikincil kullanıcılar eklediğinizde (örneğin, ağ günlük kaydı) bazı özellikleri devre dışı bıraktığından kullanıcıları en kısa sürede ilişkilendirmeniz gerekir. Aşağıdaki Kurulum bölümündeki örneğe bakın.
Kurulum
Kullanıcıların kullanması için önce yeni ikincil kullanıcıları (ikincil kullanıcının sahibi olan DPC'den) oluşturun. Bu kurulumu DeviceAdminReceiver.onEnabled()
geri çağırmasından yapabilirsiniz. Daha önce createAndManageUser()
çağrısında yönetici ekstraları ayarladıysanız değerleri intent
bağımsız değişkeninden alabilirsiniz. Aşağıdaki örnekte, geri aramada yeni bir ikincil kullanıcıyı ilişkilendiren bir DPC gösterilmektedir:
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'ler arasındaki RPC'ler
İki DPC örneği ayrı kullanıcılar altında çalışıyor olsa da cihazın sahibi olan DPC'ler ve ikincil kullanıcılar birbiriyle iletişim kurabilir.
Başka bir DPC'nin hizmetini çağırmak kullanıcı sınırlarını aştığından DPC'niz bindService()
yöntemini normalde Android'de yaptığınız gibi çağıramaz. Başka bir kullanıcıda çalışan bir hizmete bağlanmak için DevicePolicyManager.bindDeviceAdminServiceAsUser()
numarasını arayın.
DPC'niz yalnızca DevicePolicyManager.getBindDeviceAdminTargetUsers()
tarafından döndürülen kullanıcılarda çalışan hizmetlere bağlanabilir.
Aşağıdaki örnekte tümüyle yönetilen cihazın yöneticisine bağlanan ikincil bir kullanıcı yöneticisi gösterilmektedir:
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);
Ek kaynaklar
Özel cihazlar hakkında daha fazla bilgi edinmek için aşağıdaki dokümanları okuyun:
- Özel cihazlara genel bakış, özel cihazlara genel bakıştır.
- Görev modunu kilitleme, özel bir cihazın tek bir uygulamaya veya uygulama grubuna nasıl kilitleneceğini açıklar.
- Özel cihazları kısıtlamak ve kullanıcı deneyimini geliştirmek için daha fazla örnek içeren özel cihazlar kullanım kılavuzu.