Özel cihazlar için tarif defteri

Bu tarif defteri, geliştiricilerin ve sistem entegratörlerinin özel cihaz çözümlerini iyileştirmelerine yardımcı olur. Özel cihaz davranışlarına yönelik çözümler bulmak için "Nasıl yapılır?" tariflerimizi izleyin. Bu tarif defteri, halihazırda özel bir cihaz uygulaması olan geliştiriciler için en uygun seçenektir. Yeni başlıyorsanız Özel cihazlara genel bakış bölümünü okuyun.

Özel Ev uygulamaları

Bu tarifler, Android ana ekranının ve Launcher'ın yerini alacak bir uygulama geliştiriyorsanız işinize yarayacaktır.

Home uygulaması olun

Uygulamanızı cihazın ana ekran uygulaması olarak ayarlayabilirsiniz. Böylece cihaz başlatıldığında otomatik olarak başlatılması gerekir. İzin verilenler listesine eklenmiş uygulamanızı kilitli görev modunda ön plana getiren Ana Sayfa düğmesini de etkinleştirebilirsiniz.

Tüm ev uygulamaları CATEGORY_HOME amaç kategorisini işler. Sistem, ana ekran uygulamalarını bu şekilde tanır. Varsayılan ana ekran uygulaması olmak için aşağıdaki örnekte gösterildiği gibi DevicePolicyManager.addPersistentPreferredActivity() yöntemini çağırarak uygulamanızın etkinliklerinden birini tercih edilen Home intent işleyici olarak ayarlayın:

Kotlin

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

Java

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

Yine de uygulama manifest dosyanızda amaç filtresini aşağıdaki XML snippet'inde gösterildiği gibi beyan etmeniz gerekir:

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

Genelde başlatıcı uygulamanızın Genel Bakış ekranında görünmesini istemezsiniz. Ancak, Android Başlatıcısı sistem kilit görevi modunda çalışırken ilk olarak başlatılan etkinliği gizlediğinden, etkinlik beyanına excludeFromRecents etiketini eklemeniz gerekmez.

Ayrı görevleri göster

Her yeni görev Genel Bakış ekranında ayrı bir öğe olarak göründüğünden FLAG_ACTIVITY_NEW_TASK, başlatıcı türü uygulamalar için yararlı bir işaret olabilir. Genel bakış ekranındaki görevler hakkında daha fazla bilgi edinmek için Son Kullanılanlar Ekranı bölümünü okuyun.

Herkese açık kiosk'lar

Bu tarifler, herkese açık alanlarda gözetimsiz olarak çalışan cihazlar için idealdir ancak birçok özel cihaz kullanıcısının görevlerine odaklanmasına da yardımcı olabilir.

Cihazı kilitleyin

Cihazların amaçlarına uygun şekilde kullanıldığından emin olmak için tablo 1'de listelenen kullanıcı kısıtlamalarını ekleyebilirsiniz.

Tablo 1. Kiosk cihazlar için kullanıcı kısıtlamaları
Kullanıcı kısıtlaması Açıklama
DISALLOW_FACTORY_RESET Cihaz kullanıcısının cihazı fabrika varsayılan ayarlarına sıfırlamasını engeller. Tümüyle yönetilen cihazların yöneticileri ve birincil kullanıcı bu kısıtlamayı ayarlayabilir.
DISALLOW_SAFE_BOOT Cihaz kullanıcısının, cihazı sistem tarafından otomatik olarak başlatmayacağı güvenli modda başlatmasını engeller. Tümüyle yönetilen cihazların yöneticileri ve birincil kullanıcı bu kısıtlamayı ayarlayabilir.
DISALLOW_MOUNT_PHYSICAL_MEDIA Cihaz kullanıcısının, cihaza ekleyebileceği depolama birimlerini bağlamasını engeller. Tümüyle yönetilen cihazların yöneticileri ve birincil kullanıcı bu kısıtlamayı ayarlayabilir.
DISALLOW_ADJUST_VOLUME Cihazın sesini kapatır ve cihaz kullanıcısının ses düzeyi ile titreşim ayarlarını değiştirmesini önler. Kiosk'unuzda medya oynatma veya erişilebilirlik özellikleri için sese ihtiyaç duyulmadığından emin olun. Tümüyle yönetilen cihazların, birincil kullanıcı, ikincil kullanıcılar ve iş profillerinin yöneticileri bu kısıtlamayı ayarlayabilir.
DISALLOW_ADD_USER Cihaz kullanıcısının ikincil kullanıcılar veya kısıtlanmış kullanıcılar gibi yeni kullanıcılar eklemesini engeller. Sistem, bu kullanıcı kısıtlamasını tümüyle yönetilen cihazlara otomatik olarak ekler ancak bu kısıtlama silinmiş olabilir. Tümüyle yönetilen cihazların yöneticileri ve birincil kullanıcı bu kısıtlamayı ayarlayabilir.

