Rezepte für zweckbestimmte Geräte

Dieses Kochbuch hilft Entwicklern und Systemintegratoren bei der Verbesserung ihrer Lösung für dezidierte Geräte. In unseren Anleitungen können Sie Lösungen für das Verhalten einzelner Geräte finden. Diese Rezeptesammlung eignet sich am besten für Entwickler, die bereits eine App für dedizierte Geräte haben. Wenn Sie gerade erst anfangen, lesen Sie den Artikel Übersicht über dedizierte Geräte.

Benutzerdefinierte Start-Apps

Diese Rezepte sind nützlich, wenn Sie eine App entwickeln, die den Android-Startbildschirm und den Android-Launcher ersetzt.

Die Home-App sein

Du kannst deine App als Start-App des Geräts festlegen, damit sie beim Hochfahren des Geräts automatisch gestartet wird. Sie können auch die Schaltfläche „Startseite“ aktivieren, damit die App auf der Zulassungsliste im Modus „Gesperrte Aufgabe“ im Vordergrund angezeigt wird.

Alle Start-Apps verarbeiten die Intent-Kategorie CATEGORY_HOME. So erkennt das System eine Start-App. Um sie zur Standard-Start-App zu machen, legen Sie eine der Aktivitäten Ihrer App als bevorzugten Home-Intent-Handler fest, indem Sie DevicePolicyManager.addPersistentPreferredActivity() aufrufen, wie im folgenden Beispiel gezeigt:

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

Sie müssen trotzdem den Intent-Filter in Ihrer App-Manifestdatei deklarieren, wie im folgenden XML-Snippet gezeigt:

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

Normalerweise möchten Sie nicht, dass Ihre Launcher-App auf dem Übersichtsbildschirm angezeigt wird. Du musst excludeFromRecents jedoch nicht zur Aktivitätsdeklaration hinzufügen, da der Android Launcher die anfangs gestartete Aktivität ausblendet, wenn das System im Modus zum Sperren von Aufgaben ausgeführt wird.

Separate Aufgaben anzeigen

FLAG_ACTIVITY_NEW_TASK kann ein nützliches Flag für Launcher-Apps sein, da jede neue Aufgabe als separates Element auf dem Übersichtsbildschirm angezeigt wird. Weitere Informationen zu Aufgaben auf dem Bildschirm „Übersicht“ finden Sie unter Bildschirm „Zuletzt verwendet“.

Öffentliche Kioske

Diese Rezepte eignen sich hervorragend für unbeaufsichtigte Geräte in öffentlichen Bereichen, können aber auch vielen Nutzern dezidierter Geräte helfen, sich auf ihre Aufgaben zu konzentrieren.

Gerät sperren

Damit die Geräte für den vorgesehenen Zweck verwendet werden, können Sie die in Tabelle 1 aufgeführten Nutzereinschränkungen hinzufügen.

Tabelle 1. Nutzereinschränkungen für Kioskgeräte
Nutzereinschränkung Beschreibung
DISALLOW_FACTORY_RESET Verhindert, dass Gerätenutzer das Gerät auf die Werkseinstellungen zurücksetzen. Administratoren vollständig verwalteter Geräte und der Hauptnutzer können diese Einschränkung festlegen.
DISALLOW_SAFE_BOOT Verhindert, dass ein Gerätenutzer das Gerät im abgesicherten Modus startet, in dem das System die App nicht automatisch startet. Administratoren von vollständig verwalteten Geräten und der Hauptnutzer können diese Einschränkung festlegen.
DISALLOW_MOUNT_PHYSICAL_MEDIA Verhindert, dass der Gerätenutzer Speicher-Volumes bereitstellt, die er möglicherweise an das Gerät angehängt hat. Administratoren von vollständig verwalteten Geräten und der Hauptnutzer können diese Einschränkung festlegen.
DISALLOW_ADJUST_VOLUME Schaltet das Gerät stumm und verhindert, dass der Gerätenutzer die Lautstärke und die Vibrationseinstellungen ändert. Achte darauf, dass dein Kiosk keinen Ton für die Medienwiedergabe oder Bedienungshilfen benötigt. Administratoren von vollständig verwalteten Geräten, den primären Nutzer, sekundäre Nutzer und Arbeitsprofile können diese Einschränkung festlegen.
DISALLOW_ADD_USER Verhindert, dass der Gerätenutzer neue Nutzer hinzufügt, z. B. sekundäre Nutzer oder eingeschränkte Nutzer. Das System fügt diese Nutzerbeschränkung automatisch auf vollständig verwalteten Geräten hinzu. Sie wurde jedoch möglicherweise aufgehoben. Administratoren von vollständig verwalteten Geräten und der Hauptnutzer können diese Einschränkung festlegen.

