Rezepte für zweckbestimmte Geräte

Dieses Cookbook hilft Entwicklern und Systemintegratoren, ihre Gerätelösung. Folge unseren Anleitungen, um Lösungen für zweckbestimmte Geräte zu finden. Verhaltensweisen. Dieses Kochbuch eignet sich am besten für Entwickler, die bereits eine eigene Geräte-App: Wenn Sie gerade erst anfangen, lesen Sie den Artikel Zweckbestimmte Geräte Übersicht.

Benutzerdefinierte Home Apps

Diese Rezepte sind nützlich, wenn Sie eine App entwickeln, die das Android Home-Gerät ersetzt. Bildschirm und Launcher.

Die Home-App sein

Du kannst deine App als Start-App des Geräts festlegen, damit sie gestartet wird. automatisch beim Start. Sie können auch die Schaltfläche, mit der die App auf der Zulassungsliste im Sperrbildschirm im Vordergrund angezeigt wird Aufgabenmodus.

Alle Home-Apps verarbeiten die Intent-Kategorie CATEGORY_HOME: wie das System eine Home-App erkennt. Lege eine Start-App fest, um sie als Standard-Start-App festzulegen als bevorzugten Intent-Handler für Zuhause festlegen, indem Sie DevicePolicyManager.addPersistentPreferredActivity() Dies wird 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 noch den Intent-Filter deklarieren. in Ihrer App-Manifestdatei ein, 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 die Launcher-App auf dem Bildschirm „Übersicht“ angezeigt wird. Sie müssen excludeFromRecents jedoch nicht Erklärung zur Aktivität, da der Android-Launcher die ursprünglich gestarteten Aktivität, wenn das System im Modus „Task sperren“ ausgeführt wird.

Separate Aufgaben anzeigen

FLAG_ACTIVITY_NEW_TASK kann ein nützliches Flag für wie Apps vom Typ „Launcher“ erstellt werden, da jede neue Aufgabe im Übersichtsbildschirm Weitere Informationen zu Aufgaben auf dem Übersichtsbildschirm finden Sie unter Letzte Bildschirm:

Öffentliche Kioske

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

Gerät sperren

Um sicherzustellen, dass Geräte zweckgemäß verwendet werden, können Sie die in Tabelle 1 aufgeführten Nutzereinschränkungen.

Tabelle 1. Nutzereinschränkungen für Kioskgeräte
Nutzereinschränkung Beschreibung
DISALLOW_FACTORY_RESET Verhindert, dass ein Gerätenutzer das Gerät auf die Werkseinstellungen zurücksetzt. Administratoren von vollständig verwalteten Geräten und vom Hauptnutzer können dies festlegen Einschränkung.
DISALLOW_SAFE_BOOT Verhindert, dass ein Gerätenutzer das Gerät startet in abgesicherten Modus bei denen Ihre App nicht automatisch gestartet wird. Administratoren von verwalteten Geräten und der Hauptnutzer kann diese Einschränkung festlegen.
DISALLOW_MOUNT_PHYSICAL_MEDIA Verhindert, dass der Gerätenutzer Speicher-Volumes bereitstellen kann am Gerät anbringen. Administratoren von vollständig verwalteten Geräten und des Hauptnutzers diese Einschränkung festlegen.
DISALLOW_ADJUST_VOLUME Schaltet das Gerät stumm und verhindert, dass der Gerätenutzer den Ton ändert Lautstärke und Vibrationseinstellungen ändern. Prüfen, ob der Kiosk keinen Ton benötigt für die Medienwiedergabe oder Bedienungshilfen. Administratoren von „Vollständig verwaltet“ können primäre Nutzer, sekundäre Nutzer und Einschränkung.
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 Nutzereinschränkung automatisch vollständig verwalteten Geräten, aber möglicherweise wurde sie gelöscht. Administratoren von verwalteten Geräten und der Hauptnutzer kann 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);

Wenn sich Ihre App im Administratormodus befindet, sollten Sie diese Einschränkungen entfernen, dass IT-Administratoren diese Funktionen weiterhin für die Gerätewartung verwenden können. Löschen die Einschränkung, rufen Sie DevicePolicyManager.clearUserRestriction()

Fehlerdialogfelder unterdrücken

In einigen Umgebungen, z. B. bei Demonstrationen im Einzelhandel oder bei öffentlichen Informationen sollten Sie Nutzern keine Fehlerdialogfelder anzeigen. Android 9.0 (API) Ebene 28) oder höher können Sie Systemfehlerdialoge für abgestürzte oder nicht mehr reagierenden Apps hinzufügen, DISALLOW_SYSTEM_ERROR_DIALOGS-Nutzer Einschränkung. Nicht reagierende Apps werden vom System neu gestartet, als ob der Nutzer das Gerät geschlossen hätte die App im Dialogfeld aus. Das folgende Beispiel zeigt, wie das geht:

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 Fehlerdialogfelder nur für diesen Nutzer. Wenn ein Administrator einer vollständig verwalteten verwendet, unterdrückt das System Dialogfelder für alle Nutzer.

