Режим киоска для android

У меня есть гибридное приложение, написанное на phonegap для планшетов android. Теперь я хочу, чтобы планшет показывал только мое приложение. В основном я хочу, чтобы планшет всегда был в режиме киоска, работающем только с моим приложением. Так что все кнопки отключены. Я искал решения в интернете, и один из них-использовать "surelock", но он не делает все вышеперечисленное. Другой вариант-написать свой собственный ПЗУ, однако я не смог найти хороших учебников по этому вопросу. Кто-нибудь может мне помочь?

6 ответов


Я сделал много исследований, и теперь, наконец, я доволен тем, что я получил.

у вас в основном есть два варианта:

  1. создайте свой собственный ПЗУ, что не является лучшим решением для меня.

  2. настройка планшетов с помощью различных хаков.

поэтому я буду объяснять второй вариант.

сначала вам нужно укоренить свои устройства. Существуют различные методы, но я предпочитаю укоренение программное обеспечение лучше. Для китайских планшетов вы можете использовать VROOT, а для более популярных-Kingo root.

теперь, когда у вас есть устройство коренится, мы можем избавиться от верхней и нижней панели.

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

Это заставит верхнюю и нижнюю панель исчезнуть. Однако вам, вероятно, понадобится способ снова показать бары. Для этого вы можете использовать:

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 Итак, у нас есть это, все, что осталось, это запустить ваше приложение во время загрузки. Для этого вы можете найти много учебники, просто погуглите.


с Android L-release (Lollipop) есть функция, называемая закреплением, которая в значительной степени эквивалентна режиму киоска. Вот ссылка, которая объясняет, как его настроить.

Я считаю, что Apple представила это впервые в iOS. Несмотря на то, что OP не спросил, я также предоставляю детали для 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


я думаю, что есть альтернативное решение без укоренения устройства. Мой босс попросил меня избегать укоренения, поэтому после некоторых исследований я пришел к этому обходному пути. В результате никаких взломов не было сделано, системные ключи все еще остаются, но пользователь не может выйти из приложения и запустить еще один. Итак, я сделал следующие шаги.

1. При редактировании манифеста установите полноэкранную тему без TitleBar и ActionBar соответствующего Activity, как это:

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

2. Отключена кнопка назад путем переопределения метода Activity класс:

@Override
public void onBackPressed() {
    return;
}

3. Добавьте следующие строки для манифеста (фильтр намерения соответствующего 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>

теперь вы можете заменить домашний экран по умолчанию с вашим приложением. Но возможность выйти из приложения еще остается, нажав на кнопку" последние приложения " и выбрав другой.

4. Чтобы избежать всех других способов выхода из приложения я добавил сервис, который запускается каждый раз, когда действие приостановлено. Эта служба перезапускает приложение и отправляет уведомление о нем. Код сервиса:

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");
    }
}

код добавлен в класс Activity:

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

на exitAllowed логическая переменная должна быть задана в true когда вы хотите закрыть приложение. Вы можете рассмотреть какой-то способ сделать это, например, нажав кнопку "Выход". В моем случае для выхода требуется пароль.


некорневое решение возможно в телефоне Samsung, посмотрите на бесплатное приложение Superlock

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


вам не нужно создавать пользовательский ПЗУ или даже корневые устройства, чтобы получить режим киоска. Обычно настоятельно рекомендуется не корневой устройств, которые будут в поле, особенно, если ваши приложения будут иметь конфиденциальные данные.

ответ мыши 12oz (https://stackoverflow.com/a/29560438/2888763) может работать в большинстве случаев, но это не совсем безопасно. Ваше приложение или услуга всегда могут быть убиты системой или сбоем, предоставляя пользователю полный доступ к устройство.

один из способов достижения режима киоска-использовать Google режим блокировки задачи - который отличается от screen-pinning (https://developer.android.com/work/cosu.html). Ссылка там перечисляет некоторые из функций режима задачи блокировки, такие как: наличие одного приложения, прикрепленного к главному экрану, и отключение/скрытие кнопок Home и Recents. Ссылка также показывает, почему самой большой проблемой с решением Google является сложность его настройки. Вы либо должны " использовать стороннее решение enterprise mobility management (EMM)" или "создайте собственное приложение DPC". Решение COSU от Google также может не работать, если у вас нет доступа к сервисам Google Play.

другой вариант-использование мобильной платформы развертывания, такой как Mason (https://bymason.com/), где вы можете создать пользовательскую ОС Android за несколько минут с такими функциями, как режим киоска. Затем можно удаленно развернуть обновления ОС или приложений на всех устройствах.

Не стесняйтесь пинг меня напрямую: trevor @ bymason.com

отказ от ответственности: я работаю на Mason


в конечном итоге я остановился на этом решении, не нуждается в корневых, внешних приложениях и может использоваться в браузерах, webapps и родных приложениях:

захватывающий полноэкранный режим

  1. используя adb, проверьте, отображается ли ваше устройство с помощью adb devices (параметры dev должны быть включены)
  2. найти идентификатор приложения, которое вы хотите в полноэкранном режиме (если это веб-приложение, это браузер, который он использует, как org.mozilla.firefox или com.android.chrome) это в play store url:https://play.google.com/store/apps/details?id=org.mozilla.firefox
  3. Excecute в команда adb shell settings put global policy_control immersive.full=org.mozilla.firefox замена org.mozilla.firefox С вашим id

подробнее здесь: https://www.howtogeek.com/302194/how-to-force-any-android-app-into-fullscreen-immersive-mode-without-rooting/

в сочетании с закреплением экрана:

  1. запустите приложение Настройки на вашем устройстве Android.
  2. прокрутите вниз, пока не найдете опцию безопасности. Нажмите на него.
  3. в нижней части страницы безопасности нажмите на экране пиннинг.
  4. сдвиньте переключатель в положение On.
  5. Откройте приложение, перейдите в вид с вашими последними приложениями и нажмите значок pin на предварительном просмотре текущего приложения (внизу справа)