Das folgende Snippet zeigt, wie Sie die Einschränkungen festlegen können:

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

Möglicherweise möchten Sie diese Einschränkungen entfernen, wenn sich Ihre Anwendung im Administratormodus befindet, damit ein IT-Administrator diese Funktionen weiterhin für die Gerätewartung verwenden kann. Rufen Sie DevicePolicyManager.clearUserRestriction() auf, um die Einschränkung zu löschen.

Fehlerdialoge unterdrücken

In einigen Umgebungen, z. B. bei Demos für den Einzelhandel oder zur Anzeige öffentlicher Informationen, möchten Sie Nutzern möglicherweise keine Fehlerdialogfelder anzeigen lassen. Ab Android 9.0 (API-Ebene 28) und höher können Sie die Dialogfelder für Systemfehler bei abgestürzten oder nicht reagierenden Apps durch Hinzufügen der Nutzereinschränkung DISALLOW_SYSTEM_ERROR_DIALOGS unterdrücken. Nicht reagierende Apps werden neu gestartet, als ob der Gerätenutzer die App über das Dialogfeld geschlossen hätte. Das folgende Beispiel zeigt, wie Sie das tun können:

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

Wenn ein Administrator des primären oder sekundären Nutzers diese Einschränkung festlegt, unterdrückt das System Fehlerdialogfelder nur für diesen Nutzer. Wenn ein Administrator eines vollständig verwalteten Geräts diese Einschränkung festlegt, unterdrückt das System Dialogfelder für alle Nutzer.

Display eingeschaltet lassen

Wenn Sie einen Kiosk erstellen, können Sie den Ruhemodus eines Geräts beenden, während auf ihm Aktivitäten Ihrer App ausgeführt werden. Fügen Sie dem Fenster Ihrer App das Layout-Flag FLAG_KEEP_SCREEN_ON hinzu, wie im folgenden Beispiel gezeigt:

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

Sie sollten prüfen, ob das Gerät an ein AC-, USB- oder kabelloses Ladegerät angeschlossen ist. Registrieren Sie sich für Broadcasts zu Akkuänderungen und verwenden Sie BatteryManager-Werte, um den Ladestatus zu ermitteln. Sie können sogar Remote-Benachrichtigungen an einen IT-Administrator senden, wenn das Gerät vom Stromnetz getrennt wurde. Eine detaillierte Anleitung finden Sie unter Akkustand und Ladestatus überwachen.

Sie können auch die globale Einstellung STAY_ON_WHILE_PLUGGED_IN festlegen, damit das Gerät eingeschaltet bleibt, wenn es an eine Stromquelle angeschlossen ist. Administratoren von vollständig verwalteten Geräten können unter Android 6.0 (API-Level 23) und höher wie im folgenden Beispiel DevicePolicyManager.setGlobalSetting() aufrufen:

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

App-Pakete

Dieser Abschnitt enthält Rezepte zur effizienten Installation von Apps auf zweckbestimmten Geräten.

App-Pakete im Cache speichern

Wenn die Nutzer eines gemeinsam verwendeten Geräts alle dieselbe Gruppe von Apps verwenden, empfiehlt es sich, den Download von Apps nach Möglichkeit zu vermeiden. Sie können unter Android 9.0 (API-Level 28) und höher die Nutzerverwaltung auf gemeinsam verwendeten Geräten mit einer festen Nutzergruppe (z. B. Geräte für Schichtarbeiter) optimieren, indem Sie App-Pakete (APKs) im Cache speichern, die für Sitzungen mit mehreren Nutzern benötigt werden.