Aşağıdaki snippet'te kısıtlamaları nasıl ayarlayabileceğiniz gösterilmektedir:

Kotlin

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

Java

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

BT yöneticisinin cihaz bakımında bu özellikleri kullanmaya devam edebilmesi için uygulamanız yönetici modundayken bu kısıtlamaları kaldırmak isteyebilirsiniz. Kısıtlamayı kaldırmak için DevicePolicyManager.clearUserRestriction() numaralı telefonu arayın.

Hata iletişim kutularını gizle

Perakende tanıtımları veya genel bilgi ekranları gibi bazı ortamlarda kullanıcılara hata iletişim kutuları göstermek istemeyebilirsiniz. Android 9.0 (API düzeyi 28) veya sonraki sürümlerde, çöken veya yanıt vermeyen uygulamalar için sistem hatası iletişim kutularını DISALLOW_SYSTEM_ERROR_DIALOGS kullanıcı kısıtlaması ekleyerek gizleyebilirsiniz. Sistem, yanıt vermeyen uygulamaları, cihaz kullanıcısı uygulamayı iletişim kutusundan kapatmış gibi yeniden başlatır. Aşağıdaki örnekte bunu nasıl yapabileceğiniz gösterilmektedir:

Kotlin

override fun onEnabled(context: Context, intent: Intent) {
    val dpm = getManager(context)
    val adminName = getWho(context)

    dpm.addUserRestriction(adminName, UserManager.DISALLOW_SYSTEM_ERROR_DIALOGS)
}

Java

public void onEnabled(Context context, Intent intent) {
  DevicePolicyManager dpm = getManager(context);
  ComponentName adminName = getWho(context);

  dpm.addUserRestriction(adminName, UserManager.DISALLOW_SYSTEM_ERROR_DIALOGS);
}

Bu kısıtlamayı birincil veya ikincil kullanıcının yöneticisi ayarlarsa sistem, yalnızca o kullanıcıyla ilgili hata iletişim kutularını engeller. Bu kısıtlamayı tümüyle yönetilen bir cihazın yöneticisi belirlerse sistem, tüm kullanıcılar için iletişim kutularını gizler.

Ekranı açık tutun

Kiosk oluşturuyorsanız uygulamanızın etkinliğini çalıştırırken cihazın uyku moduna geçmesini durdurabilirsiniz. FLAG_KEEP_SCREEN_ON düzen işaretini uygulamanızın penceresine aşağıdaki örnekte gösterildiği gibi ekleyin:

Kotlin

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

Java

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

Cihazın bir AC, USB veya kablosuz şarj cihazına takılı olup olmadığını kontrol edebilirsiniz. Pil değişikliği yayınlarına kaydolun ve şarj durumunu öğrenmek için BatteryManager değerlerini kullanın. Hatta cihazın fişi çekilmişse BT yöneticisine uzaktan uyarı gönderebilirsiniz. Adım adım talimatlar için Pil Seviyesini ve Şarj Durumunu İzleme konusunu okuyun.

Cihazı bir güç kaynağına bağlıyken uyanık tutmak için STAY_ON_WHILE_PLUGGED_IN genel ayarını da belirleyebilirsiniz. Android 6.0 (API düzeyi 23) veya sonraki sürümlerde tümüyle yönetilen cihazların yöneticileri, aşağıdaki örnekte gösterildiği gibi DevicePolicyManager.setGlobalSetting() kodunu çağırabilir:

Kotlin

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

Java

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

Uygulama paketleri

Bu bölümde, uygulamaları özel cihazlara verimli bir şekilde yüklemenizi sağlayacak tarifler bulunmaktadır.

Uygulama paketlerini önbelleğe alın

Paylaşılan bir cihazdaki kullanıcıların tümü ortak bir uygulama grubunu paylaşıyorsa, mümkün olduğunda uygulama indirmekten kaçınmak mantıklıdır. Android 9.0 (API düzeyi 28) veya sonraki sürümlerde, belirli bir kullanıcı grubuna sahip paylaşılan cihazlarda (ör. vardiya çalışanları cihazları) kullanıcı temel hazırlığını kolaylaştırmak için çok kullanıcılı oturumlar için gereken uygulama paketlerini (APK) önbelleğe alabilirsiniz.

Cihazda önceden yüklü olan önbelleğe alınmış bir APK'yı yükleme iki aşamada gerçekleşir:

  1. Tümüyle yönetilen bir cihazın (veya yetki verilen bir kullanıcının) yönetici bileşeni, cihazda tutulacak APK'ların listesini ayarlar.
  2. İlişkili ikincil kullanıcıların (veya yetki verilmiş kullanıcıların) yönetici bileşenleri, önbelleğe alınmış APK'yı kullanıcı adına yükleyebilir. Tümüyle yönetilen cihazın yöneticileri, birincil kullanıcı veya ilişkili bir iş profilinin (ya da yetki verilmiş kullanıcıları) yöneticileri de gerekirse önbelleğe alınan uygulamayı yükleyebilir.

Cihazda saklanacak APK'ların listesini ayarlamak için yönetici, DevicePolicyManager.setKeepUninstalledPackages() numarasını arar. Bu yöntem APK'nın cihazda yüklü olup olmadığını kontrol etmez. Bir uygulamayı kullanıcı için ihtiyaç duymadan hemen önce yüklemek istiyorsanız bu yöntem kullanışlıdır. Daha önce ayarlanan paketlerin listesini almak için DevicePolicyManager.getKeepUninstalledPackages() numarasını arayabilirsiniz. Değişikliklerle birlikte setKeepUninstalledPackages() çağrıldıktan veya ikincil bir kullanıcı silindiğinde sistem artık ihtiyaç duyulmayan önbelleğe alınmış APK'ları siler.

Önbelleğe alınmış bir APK'yı yüklemek için DevicePolicyManager.installExistingPackage() numaralı telefonu arayın. Bu yöntem yalnızca sistemin önceden önbelleğe aldığı bir uygulamayı yükleyebilir. Bu yöntemi çağırabilmeniz için önce özel cihaz çözümünüzün (veya bir cihazın kullanıcısının) uygulamayı cihaza yüklemesi gerekir.

Aşağıdaki örnekte, bu API çağrılarını tümüyle yönetilen bir cihazın ve ikincil kullanıcının yöneticisinde nasıl kullanabileceğiniz gösterilmektedir:

Kotlin

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

Java

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

Uygulamalara yetki verme

Uygulamaları önbelleğe almayı yönetmesi için başka bir uygulamaya yetki verebilirsiniz. Bunu, çözümünüzün özelliklerini ayırmak veya BT yöneticilerine kendi uygulamalarını kullanma olanağı sunmak için yapabilirsiniz. Yetki verilen uygulama, yönetici bileşenle aynı izinlere sahip olur. Örneğin, ikincil bir kullanıcının yöneticisinin uygulama yetkisi verilmiş bir kullanıcı installExistingPackage() numarasını arayabilir ancak setKeepUninstalledPackages() çağıramaz.

Yetki verilmiş bir DevicePolicyManager.setDelegatedScopes() çağrısı yapmak ve kapsamlar bağımsız değişkenine DELEGATION_KEEP_UNINSTALLED_PACKAGES öğesini eklemek için: Aşağıdaki örnekte, başka bir uygulamayı yetki verilmiş kullanıcı yapmak için yapmanız gerekenler gösterilmektedir:

Kotlin

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

Java

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

Her şey yolunda giderse yetki verilen uygulama, yayını ACTION_APPLICATION_DELEGATION_SCOPES_CHANGED alır ve yetki verilmiş kullanıcı olur. Uygulama, cihaz sahibi veya profil sahibi gibi bu kılavuzdaki yöntemleri çağırabilir. DevicePolicyManager yöntemlerini çağırırken yetki verilmiş kullanıcı, yönetici bileşeni bağımsız değişkeni için null değerini geçirir.

Uygulama paketlerini yükleyin

Bazen özel bir cihaza yerel olarak önbelleğe alınmış özel bir uygulama yüklemek yararlı olur. Örneğin, özel cihazlar genellikle bant genişliğinin sınırlı olduğu ortamlara veya internet bağlantısı olmayan alanlara dağıtılır. Özel cihaz çözümünüz müşterilerinizin bant genişliğine dikkat etmelidir. Uygulamanız, PackageInstaller sınıflarını kullanarak başka bir uygulama paketinin (APK) yüklenmesini başlatabilir.

Herhangi bir uygulama APK yükleyebilse de tümüyle yönetilen cihazlardaki yöneticiler kullanıcı etkileşimi olmadan paket yükleyebilir (veya kaldırabilir). Yönetici cihazı, ilişkili bir ikincil kullanıcıyı veya ilişkili bir iş profilini yönetebilir. Yükleme tamamlandıktan sonra, sistem tüm cihaz kullanıcılarının göreceği bir bildirim yayınlar. Bu bildirim, cihaz kullanıcılarına uygulamanın yöneticileri tarafından yüklendiği (veya güncellendiği) konusunda bilgilendirilir.