Display eingeschaltet lassen

Wenn Sie einen Kiosk erstellen, können Sie verhindern, dass ein Gerät Schlaf, wenn die App-Aktivitäten ausgeführt werden. Hinzufügen das Layout-Flag FLAG_KEEP_SCREEN_ON in den 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);
}

Überprüfe, ob das Gerät an eine Netz-, USB- oder WLAN-Verbindung angeschlossen ist. Ladegerät. Für Benachrichtigungen zum Akkuwechsel registrieren und BatteryManager verwenden um den Ladestatus zu ermitteln. Sie können sogar aus der Ferne Alarme an IT-Abteilungen senden, Administrator, wenn das Gerät vom Stromnetz getrennt wird. Eine detaillierte Anleitung finden Sie unter Überwachen des Akkustands und des Ladevorgangs Status.

Sie können auch die STAY_ON_WHILE_PLUGGED_IN festlegen, festlegen, dass das Gerät aktiv bleibt, während es an eine Stromquelle angeschlossen ist. Administratoren vollständig verwalteter Geräte mit Android 6.0 (API-Level 23) oder höher können DevicePolicyManager.setGlobalSetting() wie gezeigt aufrufen im folgenden Beispiel:

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 Anleitungen zur effizienten Installation von Apps auf dedizierten Geräten.

App-Pakete im Cache speichern

Wenn alle Nutzer eines gemeinsam verwendeten Geräts dieselben Apps verwenden, werden dadurch und möglichst keine Apps herunterladen. Um die Nutzenden zu optimieren, Bereitstellung auf gemeinsam verwendeten Geräten für eine bestimmte Gruppe von Nutzern, z. B. Geräte für Schichtarbeiter. Ab Android 9.0 (API-Level 28) können Sie die App Pakete (APKs), die für Sitzungen mit mehreren Nutzern benötigt werden.

Die Installation eines im Cache gespeicherten APK, 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 ) wird die Liste der APKs festgelegt, die auf dem Gerät beibehalten werden sollen.
  2. Administratorkomponenten von verknüpften sekundären Nutzern (oder deren Bevollmächtigten) Das im Cache gespeicherte APK für den Nutzer installieren Administratoren der vollständig verwalteten Gerät, den Hauptnutzer oder ein verknüpftes Arbeitsprofil (oder -Bevollmächtigte) können bei Bedarf auch die im Cache gespeicherte Anwendung installieren.

Um die Liste der APKs festzulegen, die auf dem Gerät verbleiben sollen, ruft der Administrator auf DevicePolicyManager.setKeepUninstalledPackages() 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, bevor sie sie für einen Nutzer brauchen. Um eine Liste mit zuvor festgelegten Paketen erstellen, können Sie DevicePolicyManager.getKeepUninstalledPackages() Nach dem Aufruf von setKeepUninstalledPackages() mit Änderungen oder wenn ein sekundärer Nutzer gelöscht wird, löscht das System alle im Cache gespeicherten APKs, die nicht mehr benötigt werden.

Um ein im Cache gespeichertes APK zu installieren, rufen Sie DevicePolicyManager.installExistingPackage() Mit dieser Methode können Sie nur eine App installieren, die vom System bereits im Cache gespeichert wurde – Ihre oder der Nutzer eines Geräts muss die App zuerst auf um diese Methode aufrufen zu können.

Das folgende Beispiel zeigt, wie Sie diese API-Aufrufe im Administrator von einem vollständig verwalteten Gerät und einem sekundären Nutzer:

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 damit delegieren, das App-Caching zu verwalten. Sie könnten dies tun, um Funktionen Ihrer Lösung zu trennen oder IT-Administratoren die Möglichkeit zu bieten, für ihre eigenen Apps. Die delegierte App erhält dieselben Berechtigungen wie der Administrator Komponente. Ein App-Bevollmächtigter des Administrators eines sekundären Nutzers kann beispielsweise Folgendes aufrufen: installExistingPackage(), kann aber setKeepUninstalledPackages() nicht anrufen.

So starten Sie einen delegierten Anruf: DevicePolicyManager.setDelegatedScopes() und enthalten DELEGATION_KEEP_UNINSTALLED_PACKAGES im Argument "Scopes" ein. Das folgende Beispiel zeigt, wie Sie eine weitere App den Bevollmächtigten:

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 in Ordnung ist, erhält die Bevollmächtigte-App ACTION_APPLICATION_DELEGATION_SCOPES_CHANGED und wird zum Bevollmächtigten. Die App kann die Methoden in diesem Leitfaden aufrufen. als Geräte- oder Profilinhaber. Beim Anrufen DevicePolicyManager-Methoden verwenden, übergibt der Bevollmächtigte null für den Administrator Komponentenargument.

App-Pakete installieren

Manchmal ist es sinnvoll, eine lokal zwischengespeicherte benutzerdefinierte App auf einer dedizierten . Beispielsweise werden zweckbestimmte Geräte häufig Umgebungen mit begrenzter Bandbreite oder Regionen ohne Internetverbindung. Ihr zweckbestimmte Gerätelösung sollte auf die Bandbreite des Kunden achten. Ihr die Installation eines anderen App-Pakets (APK) mithilfe der PackageInstaller Kurse.

APKs können bei jeder App installiert werden, auf vollständig verwalteten Geräten aber Administratoren. Installations- oder Deinstallationspakete ohne Nutzerinteraktion. Der Administrator verwaltet möglicherweise das Gerät, einen verbundenen sekundären Nutzer oder ein verknüpftes Arbeitsprofil. Nachher nach Abschluss der Installation eine Benachrichtigung, dass alle Gerätenutzer sehen. Die Benachrichtigung informiert Gerätenutzer darüber, dass die App installiert wurde (oder vom Administrator aktualisiert werden.

Tabelle 2. Android-Versionen, die die Paketinstallation unterstützen ohne Nutzerinteraktion
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 in vollständig verwalteten Diensten Geräte
Android 6.0 (API-Level 23) oder höher Vollständig verwaltete Geräte

Wie Sie ein oder mehrere Kopien des APKs an zweckbestimmte Geräte verteilen, hängen davon ab, wie weit die Geräte entfernt sind und wie weit sie voneinander entfernt sind. voneinander stammen. Ihre Lösung muss den Best Practices für die Sicherheit entsprechen bevor Sie APKs auf zweckbestimmten Geräten installieren.

Sie können PackageInstaller.Session verwenden, um eine Sitzung zu erstellen, die eine Sitzung in die Warteschlange stellt. oder mehr APKs zur Installation bereitstellen. Im folgenden Beispiel erhalten wir den Status Feedback erhalten (singleTop-Modus). Sie könnten aber auch einen Dienst- oder Übertragungsempfänger:

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. Prüfen EXTRA_STATUS jedes Intents, um den Status. Beachten Sie, dass Administratoren die Statusupdate für STATUS_PENDING_USER_ACTION da der Gerätenutzer die Installation nicht genehmigen muss.

Wenn Sie Apps deinstallieren möchten, können Sie PackageInstaller.uninstall aufrufen. Administratoren von vollständig verwalteten Geräten, Nutzern und Arbeitsprofilen können Pakete deinstallieren. ohne Nutzerinteraktion mit unterstützten Android-Versionen (siehe Tabelle 2) enthält.

Systemupdates einfrieren

Android-Geräte erhalten OTA-Updates (Over The Air) für das System und die Anwendung. Software. Um die Betriebssystemversion über kritische Zeiträume, z. B. Feiertage oder OTA-Systemupdates für zweckbestimmte Geräte für bis zu 90 Stunden aussetzen, Tage. Weitere Informationen finden Sie unter Systemupdates verwalten.

Remote Config

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

Wenn Ihre Anwendung ihre Konfiguration freigibt, denken Sie daran, die Einstellungen in die Dokumentation. Weitere Informationen dazu, wie Sie die Konfiguration Ihrer App offenlegen und auf Änderungen an den Einstellungen finden Sie unter Verwaltete Konfigurationen einrichten.

Entwicklungseinrichtung

Bei der Entwicklung Ihrer Lösung für zweckbestimmte Geräte nützlich, um deine App als Administrator eines vollständig verwalteten Geräts ohne Werkseinstellung festzulegen zurückgesetzt werden. 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 App) auf dem Gerät.
  2. Auf dem Gerät dürfen keine Konten vorhanden sein.
  3. Führen Sie in der ADB-Shell (Android Debug Bridge) den folgenden Befehl aus. Ich müssen com.example.dpc/.MyDeviceAdminReceiver im Beispiel durch Name der Admin-Komponente Ihrer App:

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

Um Kunden bei der Bereitstellung Ihrer Lösung zu unterstützen, müssen Sie sich andere Registrierungen . Wir empfehlen die Registrierung mit QR-Code für zweckbestimmte Geräte.

Weitere Informationen

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