Die Installation eines im Cache gespeicherten APKs, das bereits auf dem Gerät installiert ist, erfolgt in zwei Phasen:

  1. Die Administratorkomponente eines vollständig verwalteten Geräts (oder eines Bevollmächtigten – siehe unten) legt die Liste der APKs fest, die auf dem Gerät beibehalten werden sollen.
  2. Administratorkomponenten von verknüpften sekundären Nutzern (oder deren Bevollmächtigten) können das im Cache gespeicherte APK im Namen des Nutzers installieren. Administratoren des vollständig verwalteten Geräts, der Hauptnutzer, ein verknüpftes Arbeitsprofil (oder deren Bevollmächtigte) können bei Bedarf auch die im Cache gespeicherte App installieren.

Um die Liste der APKs festzulegen, die auf dem Gerät beibehalten werden sollen, ruft der Administrator DevicePolicyManager.setKeepUninstalledPackages() auf. Bei dieser Methode wird nicht geprüft, ob das APK auf dem Gerät installiert ist. Dies ist nützlich, wenn Sie eine App installieren möchten, kurz bevor sie für einen Nutzer benötigt wird. Mit DevicePolicyManager.getKeepUninstalledPackages() können Sie eine Liste der zuvor festgelegten Pakete abrufen. Nachdem Sie setKeepUninstalledPackages() mit Änderungen aufgerufen oder ein sekundärer Nutzer gelöscht wurde, löscht das System alle im Cache gespeicherten APKs, die nicht mehr benötigt werden.

Rufen Sie DevicePolicyManager.installExistingPackage() auf, um ein im Cache gespeichertes APK zu installieren. Mit dieser Methode kann nur eine App installiert werden, die vom System bereits im Cache gespeichert wurde. Ihre dedizierte Gerätelösung (oder der Nutzer eines Geräts) muss die App zuerst auf dem Gerät installieren, bevor Sie diese Methode aufrufen können.

Das folgende Beispiel zeigt, wie Sie diese API-Aufrufe als Administrator eines vollständig verwalteten Geräts und eines sekundären Nutzers verwenden können:

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

Apps delegieren

Sie können eine andere Anwendung delegieren, um das Anwendungs-Caching zu verwalten. Sie können dies tun, um die Funktionen Ihrer Lösung zu trennen oder um IT-Administratoren die Möglichkeit zu bieten, ihre eigenen Anwendungen zu verwenden. Die delegierte App erhält dieselben Berechtigungen wie die Administratorkomponente. Ein App-Bevollmächtigter des Administrators eines sekundären Nutzers kann beispielsweise installExistingPackage() aufrufen, aber nicht setKeepUninstalledPackages() aufrufen.

Rufen Sie zum Ausführen eines Bevollmächtigten DevicePolicyManager.setDelegatedScopes() auf und fügen Sie DELEGATION_KEEP_UNINSTALLED_PACKAGES in das Argument „Scopes“ ein. Das folgende Beispiel zeigt, wie Sie eine andere Anwendung zum Delegieren machen können:

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

Wenn alles gut läuft, empfängt die delegierende Anwendung die ACTION_APPLICATION_DELEGATION_SCOPES_CHANGED-Übertragung und wird zum Bevollmächtigten. Die App kann die Methoden in diesem Leitfaden so aufrufen, als wäre es der Geräteinhaber oder Profilinhaber. Beim Aufrufen von DevicePolicyManager-Methoden übergibt der Bevollmächtigte null für das Argument der Administratorkomponente.

App-Pakete installieren

Manchmal ist es nützlich, eine lokal im Cache gespeicherte benutzerdefinierte App auf einem dedizierten Gerät zu installieren. Dedizierte Geräte werden beispielsweise häufig in Umgebungen mit eingeschränkter Bandbreite oder in Bereichen ohne Internetverbindung bereitgestellt. Bei Ihrer dedizierten Gerätelösung sollte die Bandbreite Ihrer Kunden berücksichtigt werden. Deine App kann die Installation eines anderen App-Pakets (APK) mithilfe der PackageInstaller-Klassen starten.

APKs können zwar von jeder App installiert werden, aber Administratoren können auf vollständig verwalteten Geräten Pakete ohne Nutzerinteraktion installieren oder deinstallieren. Der Administrator kann das Gerät, einen verknüpften sekundären Nutzer oder ein verknüpftes Arbeitsprofil verwalten. Nach Abschluss der Installation gibt das System eine Benachrichtigung zurück, die alle Gerätenutzer sehen. Mit der Benachrichtigung werden Gerätenutzer darüber informiert, dass die App vom Administrator installiert (oder aktualisiert) wurde.

