Режим кіоску в Android


114

Я перебуваю в процесі оцінки того, як і як можна перенести корпоративну програму CF .NET для роботи на пристроях Android. Додаток на мобільних телефонах Windows запускається в режимі кіоску, де програма автоматично запускається в повноекранному режимі після завантаження, а користувачі не можуть випадково або охоче отримати доступ до будь-яких інших частин телефону.

Чи можливо на Android мати лише один додаток для автоматичного запуску після завантаження і перешкодити користувачам випадково (або охоче) отримати доступ до будь-яких інших частин пристрою Android?


Ви вирішуєте проблему ур?
Менна-Аллах Самі

3
Так, можливо. Я створив з цього приводу (дуже) довгий запис у блозі: andreas-schrade.de/2015/02/16/…
funcoder

Я також створив повідомлення про цей блог (частково) за допомогою Lollipop - він виключає частину приймача завантажувача, хоча: sureshjoshi.com/mobile/android-kiosk-mode-without-root
SJoshi

Я відповідав на подібне питання тут про різні методи для створення заблокованих пристроїв одноразового використання: stackoverflow.com/a/43644803/2888763
Тревор Halvorson

Відповіді:


29

Ви можете автозапустити програми під час завантаження, прослухавши про android.intent.action.BOOT_COMPLETEDнаміри в BroadcastReceiver і почати свою діяльність звідти. У розділі Діяльність ви можете зареєструвати себе як новий початковий екран за замовчуванням [1] та обробити клавіші.

Я думаю, що є деякі випадки, з якими ви не можете впоратися, не змінюючи рамки (наприклад, longpress on Home, щоб показувати активні додатки) - я також можу помилитися.

Але для прототипу, якого могло бути достатньо.

Весело майструйте!

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

1
Вам також потрібно перекрити натиснене на першу активність ще при натисканні на кнопку назад, ви переходите до пускової установки
ademar111190

Як досягти діалогового вікна системи n смужок сповіщень відключений через код
Gnanam R

1
@GnanamR: перевірити мою відповідь на: stackoverflow.com/questions/11958034/hide-tablet-system-bar
Basher51

@Rinkalkumar Запустіть додаток у повноекранному режимі.
Джон61590

17

Ви можете налаштувати це (відключити доступ до меню, обмежити додавання додатків тощо), щоб увімкнути кіоск. http://code.google.com/p/android-launcher-plus/


7
Чи можу я знати, чому це було знято? Я написав свій повноцінний, на даний момент розгорнутий додаток для Android-кіоску, редагуючи та розробляючи поверх Android-пускового пристрою плюс.
rbot

1
У такому випадку я схвалюю і вашу відповідь, і ваш коментар ;-)
Мауг каже, що поверніть Моніку

@rbot, як ти це зробив? Я намагався створити додаток для кіоску на віки, і я вирішив майже все інше, крім того, щоб переконатися, що лоток сповіщень не відкриється.
Wakka02

1
@ Wakka02 Я думаю, що я шукав змінити вікно чи якусь подібну подію (яка, можливо, може вказувати на відкриття лотка з повідомленнями) і закрити лоток. Я робив це давно, тому не пам’ятайте конкретики.
rbot

@ Wakka02: перевірити мою відповідь на: stackoverflow.com/questions/11958034/hide-tablet-system-bar
Basher51

17

У новій Android L Preview Google оголосила про блокування завдань , яке робить саме це. Однак, схоже, він потребує кореня.

L Pre Developer Preview представляє новий API блокування завдань, який дозволяє тимчасово обмежувати користувачів не залишати вашу програму або переривати її сповіщеннями. Це може бути використано, наприклад, якщо ви розробляєте навчальний додаток для підтримки високих вимог оцінювання ставок на Android. Щойно ваша програма активує цей режим, користувачі не зможуть бачити сповіщення, отримувати доступ до інших програм або повертатися на головний екран, поки ваш додаток не вийде з режиму.

Щоб запобігти несанкціонованому використанню, лише авторизовані програми можуть активувати блокування завдань. Крім того, авторизація блокування завдань повинна бути надана спеціально налаштованою програмою власника пристрою через android.app.admin.DevicePolicyManager.setLockTaskComponents()метод.

Щоб налаштувати власника пристрою, виконайте такі дії:

  • userdebugДо свого розроблювального апарату підключіть пристрій під керуванням ОС Android .
  • Встановіть додаток власника пристрою.
  • Створіть device_owner.xmlфайл і збережіть його в /data/systemкаталозі на пристрої.
$ 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

Перш ніж використовувати API блокування завдань у вашому додатку, переконайтесь, що ваша діяльність авторизована, зателефонувавши до DevicePolicyManager.isLockTaskPermitted ().

Щоб активувати блокування завдань, зателефонуйте android.app.Activity.startLockTask() в авторизовану діяльність.

Коли активовано блокування завдань, набуває чинності така поведінка:

  • Рядок стану порожній, а сповіщення користувачів та інформацію про стан приховано.
  • Кнопки Головна та останні програми приховані.
  • Інші програми можуть не запускати нові дії.
  • Поточний додаток може розпочати нові дії, якщо це не створить нових завдань.
  • Користувач залишається заблокованим у вашій програмі, поки не зателефонує авторизована активність Activity.stopLockTask().

3
developer.android.com/guide/topics/admin/device-admin.html - про розгортання програми Device Admin.
Тоше

2
Ось моя стаття про блокування завдань із алгоритмом повного налаштування pvolan.blogspot.ru/2017/01/android-50-kiosk-mode-aka-super.html
PVoLan

9

Певний пошук цього я придумав хороше рішення. Це працює лише на вкорінених пристроях, але я думаю, якщо це лише для цього додатка, то вкорінення це не повинно бути проблемою.

  • Зробіть додаток запуском, додавши

    <category android:name="android.intent.category.HOME" /> 

    до вашого фільтра намірів

  • Переконайтеся, що ваш додаток згортається на панелі інструментів, щоб ви не могли дійти до панелі сповіщень. або http://blog.vogella.com/2011/02/28/android-hidding-the-status-and-title-bar/

  • Потім, щоб зупинити будь-які інші програми від відкриття помилково, скористайтеся службою доступності, щоб перевірити, чи не змінено стан вікна, порівняйте пакет із білим або чорним списком та використовуйте ActivityManager.killBackgroundProcess для вбивства, якщо він не повинен запускатися.

Також перегляньте http://thebitplague.wordpress.com/2013/04/05/kiosk-mode-on-the-nexus-7/ для іншого способу


5

Запуск програми під час завантаження

НАЙКРАЩИЙ спосіб досягти цього - це встановити ваш додаток для запуску

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

Блокування програми

найнадійнішим способом є використання пристрою з Lollipop або більше і використовувати його

startLockTask

спочатку потрібно встановити додаток як власника пристрою. Зверніть увагу: ваш пристрій має бути відремонтовано: якщо ви зареєстрували його, слід виконати скидання на заводські налаштування та пропустити реєстрацію облікового запису.

щоб мати можливість зареєструвати додаток, спершу потрібно встановити компонент 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!
    }
}

як тільки у вас є непідготовлений пристрій, ви можете запустити наступну команду з adb ( не потрібен root )

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

щоб уникнути андроїда запитувати у користувачів дозволу закріпити ваш додаток, ви повинні зателефонувати на setLockTaskPackages

нарешті!

@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();
}

5

Нещодавно компанія Google випустила API управління Android, який дозволяє легко налаштувати режим кіоску для будь-яких пристроїв Android під управлінням Android 5.1 або новіших версій, а також встановити різні інші правила.


Дивовижна знахідка. Ось пряме посилання на інформацію про режим кіоску: developers.google.com/android/management/policies/…
Роберт Лібераторе


2

У цій публікації на форумі знайдено ще одну можливу техніку . Цитуючи цю публікацію:

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

Використовуючи наведені нижче методи, ви можете створити додаток, який не дозволить "звичайним" користувачам грати з чим-небудь, крім вашої програми.

Додаток складається з двох модулів. Основна діяльність та послуга. Служба налаштована на запуск при завантаженні. Коли служба запускається, вона перевіряє, активність запущена чи ні. Якщо він не запущений, для початку основної діяльності використовується таймер.

Коли діяльність призупинена, вона планує запустити послугу на одну секунду: Code:

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

Якщо користувач натисне на головний екран, на декількох секундах з’явиться головний екран. Однак ваша програма повернеться на передню частину через кілька секунд, і користувач не зможе взаємодіяти з будь-якими іншими програмами або змінювати налаштування.

Служба встановлена ​​як послуга переднього плану. Це не дозволяє Android вбити наш сервіс. Натисніть кнопку Зупинити, щоб вимкнути режим кіоску.

Здається, що для завантаження також доступний приклад ZIP-файлу в режимі кіоску .


2

Розроблений фреймворк може це зробити. Йому потрібен корінь, і існує ймовірність, що він не працюватиме на всіх платформах. Шукайте метод enable () у класі android.app.StatusBarManager .

Тут у вихідному коді Android

Подивіться тут, як написати свій власний модуль: Підручник з розробленої експозиції

Це набагато простіше, ніж ти думаєш на перший погляд. Щасти!


Будь-який модуль Xposed, на вашу думку, робить це?
Firelord

0

Поряд із налаштуванням програми за допомогою BOOT-приймача, і ця відповідь на запобігання розширення рядка стану, це рішення працює з 4.4 та вище як повноцінна програма для кіоску:

Розмістіть у своєму 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);
                        }
                    }
                });
    }

Це повністю приховає кнопку назад, програми та кнопку додому.


як щодо панелі сповіщень?
Ельшан
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.