Adroid Kiosk Mode – jak zmienić urządzenie z Androidem w urządzenie do dedykowanego użytku

Android Kiosk Mode - how to turn an Android device into a single-use device
Android Kiosk Mode - jak zmienić urządzenie z Androidem
w urządzenie jednorazowego użytku

Separating icon

Paragraph icon

Systemu Android nie trzeba przedstawiać. Obecnie jest to najbardziej popularny system operacyjny dla smartfonów. Jednak Android nie jest już używany tylko w elektronice użytkowej. Dziś urządzenia z Androidem możemy spotkać na każdym kroku. System ten jest coraz częściej stosowany w takich branżach jak: bezpieczeństwo, automatyzacja, logistyka, sprzedaż, hotelarstwo itp. Ze względu na łatwość użytkowania, poziom dostosowania i niższe koszty, urządzenia z Androidem są wybierane przez wiele przedsiębiorstw. Jednak dla wielu firm systemy Android nie są uważane za wystarczająco bezpieczne do użytku w miejscu pracy. Jednym z najlepszych rozwiązań dla powyższych problemów jest narzędzie Kiosk Mode, które pozwala przekonwertować Twoje urządzenie z Androidem w dedykowaną aplikację, zapewniając jednocześnie dodatkowe bezpieczeństwo i redukując dodatkowe elementy rozpraszające uwagę. Życzymy miłej lektury!

Separating icon

COSU – corporate-owned single use device (urządzenie do dedykowanego użytku dla firm)

Paragraph iconW pełni zarządzane, dedykowane urządzenia służą określonemu celu. Dzięki temu możliwe jest maksymalne wykorzystanie urządzenia, przy jednoczesnym ograniczeniu korzystania z funkcji osobistych takich jak np. komunikatory. Z wieloma takimi urządzeniami mamy do czynienia na co dzień. Są to między innymi automaty, drukarki biletów czy parkomaty. COSU umożliwia administratorom IT zdalne sterowanie wszystkimi tymi urządzeniami i blokowanie urządzeń dla określonej aplikacji. Uniemożliwia to użytkownikom korzystanie z innych aplikacji lub wykonywanie innych czynności na tych urządzeniach.

Separating icon

Kiosk Mode

Paragraph icon

Kiosk Mode pozwala zamienić urządzenia z Androidem w urządzenia do dedykowanego użytku (Single-Use Device), uruchamiając tylko jedną aplikację lub określony zestaw aplikacji. Począwszy od Androida 5.0 Lollipop, system oferuje dwa sposoby blokowania urządzenia w określonym celu:

 

  • App pinning – korzystając z funkcji przypinania aplikacji, użytkownicy mogą tymczasowo przypiąć dowolną zainstalowaną aplikację na ekranie. Przyciski nawigacyjne są widoczne, ale nieaktywne. Użytkownik może wyjść z tego trybu, przytrzymując jednocześnie przycisk „Home” i „Recent apps”.
  • Lock task mode – jest to jeszcze skuteczniejszy sposób na przekształcenie urządzenia z Androidem w dedykowane urządzenie o tylko jednym przeznaczeniu. Tylko aplikacje umieszczone na białej liście przez Device Policy Controller (DPC) mogą być blokowane. Przyciski nawigacyjne są ukryte. Jest to tryb dostępny tylko dla właścicieli urządzeń.

Uruchomienie aplikacji w trybie Kiosk Mode daje nam szereg korzyści:

  • urządzenie działa jako pojedyncza platforma,
  • ukryte przyciski nawigacyjne (lock task mode),
  • nieaktywny pasek stanu,
  • automatyczne uruchamianie aplikacji wraz ze startem systemu,
  • wyłączone powiadomienia,
  • zablokowane połączenia przychodzące,
  • nieaktywne przejście do ustawień,
  • praca w trybie pełnoekranowym,

Separating icon

Jak włączyć tryb Android Kiosk Mode?

Paragraph icon

 

Pierwszym krokiem jest zaimplementowanie klasy dziedziczącej po klasie DeviceAdminReceiver:

 

class MyDeviceAdminReceiver : DeviceAdminReceiver() {
    companion object {
        fun getComponentName(context: Context): ComponentName {
            return ComponentName(context.applicationContext, MyDeviceAdminReceiver::class.java)
        }
    }
}

DeviceAdminReceiver to klasa, która zapewnia wygodę w interpretacji surowych działań intencji, które są wysyłane przez system.

Następnie musimy poinformować system, że nasza aplikacja ma zostać administratorem urządzenia. Możemy to zrobić dodając odbiornik w pliku AndroidManifest.xml:

<application>
          ...
      <receiver
            android:name=".MyDeviceAdminReceiver"
            android:description="@string/app_desc"
            android:label="@string/app_name"
            android:permission="android.permission.BIND_DEVICE_ADMIN">
            <meta-data
                android:name="android.app.device_admin" />
            <intent-filter>
                <action android:name="android.app.action.DEVICE_ADMIN_ENABLED" />
            </intent-filter>
        </receiver>
    </application>

W tym momencie możemy przystąpić do instalacji aplikacji. Pamiętaj, że jeśli chcesz przyznać uprawnienia administracyjne do aplikacji, musisz usunąć wszystkich istniejących użytkowników. Najprostszym sposobem jest przywrócenie fabrycznych ustawień urządzenia. Ważne jest, aby podczas pierwszego uruchomienia po resecie nie dodawać konta Google do urządzenia. Lista kroków do poprawnej konfiguracji jest następująca:

  1. przywrócenie ustawień fabrycznych na urządzeniu mobilnym,
  2. pominięcie dodawanie konta Google,
  3. włączenie trybu deweloperskiego i debugowania USB na urządzeniu mobilnym,
  4. zainstalowanie adb (Android Device Bridge) na swoim komputerze – jest on automatycznie instalowany z Android Studio,
  5. zainstalowanie aplikacji na urządzeniu mobilnym za pomocą Android Studio lub wpisując w konsoli następujące polecenia:  
    1. adb install path / to / kiosk / application.apk
  6. nadanie uprawnień administratora urządzenia aplikacji:
    1. adb shell dpm set-device-owner pl.inero.deliverM8 / .MyDeviceAdminReceiver

Użyj następującego fragmentu kodu, aby sprawdzić czy proces przyznawania się powiódł:

override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        mDevicePolicyManager = getSystemService(Context.DEVICE_POLICY_SERVICE) as DevicePolicyManager
        val isAdmin = mDevicePolicyManager.isDeviceOwnerApp(packageName)
        if (isAdmin) {
            println("You are an admin")
        } else {
            println("You are not an admin")
        }
    }

W zależności od potrzeb możemy umożliwić użytkownikowi wyłączenie Kiosk Mode poprzez interfejs (np. poprzez potwierdzenie hasłem) lub całkowicie zablokować wyjście z aplikacji. Za pomocą poniższych fragmentów kodu postaram się wyjaśnić, w jaki sposób możesz kontrolować ustawienia, aby uzyskać rozwiązanie najlepiej odpowiadające Twoim potrzebom.

Jednym z parametrów, które możemy kontrolować jest to, czy utrzymujemy urządzenie włączone, gdy jest ono podłączone. „0” oznacza, że nigdy nie pozostaje włączone, gdy jest podłączone.

private fun enableStayOnWhilePluggedIn(active: Boolean) = if (active) {
        mDevicePolicyManager.setGlobalSetting(mAdminComponentName,
                Settings.Global.STAY_ON_WHILE_PLUGGED_IN,
                (BatteryManager.BATTERY_PLUGGED_AC
                        or BatteryManager.BATTERY_PLUGGED_USB
                        or BatteryManager.BATTERY_PLUGGED_WIRELESS).toString())
    } else {
        mDevicePolicyManager.setGlobalSetting(mAdminComponentName, Settings.Global.STAY_ON_WHILE_PLUGGED_IN, "0")
    }

Jeżeli chcemy nałożyć ograniczenia na użytkownika, możemy skorzystać z metody addUserRestrictrion (ComponentName admin, String key). Użytkownik urządzenia musi mieć uprawnienia administratora, w przeciwnym razie zostanie zgłoszony wyjątek bezpieczeństwa. Tę metodę można wywołać na instancji DevicePolicyManager.

mDevicePolicyManager = getSystemService (Context.DEVICE_POLICY_SERVICE) as DevicePolicyManager

W naszym przypadku zablokowaliśmy użytkownikowi przywracanie ustawień fabrycznych, dodawanie nowych użytkowników, podłączanie nośników zewnętrznych, kontrolowanie głośności urządzenia i wyłączanie paska statusu:

private fun setRestrictions(disallow: Boolean) {
        setUserRestriction(UserManager.DISALLOW_FACTORY_RESET, disallow)
        setUserRestriction(UserManager.DISALLOW_ADD_USER, disallow)
        setUserRestriction(UserManager.DISALLOW_MOUNT_PHYSICAL_MEDIA, disallow)
        setUserRestriction(UserManager.DISALLOW_ADJUST_VOLUME, disallow)
        mDevicePolicyManager.setStatusBarDisabled(mAdminComponentName, disallow)
    }
private fun setUserRestriction(restriction: String, disallow: Boolean) = if (disallow) {
        mDevicePolicyManager.addUserRestriction(mAdminComponentName, restriction)
    } else {
        mDevicePolicyManager.clearUserRestriction(mAdminComponentName, restriction)
    }

Jeżeli chcemy, aby nasza aplikacja startowała wraz ze startem systemu, to musimy dodać odpowiednie filtry:

private fun setAsHomeApp(enable: Boolean) {
        if (enable) {
            val intentFilter = IntentFilter(Intent.ACTION_MAIN).apply {
                addCategory(Intent.CATEGORY_HOME)
                addCategory(Intent.CATEGORY_DEFAULT)
            }
            mDevicePolicyManager.addPersistentPreferredActivity(
                    mAdminComponentName, intentFilter, ComponentName(packageName, MainActivity::class.java.name))
        } else {
            mDevicePolicyManager.clearPackagePersistentPreferredActivities(
                    mAdminComponentName, packageName)
        }
    }

W celu uruchomienia aplikacji w trybie pełnoekranowym należy dodać odpowiednie flagi:

private fun setImmersiveMode(enable: Boolean) {
        if (enable) {
            val flags = (View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                    or View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
                    or View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                    or View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
                    or View.SYSTEM_UI_FLAG_FULLSCREEN
                    or View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY
                    )
            window.decorView.systemUiVisibility = flags
            window.decorView.setOnSystemUiVisibilityChangeListener {
                window.decorView.systemUiVisibility = flags;
            }
        } else {
            val flags = (View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                    or View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
                    or View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN)
            window.decorView.systemUiVisibility = flags
        }
    }

Na koniec używamy metod startLockTask() i stopLockTask(), aby włączyć/wyłączyć tryb blokady zadań:

private fun setLockTask(start: Boolean, isAdmin: Boolean) {
        if (isAdmin) {
            mDevicePolicyManager.setLockTaskPackages(
                    mAdminComponentName, if (start) arrayOf(packageName) else arrayOf())
        }
        if (start) {
            startLockTask()
        } else {
            stopLockTask()
        }
    }

Separating icon

Wynik

Paragraph iconPowyższe operacje pozwalają zmienić urządzenie z systemem Android w urządzenie dedykowane, działające w trybie pełnoekranowym i uniemożliwiające użytkownikowi korzystanie z innych funkcjonalności. Na potrzeby egzemplifikacji naszej sprawy wykorzystaliśmy opracowaną w naszej firmie aplikację mobilną do zarządzania łańcuchem dostaw. Aplikacja ta jest częścią platformy DeliverM8, którą opracowaliśmy w celu optymalizacji i planowania zadań związanych z zarządzaniem łańcuchem dostaw dla Dostawy Ostatniej Mili. Wracając do tematu, efekt końcowy wygląda następująco:

Android Kiosk mode visualisation

Separating icon

Podsumowanie

Paragraph icon

W tym wpisie pokazaliśmy jak szybko skonfigurować aplikację mobilną, aby uzyskać jednocelowe urządzenie, które w jak największym stopniu spełnia nasze potrzeby. Korzystanie z Kiosk Mode niesie za sobą wiele korzyści, takich jak zwiększenie bezpieczeństwa czy ograniczenie dostępu do niepożądanych funkcjonalności, stworzenie rozwiązania dostosowanego zarówno do potrzeb pracowników (zarządzanie zasobami, zarządzanie transportem i logistyką) jak i klientów.

 

Inero Software oferuje wiedzę i doświadczenie w zakresie skutecznego wykorzystywania najnowocześniejszych technologii i danych do kształtowania korporacyjnych produktów cyfrowych przyszłości.

W sekcji BLOG można znaleźć inne artykuły dotyczące nowoczesnych rozwiązań dla przedsiębiorstw.