Tabelle 2. Android-Versionen, die die Paketinstallation ohne Nutzerinteraktion unterstützen
Android-Version Admin-Komponente für Installation und Deinstallation
Android 9.0 (API-Level 28) oder höher Verknüpfte sekundäre Nutzer und Arbeitsprofile – beide auf vollständig verwalteten Geräten
Android 6.0 (API-Level 23) oder höher Vollständig verwaltete Geräte

Wie Sie eine oder mehrere Kopien des APKs für dedizierte Geräte verteilen, hängt davon ab, wie entfernt die Geräte sind und möglicherweise, wie weit die Geräte voneinander entfernt sind. Ihre Lösung muss die Best Practices für die Sicherheit befolgen, bevor Sie APKs auf dedizierten Geräten installieren.

Sie können PackageInstaller.Session verwenden, um eine Sitzung zu erstellen, die ein oder mehrere APKs zur Installation in die Warteschlange stellt. Im folgenden Beispiel erhalten wir in unserer Aktivität Feedback zum Status (singleTop-Modus). Sie können aber auch einen Dienst oder einen Rundfunkempfänger verwenden:

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

Die Sitzung sendet mithilfe von Intents Statusfeedback zur Installation. Im Feld EXTRA_STATUS jedes Intents können Sie den Status abrufen. Administratoren erhalten das Statusupdate für STATUS_PENDING_USER_ACTION nicht, da der Gerätenutzer die Installation nicht genehmigen muss.

Rufen Sie zum Deinstallieren von Apps PackageInstaller.uninstall auf. Administratoren von vollständig verwalteten Geräten, Nutzern und Arbeitsprofilen können Pakete ohne Nutzerinteraktion mit unterstützten Android-Versionen deinstallieren (siehe Tabelle 2).

Systemupdates einfrieren

Android-Geräte erhalten OTA-Updates (Over The Air) für die System- und Anwendungssoftware. Damit die Betriebssystemversion in kritischen Zeiten wie Feiertagen oder anderen Zeiten hoher Nachfrage eingefroren wird, können OTA-Systemupdates für bis zu 90 Tage ausgesetzt werden. Weitere Informationen finden Sie unter Systemupdates verwalten.

Remote Config

Mit den verwalteten Konfigurationen von Android können IT-Administratoren Ihre Anwendung per Fernzugriff konfigurieren. Möglicherweise möchten Sie Einstellungen wie Zulassungslisten, Netzwerkhosts oder Inhalts-URLs bereitstellen, um Ihre Anwendung für IT-Administratoren nützlicher zu machen.

Wenn Ihre Anwendung die Konfiguration zur Verfügung stellt, denken Sie daran, die Einstellungen in Ihre Dokumentation aufzunehmen. Weitere Informationen dazu, wie Sie die Konfiguration Ihrer Anwendung freigeben und auf Änderungen der Einstellungen reagieren können, finden Sie unter Verwaltete Konfigurationen einrichten.

Einrichtung für Entwicklung

Bei der Entwicklung Ihrer Lösung für dedizierte Geräte ist es manchmal hilfreich, Ihre App als Administrator eines vollständig verwalteten Geräts ohne Zurücksetzen auf die Werkseinstellungen festzulegen. So legen Sie den Administrator für ein vollständig verwaltetes Gerät fest:

  1. Erstellen und installieren Sie die DPC-App (Device Policy Controller) auf dem Gerät.
  2. Prüfen Sie, ob auf dem Gerät keine Konten vorhanden sind.
  3. Führen Sie den folgenden Befehl in der ADB-Shell (Android Debug Bridge) aus. Sie müssen com.example.dpc/.MyDeviceAdminReceiver im Beispiel durch den Namen der Administratorkomponente Ihrer App ersetzen:

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

Wenn Sie Kunden bei der Bereitstellung Ihrer Lösung unterstützen möchten, müssen Sie sich andere Registrierungsmethoden ansehen. Wir empfehlen die QR-Code-Registrierung für dedizierte Geräte.

Weitere Informationen

Weitere Informationen zu dedizierten Geräten finden Sie in den folgenden Dokumenten: