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.
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:
- 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.
- 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.
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:
- Erstellen und installieren Sie die DPC-App (Device Policy Controller App) auf dem Gerät.
- Auf dem Gerät dürfen keine Konten vorhanden sein.
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: