Ich bin gerade dabei zu prüfen, ob und wie eine CF .NET-Unternehmensanwendung zur Ausführung auf Android-Geräten portiert werden kann. Die Anwendung auf Windows Mobile-Telefonen wird im Kioskmodus ausgeführt, in dem die Anwendung nach dem Booten automatisch im Vollbildmodus gestartet wird und Benutzer nicht versehentlich oder willentlich auf andere Teile des Telefons zugreifen können.
Ist es unter Android möglich, nach dem Booten nur eine Anwendung automatisch zu starten und Benutzer daran zu hindern, versehentlich (oder willentlich) auf andere Teile des Android-Geräts zuzugreifen?
Sie können Anwendungen automatisch beim Booten starten, indem Sie die Absicht Android.intent.action.BOOT_COMPLETED
in einem BroadcastReceiver abhören und Ihre Aktivität von dort aus starten. In der Aktivität können Sie sich als neuer Standard-Startbildschirm registrieren [1] und die Tasten bedienen.
Ich denke, es gibt einige Fälle, mit denen Sie nicht umgehen können, ohne das Framework zu ändern (wie zum Beispiel Longpress bei Home, um die derzeit aktiven Anwendungen anzuzeigen) - ich könnte mich jedoch auch irren.
Aber für einen Prototyp könnte das ausreichend sein.
Viel Spaß beim Basteln!
[1]:
<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>
In der neuen Android L Preview hat Google Task Locking angekündigt, die genau das. Es scheint jedoch root zu benötigen.
In der L Developer Preview wird eine neue API zum Sperren von Aufgaben eingeführt, mit der Sie Benutzer vorübergehend daran hindern können, Ihre App zu verlassen oder von Benachrichtigungen unterbrochen zu werden. Dies kann beispielsweise verwendet werden, wenn Sie eine Bildungs-App entwickeln, um die Anforderungen für die Bewertung hoher Einsätze unter Android zu erfüllen. Sobald Ihre App diesen Modus aktiviert, können Benutzer keine Benachrichtigungen mehr anzeigen, auf andere Apps zugreifen oder zum Startbildschirm zurückkehren, bis Ihre App den Modus verlässt.
Um eine nicht autorisierte Nutzung zu verhindern, können nur autorisierte Apps die Aufgabensperre aktivieren. Darüber hinaus muss die Berechtigung zum Sperren von Aufgaben von einer speziell konfigurierten Geräteeigner-App über die Methode
Android.app.admin.DevicePolicyManager.setLockTaskComponents()
erteilt werden.Gehen Sie folgendermaßen vor, um einen Geräteeigentümer einzurichten:
- Verbinden Sie ein Gerät, auf dem ein Android
userdebug
Build ausgeführt wird, mit Ihrem Entwicklungscomputer.- Installieren Sie Ihre Geräteinhaber-App.
- Erstellen Sie eine
device_owner.xml
- Datei und speichern Sie diese im Verzeichnis/data/system
Auf dem Gerät.
$ adb root
$ adb Shell stop
$ rm /tmp/device_owner.xml
$ echo "<?xml version='1.0' encoding='utf-8' standalone='yes' ?>" >> /tmp/device_owner.xml
$ echo "&device-owner package=\"<your_device_owner_package>\" name=\"*<your_organization_name>\" />" >> /tmp/device_owner.xml
$ adb Push /tmp/device_owner.xml /data/system/device_owner.xml
$ adb reboot
Vergewissern Sie sich vor Verwendung der Task-Sperr-API in Ihrer App, dass Ihre Aktivität autorisiert ist, indem Sie DevicePolicyManager.isLockTaskPermitted () aufrufen.
Rufen Sie zum Aktivieren der Aufgabensperre
Android.app.Activity.startLockTask()
von Ihrer autorisierten Aktivität aus auf.Wenn die Aufgabensperre aktiv ist, wird das folgende Verhalten wirksam:
- Die Statusleiste ist leer und Benutzerbenachrichtigungen und Statusinformationen sind ausgeblendet.
- Die Schaltflächen Home und Recent Apps sind ausgeblendet.
- Andere Apps starten möglicherweise keine neuen Aktivitäten.
- Die aktuelle App kann neue Aktivitäten starten, sofern dadurch keine neuen Aufgaben erstellt werden.
- Der Benutzer bleibt für Ihre App gesperrt, bis eine autorisierte Aktivität
Activity.stopLockTask()
aufruft.
Sie können dies anpassen (den Zugriff auf das Menü deaktivieren, das Hinzufügen von Anwendungen einschränken usw.), um den Kiosk zu aktivieren. http://code.google.com/p/Android-launcher-plus/
Nachdem ich dies eine Weile gesucht hatte, habe ich eine gute Lösung gefunden. Dies funktioniert zwar nur bei gerooteten Geräten, aber ich denke, wenn es nur für diese eine App ist, dann sollte das Rooten kein Problem sein.
Machen Sie Ihre Anwendung zum Startprogramm, indem Sie hinzufügen
<category Android:name="Android.intent.category.HOME" />
zu deinem Vorsatzfilter
Stellen Sie sicher, dass Ihre App die Symbolleiste einklappt, damit Sie die Benachrichtigungsleiste nicht erreichen können. Siehe So deaktivieren Sie die Statusleiste/Benachrichtigungsleiste unter Android programmgesteuert? oder http://blog.vogella.com/2011/02/28/Android-hidding-the-status-and-title-bar/
Um zu verhindern, dass andere Programme versehentlich geöffnet werden, verwenden Sie einen Accessibility Service, um nach Window State Changed zu suchen, vergleichen Sie das Paket mit einer weißen oder schwarzen Liste und verwenden Sie ActivityManager.killBackgroundProcesses, um das Programm zu beenden, falls es nicht ausgeführt werden sollte.
Check out http://thebitplague.wordpress.com/2013/04/05/kiosk-mode-on-the-nexus-7/ für einen anderen Weg
Einrichtungsseite für Einzelgeräte einrichten von Android-Entwicklern haben diese Dinge beschrieben, von denen Sie leicht mehr darüber erfahren können.
Jetzt ist es einfach, Android 6.0 Marshmallow- und neuere Geräte als firmeneigene Single-Use-Geräte (COSU) zu konfigurieren.
Google hat kürzlich die Android Management API veröffentlicht, mit der der Kioskmodus für alle Android-Geräte, auf denen Android 5.1 oder höher ausgeführt wird, problemlos eingerichtet und verschiedene andere Richtlinien festgelegt werden können.
Eine andere mögliche Technik in diesem Forum Beitrag gefunden . Diesen Beitrag zitieren:
Mit den folgenden Methoden können Sie eine Anwendung erstellen, die verhindern, dass "normale" Benutzer mit etwas anderem als Ihrem .__ spielen. Anwendung.
Die Anwendung besteht aus zwei Modulen. Die Hauptaktivität und eine Bedienung. Der Dienst ist so konfiguriert, dass er beim Booten gestartet wird. Wenn der Dienst gestartet wird, wird geprüft, ob die Aktivität ausgeführt wird oder nicht. Wenn es das nicht ist Beim Ausführen wird ein Timer zum Starten der Hauptaktivität verwendet.
Wenn die Aktivität angehalten ist, wird der Dienst in einer .__-Zeit gestartet. zweite: Code:
Sub Activity_Pause (UserClosed As Boolean)
If kiosk Then StartServiceAt(KioskService, DateTime.Now + 1 * DateTime.TicksPerSecond, false)
End Sub
Wenn der Benutzer auf dem Startbildschirm drückt, wird der Startbildschirm angezeigt für einige Sekunden. Ihre Anwendung kehrt jedoch nach vorne zurück Nach einigen Sekunden kann der Benutzer nicht mit .__ interagieren. andere Anwendungen oder ändern Sie die Einstellungen.
Der Dienst ist als Vordergrunddienst eingestellt. Dies verhindert Android von unserem Service zu töten. Drücken Sie die Stop-Taste, um den Kiosk zu deaktivieren Modus.
Es scheint, dass eine Beispiel-Kiosk-Code-Zip-Datei zum Download zur Verfügung steht .
der beste Weg, dies zu erreichen, besteht darin, Ihre App als Startprogramm festzulegen
<activity ...
Android:launchMode="singleInstance"
Android:windowActionBar="false">
<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>
die zuverlässigste Methode ist, ein Gerät mit Lollipop oder höher zu verwenden und zu verwenden
startLockTask
zuerst müssen Sie Ihre App als Gerätebesitzer festlegen. NB Ihr Gerät muss unprovisioniert sein: Wenn Sie es registriert haben, sollten Sie einen Werksreset durchführen und die Kontoregistrierung überspringen.
um Ihre App registrieren zu können, müssen Sie zunächst eine DeviceAdminReceiver-Komponente einrichten:
package com.example.myapp;
public class MyDeviceAdminReceiver extends Android.app.admin.DeviceAdminReceiver {
@Override
public void onEnabled(Context context, Intent intent) {
Toast.makeText(context, "Device admin permission received", Toast.LENGTH_SHORT).show();
}
@Override
public CharSequence onDisableRequested(Context context, Intent intent) {
return "are you sure?";
}
@Override
public void onDisabled(Context context, Intent intent) {
Toast.makeText(context, "Device admin permission revoked", Toast.LENGTH_SHORT).show();
}
@Override
public void onLockTaskModeExiting(Context context, Intent intent) {
// here you must re-lock your app. make your activity know of this event and make it call startLockTask again!
}
}
sobald Sie ein nicht bereitgestelltes Gerät haben, können Sie den folgenden Befehl von adb starten ( kein Root erforderlich )
adb Shell dpm set-device-owner com.example.myapp/.MyDeviceAdminReceiver
um zu verhindern, dass Android die Benutzer dazu auffordert, Ihre App zu pinnen, müssen Sie setLockTaskPackages aufrufen
endlich!
@Override
public void onResume(){
super.onResume();
DevicePolicyManager mDevicePolicyManager = (DevicePolicyManager) getSystemService(
Context.DEVICE_POLICY_SERVICE);
ComponentName mAdminComponentName = new ComponentName(getApplicationContext(), MyDeviceAdminReceiver.class);
mDevicePolicyManager.setLockTaskPackages(mAdminComponentName, new String[]{getPackageName()});
startLockTask();
}
@Override
public void finish(){
stopLockTask();
super.finish();
}
Xposed Framework kann dies tun. Es benötigt root und es besteht die Möglichkeit, dass es nicht auf allen Plattformen funktioniert. Suchen Sie nach der Methode disable () in der Klasse Android.app.StatusBarManager.
Sehen Sie hier, wie Sie Ihr eigenes Modul schreiben können: Xposed-Entwicklungstutorial
Es ist viel einfacher als Sie auf den ersten Blick denken. Viel Glück!
Neben dem Einrichten Ihrer Anwendung mit einem BOOT-Empfänger und dieser Antwort zum Verhindern der Statusleistenerweiterung funktioniert diese Lösung ab 4.4 als vollständige Kiosk-App:
Platzieren Sie in Ihrem onCreate ():
final View view = (View) findViewById(Android.R.id.content);
if (view != null) {
//"hides" back, home and return button on screen.
view.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LOW_PROFILE |
View.SYSTEM_UI_FLAG_HIDE_NAVIGATION |
View.SYSTEM_UI_FLAG_IMMERSIVE |
View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY |
View.SYSTEM_UI_FLAG_FULLSCREEN);
view.setOnSystemUiVisibilityChangeListener
(new View.OnSystemUiVisibilityChangeListener() {
@Override
public void onSystemUiVisibilityChange(int visibility) {
// Note that system bars will only be "visible" if none of the
// LOW_PROFILE, HIDE_NAVIGATION, or FULLSCREEN flags are set.
if ((visibility & View.SYSTEM_UI_FLAG_FULLSCREEN) == 0) {
view.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LOW_PROFILE |
View.SYSTEM_UI_FLAG_HIDE_NAVIGATION |
View.SYSTEM_UI_FLAG_IMMERSIVE |
View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY |
View.SYSTEM_UI_FLAG_FULLSCREEN);
}
}
});
}
Dadurch werden der Zurück-Button, die Apps und der Home-Button vollständig ausgeblendet.