Tryb kiosku w systemie Android

114

Jestem w trakcie oceniania, czy i jak można przenieść aplikację korporacyjną CF .NET do działania na urządzeniach z systemem Android. Aplikacje na telefonach z systemem Windows Mobile są uruchamiane w trybie kiosku, w którym aplikacja uruchamia się automatycznie w trybie pełnoekranowym po uruchomieniu, a użytkownicy nie mogą przypadkowo lub chętnie uzyskać dostępu do innych części telefonu.

Czy na Androidzie możliwe jest automatyczne uruchamianie tylko jednej aplikacji po uruchomieniu i zapobieganie przypadkowemu (lub dobrowolnemu) dostępowi użytkowników do innych części urządzenia z Androidem?

Erik H.
źródło
Czy rozwiązujesz swój problem?
Menna-Allah Sami
3
Tak to mozliwe. Stworzyłem (bardzo) długi wpis na blogu na ten temat: andreas-schrade.de/2015/02/16/...
funcoder
Stworzyłem również wpis na blogu na ten temat (częściowo) za pomocą Lollipopa - jednak wyklucza on część odbiornika rozruchowego: sureshjoshi.com/mobile/android-kiosk-mode-without-root
SJoshi
Odpowiedziałem tutaj na podobne pytanie dotyczące różnych metod tworzenia zablokowanych urządzeń jednorazowego użytku: stackoverflow.com/a/43644803/2888763
Trevor Halvorson

Odpowiedzi:

29

Możesz automatycznie uruchamiać aplikacje podczas rozruchu, słuchając android.intent.action.BOOT_COMPLETEDintencji w BroadcastReceiver i rozpoczynając swoją aktywność z tego miejsca. W Aktywności możesz zarejestrować się jako nowy domyślny ekran główny [1] i obsługiwać klawisze.

Myślę, że jest kilka przypadków, z którymi nie można sobie poradzić bez modyfikacji frameworka (np. Longpress na stronie głównej, aby pokazać aktualnie aktywne aplikacje) - chociaż też mogę się mylić.

Ale w przypadku prototypu to mogłoby wystarczyć.

Miłego majsterkowania!

[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>
Valentin
źródło
1
Musisz także nadpisać onbackpressed pierwszej czynności, w przeciwnym razie po naciśnięciu przycisku Wstecz przejdziesz do programu uruchamiającego
ademar111190
Jak osiągnąć systemowe okno dialogowe n paski powiadomień wyłączone przez kod
Gnanam R
1
@GnanamR: sprawdź moją odpowiedź na: stackoverflow.com/questions/11958034/hide-tablet-system-bar
Basher51
@Rinkalkumar Uruchom aplikację w trybie pełnoekranowym.
John61590
17

Możesz to dostosować (wyłączyć dostęp do menu, ograniczyć dodawanie aplikacji itp.), Aby włączyć kiosk. http://code.google.com/p/android-launcher-plus/

rbot
źródło
7
Czy mogę wiedzieć, dlaczego głosowano w dół? Napisałem swoją pełnoprawną, obecnie wdrożoną aplikację kiosku na Androida, edytując i rozwijając w górnej części Android Launcher Plus.
rbot
1
W takim przypadku głosuję za twoją odpowiedzią i komentarzem ;-)
Mawg mówi, że przywróć Monikę
@rbot, jak to zrobiłeś? Od wieków próbowałem zbudować aplikację kiosku i rozwiązałem prawie wszystko inne, z wyjątkiem upewnienia się, że pasek powiadomień nie otwiera się.
Wakka02,
1
@ Wakka02 Myślę, że szukałem zmiany w oknie lub podobnego wydarzenia (które może wskazywać na otwarcie tacy powiadomień) i zamknij tacę. Zrobiłem to dawno temu, więc nie pamiętam szczegółów.
rbot
@ Wakka02: sprawdź moją odpowiedź pod adresem: stackoverflow.com/questions/11958034/hide-tablet-system-bar
Basher51
17

W nowym podglądzie Androida L Google ogłosił blokowanie zadań , które dokładnie to robi. Wydaje się jednak, że potrzebuje roota.

L Developer Preview wprowadza nowy interfejs API do blokowania zadań, który pozwala tymczasowo ograniczyć użytkownikom możliwość opuszczania aplikacji lub przerywania im przez powiadomienia. Może to być wykorzystane, na przykład, jeśli tworzysz aplikację edukacyjną, która będzie obsługiwać wymagania oceniania wysokich stawek w systemie Android. Gdy aplikacja aktywuje ten tryb, użytkownicy nie będą mogli zobaczyć powiadomień, uzyskać dostępu do innych aplikacji ani powrócić do ekranu głównego, dopóki aplikacja nie wyjdzie z tego trybu.

Aby zapobiec nieautoryzowanemu użyciu, tylko autoryzowane aplikacje mogą aktywować blokowanie zadań. Ponadto autoryzacja blokowania zadań musi być udzielona przez specjalnie skonfigurowaną aplikację właściciela urządzenia za pomocą android.app.admin.DevicePolicyManager.setLockTaskComponents()metody.

Aby skonfigurować właściciela urządzenia, wykonaj następujące kroki:

  • Dołącz urządzenie z systemem Android userdebugdo maszyny deweloperskiej.
  • Zainstaluj aplikację właściciela urządzenia.
  • Utwórz device_owner.xmlplik i zapisz go w /data/systemkatalogu na urządzeniu.
$ 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

Przed użyciem interfejsu API blokującego zadania w swojej aplikacji sprawdź, czy Twoja aktywność jest autoryzowana, wywołując DevicePolicyManager.isLockTaskPermitted ().

Aby aktywować blokowanie zadań, zadzwoń android.app.Activity.startLockTask() ze swojej autoryzowanej aktywności.

Gdy blokowanie zadań jest aktywne, obowiązuje następujące zachowanie:

  • Pasek stanu jest pusty, a powiadomienia użytkownika i informacje o stanie są ukryte.
  • Przyciski Strona główna i Ostatnie aplikacje są ukryte.
  • Inne aplikacje mogą nie uruchamiać nowych działań.
  • Bieżąca aplikacja może rozpocząć nowe działania, o ile nie spowoduje to utworzenia nowych zadań.
  • Użytkownik pozostaje zablokowany w Twojej aplikacji do momentu wywołania autoryzowanego działania Activity.stopLockTask().
nhaarman
źródło
3
developer.android.com/guide/topics/admin/device-admin.html - przy wdrażaniu aplikacji Device Admin.
Toshe
2
Oto mój artykuł o blokadach zadań z pełną konfiguracją algoritm pvolan.blogspot.ru/2017/01/android-50-kiosk-mode-aka-super.html
PVoLan
9

Po dłuższych poszukiwaniach znalazłem dobre rozwiązanie. Działa to jednak tylko na zrootowanych urządzeniach, ale myślę, że jeśli jest to tylko dla tej jednej aplikacji, to zrootowanie nie powinno stanowić problemu.

Sprawdź również http://thebitplague.wordpress.com/2013/04/05/kiosk-mode-on-the-nexus-7/, aby znaleźć inny sposób

matt_lethargic
źródło
5

Uruchamianie aplikacji podczas rozruchu

NAJLEPSZYM sposobem na osiągnięcie tego jest ustawienie aplikacji jako programu uruchamiającego

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

Blokowanie aplikacji

najbardziej niezawodnym sposobem jest użycie urządzenia z Lollipopem lub nowszym i korzystanie z niego

startLockTask

najpierw musisz ustawić swoją aplikację jako właściciela urządzenia. Uwaga: Twoje urządzenie musi być wyrejestrowane: jeśli je zarejestrowałeś, powinieneś przywrócić ustawienia fabryczne i pominąć rejestrację konta.

aby móc zarejestrować swoją aplikację, musisz najpierw skonfigurować komponent DeviceAdminReceiver:

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

gdy masz nieobsługiwane urządzenie, możesz uruchomić następujące polecenie z adb ( nie jest wymagany root )

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

aby system Android nie pytał użytkownika o uprawnienia do przypięcia aplikacji, należy wywołać metodę setLockTaskPackages

Wreszcie!

@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();
}
nonsensei
źródło
3

Skonfiguruj urządzenia jednozadaniowe Strona dewelopera Androida opisała te rzeczy, dzięki którym możesz łatwo dowiedzieć się więcej.

Teraz można łatwo skonfigurować urządzenia z Androidem 6.0 Marshmallow lub nowszym jako urządzenia firmowe do jednorazowego użytku (COSU).

Keyur
źródło
2

Znalazłem inną możliwą technikę w tym poście na forum . Cytując ten post:

http://www.basic4ppc.com/forum/basic4android-getting-started-tutorials/10839-android-kiosk-mode-tutorial.html

Korzystając z poniższych metod, możesz zbudować aplikację, która uniemożliwi „zwykłym” użytkownikom korzystanie z czegokolwiek innego niż Twoja aplikacja.

Aplikacja składa się z dwóch modułów. Główna działalność i usługa. Usługa jest skonfigurowana do uruchamiania podczas rozruchu. Po uruchomieniu usługa sprawdza, czy działanie jest uruchomione, czy nie. Jeśli nie działa, do rozpoczęcia głównej czynności używa licznika czasu.

Gdy działanie jest wstrzymane, planuje uruchomienie usługi w ciągu jednej sekundy: Kod:

Sub Activity_Pause (UserClosed As Boolean)
    If kiosk Then StartServiceAt(KioskService, DateTime.Now + 1 * DateTime.TicksPerSecond, false)    
End Sub

Jeśli użytkownik naciśnie przycisk na ekranie głównym, ekran główny pojawi się na kilka sekund. Jednak Twoja aplikacja powróci na wierzch po kilku sekundach i użytkownik nie będzie mógł wchodzić w interakcje z żadnymi innymi aplikacjami ani zmieniać ustawień.

Usługa jest usługą pierwszoplanową. Zapobiega to zabiciu naszej usługi przez Androida. Naciśnij przycisk Stop, aby wyłączyć tryb kiosku.

Wygląda na to, że jest też dostępny do pobrania przykładowy plik ZIP z kodem w trybie kiosku .

Big Rich
źródło
2

Xposed Framework może to zrobić. Potrzebuje roota i istnieje możliwość, że nie będzie działać na wszystkich platformach. Poszukaj metody disable () w klasie android.app.StatusBarManager .

Tutaj w kodzie źródłowym Androida

Zobacz, jak napisać własny moduł: samouczek dotyczący programowania Xposed

To znacznie łatwiejsze niż myślisz na pierwszy rzut oka. Powodzenia!

JohnyTex
źródło
Czy jakikolwiek moduł Xposed, który Twoim zdaniem to robi?
Firelord
0

Wraz z konfiguracją aplikacji z odbiornikiem BOOT i odpowiedzią dotyczącą zapobiegania rozszerzaniu się paska stanu, to rozwiązanie działa w wersji 4.4 i nowszych jako kompletna aplikacja kiosku:

Umieść w swoim 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);
                        }
                    }
                });
    }

Spowoduje to całkowite ukrycie przycisku Wstecz, aplikacji i przycisku strony głównej.

Kristy Welsh
źródło
co z paskiem powiadomień?
Elshan,