Pytanie Tryb kiosku dla Androida


Mam aplikację hybrydową napisaną na phonegap dla tabletów z Androidem. Teraz chcę, aby tablet wyświetlał tylko moją aplikację. Zasadniczo chcę, aby tablet był zawsze w trybie kiosku z uruchomioną tylko moją aplikacją. Tak więc wszystkie przyciski są wyłączone. Szukałem rozwiązań online, a jednym z nich jest użycie "surelock", ale nie robi to wszystkich powyższych. Inną opcją jest napisanie własnego ROM-a, ale nie mogłem znaleźć żadnych dobrych tutoriali na ten temat. Czy ktoś może mi pomóc?


11
2017-07-08 08:59


pochodzenie




Odpowiedzi:


Zrobiłem wiele badań i teraz jestem w pełni zadowolony z tego, co otrzymałem.

Zasadniczo masz dwie opcje:

  1. Stwórz własną niestandardową ROM, która nie jest dla mnie najlepszym rozwiązaniem.

  2. Dostosuj tablety za pomocą różnych hacków.

Więc wyjaśnię drugą opcję.

Najpierw musisz zrootować swoje urządzenia. Istnieją różne metody, ale preferuję rootowanie przez oprogramowanie oneclick. W przypadku chińskich tabletów możesz używać VROOT, a dla bardziej popularnych używać Kingo root.

Teraz, gdy masz już swoje urządzenie zrootowane, możemy pozbyć się górnego i dolnego paska.

private void hideBar(){
    try
    {
        Process proc = Runtime.getRuntime().exec(new String[]{"su","-c","service call activity 42 s16 com.android.systemui"}); 
        proc.waitFor();
    }
    catch(Exception ex)
    {
        Toast.makeText(getApplicationContext(), ex.getMessage(), Toast.LENGTH_LONG).show();
        Log.e("ROOT ERROR", ex.getMessage());
    }
}

Spowoduje to zniknięcie górnego i dolnego paska. Jednak prawdopodobnie będziesz potrzebował sposobu, aby ponownie wyświetlić paski. Do tego możesz użyć:

public void showBars(){
    try 
    {
        String command;
        command = "LD_LIBRARY_PATH=/vendor/lib:/system/lib am startservice -n com.android.systemui/.SystemUIService";
        String[] envp = null;
        Process proc = Runtime.getRuntime().exec(new String[] { "su", "-c", command }, envp);
        proc.waitFor();
    } 
    catch(Exception ex)
    {
        Toast.makeText(context.getApplicationContext(), ex.getMessage(), Toast.LENGTH_LONG).show();
    }
}

Ok więc mamy to, wszystko, co pozostaje, to rozpoczęcie uruchamiania aplikacji w czasie rozruchu. Do tego można znaleźć wiele samouczków, po prostu google.


6
2017-08-21 07:47



co z przyciskiem home - user1532587
Masz na myśli fizyczny przycisk do domu? - Mikhail Kim
Ja robię. To trend Samsunga. A górny pasek menu? - user1532587


W wersji Android L (Lollipop) dostępna jest funkcja o nazwie przypinanie, która jest odpowiednikiem trybu Kiosk. Oto link wyjaśniający, jak go skonfigurować.

Wierzę, że Apple wprowadził to pierwsze na iOS. Mimo że OP nie pytał, podaję również szczegóły dotyczące iOS:

Android: http://www.cnet.com/how-to/ho-to-pin-apps-in-android-5-lollipop/

iOS: http://www.webascender.com/Blog/ID/447/How-to-Setup-Kiosk-Mode-Lock-Your-iPad-to-Just-One-App#.VzrO2ZN95E5


2
2018-05-17 09:34





Myślę, że istnieje alternatywne rozwiązanie bez zrootowania urządzenia. Mój szef poprosił mnie, bym uniknął rootowania, więc po pewnych badaniach przyszło mi na to obejście. W rezultacie nie wykonano żadnych haseł, klucze systemowe nadal pozostają, ale użytkownik nie może opuścić aplikacji i uruchomić innego. Tak, zrobiłem następujące kroki.

1. Edytując manifest, ustaw tryb pełnoekranowy bez TitleBar i ActionBar dla odpowiednich Activity, lubię to:

<application
    ...
    android:theme="android:Theme.Holo.NoActionBar.Fullscreen" >

2. Wyłączono przycisk wstecz, zastępując metodę Activity klasa:

@Override
public void onBackPressed() {
    return;
}

3. Dodaj następujące ciągi do zamanifestowania (filtr intent odpowiedni Activity):

<intent-filter>
    <action android:name="android.intent.action.MAIN" />
    <category android:name="android.intent.category.HOME" />
    <category android:name="android.intent.category.DEFAULT" />
    <category android:name="android.intent.category.LAUNCHER" />
</intent-filter>

Teraz możesz zastąpić domyślny ekran główny swoją aplikacją. Ale możliwość zamknięcia aplikacji jeszcze się nie skończyła, klikając przycisk "ostatnie aplikacje" i wybierając inną.

4. Aby uniknąć wszystkich innych sposobów opuszczania aplikacji, dodałem usługę, która rozpoczyna się za każdym razem, gdy działanie jest wstrzymane. Ta usługa ponownie uruchamia aplikację i wysyła powiadomienie o niej. Kod usługi:

public class RelaunchService extends Service {
    private Notification mNotification;
    private Timer mTimer;

    public RelaunchService() {
    }

    @Override
    public void onCreate(){
        super.onCreate();
        if (mNotification == null) {
            Context context = getApplicationContext();
            Intent notificationIntent = new Intent(this, FullscreenActivity.class);
            PendingIntent contentIntent = PendingIntent.getActivity(this, 0,
                    notificationIntent, 0);
            Notification.Builder mBuilder = new Notification.Builder(context)
                    .setSmallIcon(android.R.drawable.ic_dialog_info)
                    .setWhen(System.currentTimeMillis())
                    .setContentIntent(contentIntent)
                    .setContentTitle("Your app title")
                    .setContentText("App is being relaunched");
            mNotification = mBuilder.getNotification();

            mTimer = new Timer("LaunchTimer");
        }
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        super.onStartCommand(intent, flags, startId);
        startForeground(1, mNotification);
        mTimer.schedule(new TimerTask() {
            @Override
            public void run() {
                Intent intent = new Intent(RelaunchService.this, YourActivity.class);
                intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                startActivity(intent);
            }
        }, 300);
        return START_STICKY;
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        stopForeground(true);
        mTimer.cancel();
    }

    @Override
    public IBinder onBind(Intent intent) {
        // TODO: Return the communication channel to the service.
        throw new UnsupportedOperationException("Not yet implemented");
    }
}

Kod dodany do klasy aktywności:

@Override
protected void onResume() {
    super.onResume();
    exitAllowed = false;
    Intent servIntent = new Intent(this, RelaunchService.class);
    stopService(servIntent);
}

@Override
protected void onPause() {
    super.onPause();
    savePersistentData();
    if (!exitAllowed) {
        Intent servIntent = new Intent(this, RelaunchService.class);
        startService(servIntent);
    }
}

The exitAllowed należy przypisać zmienną boolean truekiedy chcesz zamknąć aplikację. Możesz rozważyć jakiś sposób, by to zrobić, na przykład klikając przycisk "Wyjdź". W moim przypadku hasło jest wymagane, aby zakończyć.


1
2018-04-10 11:35





Nierozwiązane rozwiązanie jest możliwe w telefonie Samsung, Spójrz na bezpłatną aplikację Superlock

https://play.google.com/store/apps/details?id=com.superkiosk.ospolice.superlocklite&hl=en_PL


0
2018-03-30 18:13



Potrzebowałem rozwiązania dla chińskich tabletów - Mikhail Kim


Nie musisz tworzyć niestandardowej pamięci ROM, ani nawet rootować urządzeń, aby uzyskać tryb kiosku. Zazwyczaj zdecydowanie zaleca się nie urządzenia root, które będą niedostępne w terenie, zwłaszcza jeśli twoje aplikacje będą zawierały poufne dane.

12oz Mouse's answer (https://stackoverflow.com/a/29560438/2888763) może działać w większości przypadków, ale nie jest całkowicie bezpieczny. Twoja aplikacja lub usługa może zostać zabita przez system lub awarię, zapewniając użytkownikowi pełny dostęp do urządzenia.

Jednym ze sposobów uzyskania trybu kiosku jest korzystanie z Google zablokuj tryb zadania -  co różni się od przypinania ekranu  (https://developer.android.com/work/cosu.html). W tym miejscu znajduje się lista funkcji trybu blokady, takich jak: przypisanie jednej aplikacji do ekranu głównego i wyłączenie / ukrywanie przycisków Początek i Ostatnie. Link pokazuje również, dlaczego największym problemem z rozwiązaniem Google jest złożoność konfiguracji. Musisz albo "użyć rozwiązania do zarządzania mobilnością w przedsiębiorstwie innej firmy (EMM)", albo "Utwórz własną aplikację DPC". Rozwiązanie Google COSU może również nie działać, jeśli nie masz dostępu do Usług Google Play.

Inną opcją jest wykorzystanie mobilnej platformy wdrożeniowej, takiej jak Mason (https://ójason.com/) gdzie możesz zbudować niestandardowy system operacyjny Android w kilka minut dzięki funkcjom takim jak tryb kiosku. Następnie można zdalnie zainstalować aktualizacje systemu operacyjnego lub aplikacji na wszystkich urządzeniach.

Zapraszam do pingowania mnie bezpośrednio: trevor @ bymason.com

OŚWIADCZENIE: Pracuję dla Mason


0
2018-04-26 21:56





W końcu zdecydowałem się na to rozwiązanie, nie potrzebuję rootów, zewnętrznych aplikacji i mogę być używane w przeglądarkach, aplikacjach internetowych i natywnych aplikacjach:

Wciągający tryb pełnoekranowy

  1. Korzystając z adb, sprawdź, czy Twoje urządzenie jest widoczne adb devices (opcje dla deweloperów muszą być włączone)
  2. Znajdź identyfikator aplikacji, którą chcesz wyświetlić na pełnym ekranie (jeśli jest to aplikacja internetowa, to taka, której używa org.mozilla.firefox lub com.android.chrome) jest w adresie sklepu zabaw: https://play.google.com/store/apps/details?id=org.mozilla.firefox
  3. Wykonaj polecenie adb shell settings put global policy_control immersive.full=org.mozilla.firefox zastępowanie org.mozilla.firefox ze swoim id

Więcej informacji tutaj: https://www.howtogeek.com/302194/how-to-force-any-android-app-into-fullscreen-immersive-mode-without-rooting/

W połączeniu z przypinaniem ekranu:

  1. Uruchom aplikację Ustawienia na urządzeniu z Androidem.
  2. Przewiń w dół, aż znajdziesz opcję Zabezpieczenia. Stuknij w to.
  3. U dołu strony Bezpieczeństwo dotknij opcji Przypinanie ekranu.
  4. Przesuń przełącznik w pozycję On.
  5. Otwórz aplikację, przejdź do widoku z najnowszymi aplikacjami i kliknij ikonę pinezki w podglądzie bieżącej aplikacji (w prawym dolnym rogu)

0
2018-03-21 17:45