Tablo 2. Kullanıcı etkileşimi olmadan paket yüklemeyi destekleyen Android sürümleri
Android sürümü Yükleme ve kaldırma için yönetici bileşeni
Android 9.0 (API düzeyi 28) veya sonraki sürümler Tümüyle yönetilen cihazlarda ilişkili ikincil kullanıcılar ve iş profilleri
Android 6.0 (API düzeyi 23) veya sonraki sürümler Tümüyle yönetilen cihazlar

APK'nın bir veya daha fazla kopyasını özel cihazlara dağıtma şekliniz, cihazların ne kadar uzak olduğuna ve cihazların birbirinden ne kadar uzakta olduklarına bağlıdır. Çözümünüzün, APK'ları özel cihazlara yüklemeden önce güvenlikle ilgili en iyi uygulamaları izlemesi gerekir.

Bir veya daha fazla APK'yı yükleme için sıraya alan bir oturum oluşturmak amacıyla PackageInstaller.Session aracını kullanabilirsiniz. Aşağıdaki örnekte, etkinliğimizde (singleTop modu) durum geri bildirimi alıyoruz, ancak bir hizmet veya yayın alıcısını kullanabilirsiniz:

Kotlin

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

Java

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

Oturum, amaçları kullanarak yükleme hakkında durum geri bildirimi gönderir. Durumu öğrenmek için her amacın EXTRA_STATUS alanını kontrol edin. Cihaz kullanıcısının yüklemeyi onaylaması gerekmediği için yöneticilerin STATUS_PENDING_USER_ACTION durum güncellemesini almadığını unutmayın.

Uygulamaları kaldırmak için PackageInstaller.uninstall numaralı telefonu arayabilirsiniz. Tümüyle yönetilen cihazların, kullanıcıların ve iş profillerinin yöneticileri, desteklenen Android sürümlerini çalıştıran kullanıcı etkileşimi olmadan paketleri kaldırabilir (2. tabloya bakın).

Sistem güncellemelerini dondur

Android cihazlar, sistem ve uygulama yazılımına kablosuz (OTA) güncellemeler alır. Özel cihazlar, tatiller veya diğer yoğun zamanlar gibi kritik dönemlerde OS sürümünü dondurmak için OTA sistem güncellemelerini 90 güne kadar askıya alabilir. Daha fazla bilgi edinmek için Sistem güncellemelerini yönetme başlıklı makaleyi inceleyin.

Remote Config

Android'in yönetilen yapılandırmaları, BT yöneticilerinin uygulamanızı uzaktan yapılandırmasına olanak tanır. Uygulamanızı BT yöneticileri için daha kullanışlı hale getirmek amacıyla izin verilenler listeleri, ağ ana makineleri veya içerik URL'leri gibi ayarları ortaya çıkarabilirsiniz.

Uygulamanız yapılandırmasını gösteriyorsa bu ayarları belgelerinize eklemeyi unutmayın. Uygulamanızın yapılandırmasını gösterme ve ayarlardaki değişikliklere tepki verme hakkında daha fazla bilgi edinmek için Yönetilen yapılandırmaları ayarlama bölümünü okuyun.

Geliştirme kurulumu

Özel cihazlara yönelik çözümünüzü geliştirirken, uygulamanızı fabrika ayarlarına sıfırlamadan tümüyle yönetilen bir cihazın yöneticisi olarak ayarlamak bazen yararlı olabilir. Tümüyle yönetilen bir cihazın yöneticisini ayarlamak için aşağıdaki adımları uygulayın:

  1. Cihaz politikası denetleyici (DPC) uygulamanızı oluşturup cihaza yükleyin.
  2. Cihazda hiçbir hesap olmadığından emin olun.
  3. Android Debug Bridge (adb) kabuğunda aşağıdaki komutu çalıştırın. Örnekteki com.example.dpc/.MyDeviceAdminReceiver öğesini uygulamanızın yönetici bileşen adıyla değiştirmeniz gerekir:

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

Müşterilerin çözümünüzü dağıtmasına yardımcı olmak için diğer kayıt yöntemlerine göz atmanız gerekir. Özel cihazlar için QR kodu kaydını öneririz.

Ek kaynaklar

Özel cihazlar hakkında daha fazla bilgi edinmek için aşağıdaki dokümanları okuyun: