Режим киоска в Android

Я занимаюсь оценкой того, можно ли портировать корпоративное приложение CF.NET для работы на устройствах Android. Приложение на телефонах Windows Mobile запускается в режиме киоска, где автозапуск приложения в полноэкранном режиме после загрузки и с пользователями, которые не могут случайно или охотно обращаться к другим частям телефона.

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

Ответ 1

Вы можете запускать автозапуск приложений при загрузке, прослушивая намерение android.intent.action.BOOT_COMPLETED в BroadcastReceiver и запуская свою активность там. В Activity вы можете зарегистрировать себя как новый рабочий стол по умолчанию [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>

Ответ 2

Вы можете настроить это (отключить доступ к меню, ограничить добавление приложения и т.д.), чтобы включить киоск. http://code.google.com/p/android-launcher-plus/

Ответ 3

В новом Android L Preview Google объявила Task Locking, что делает именно это. Однако, похоже, он нуждается в корне.

L Developer Preview представляет новый API блокировки задачи, который позволяет вы временно запрещаете пользователям покидать приложение или прерывается уведомлениями. Это можно использовать, например, если вы разрабатывают образовательное приложение для поддержки оценки высоких ставок требования к Android. Когда ваше приложение активирует этот режим, пользователи не иметь возможности видеть уведомления, получать доступ к другим приложениям или возвращаться к Домашний экран, пока ваше приложение не выйдет из режима.

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

Чтобы настроить владельца устройства, выполните следующие действия:

  • Прикрепите устройство под управлением Android userdebug для вашей разработки машина.
  • Установите приложение владельца устройства.
  • Создайте файл 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()от вашего разрешенного действия.

Когда блокировка задачи активна, действует следующее поведение:

  • Строка состояния пустая, а пользовательские уведомления и информация о состоянии скрыт.
  • Кнопки Home и Recent Apps скрыты.
  • Другие приложения могут не запускать новые виды деятельности.
  • Текущее приложение может запускать новые действия, пока это не создает новых задач.
  • Пользователь остается заблокированным на вашем приложении до тех пор, пока не будет разрешено авторизированное действие Activity.stopLockTask().

Ответ 4

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

  • Сделайте свое приложение пусковой установкой, добавив

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

    в ваш фильтр намерений

  • Убедитесь, что ваше приложение разрушает панель инструментов, чтобы вы не могли дойти до панели уведомлений. Как отключить панель состояния/панель уведомлений на программном обеспечении Android? или http://blog.vogella.com/2011/02/28/android-hidding-the-status-and-title-bar/

  • Затем, чтобы остановить любые другие программы от открытия по ошибке, используйте службу специальных возможностей для проверки состояния окна, измененного, сравните пакет с белым или черным списком и используйте ActivityManager.killBackgroundProcesses, чтобы убить, если он не должен запускаться.

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

Ответ 5

Настроить страницу целевых устройств разработчика Android рассказали об этом, что вы можете легко узнать оттуда больше.

Теперь легко настроить устройства Android 6.0 Marshmallow и более поздние как корпоративные однопользовательские (COSU) устройства.

Ответ 6

Нашел еще одну возможную технику в этом форуме . Цитирование этой должности:

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

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

Приложение состоит из двух модулей. Основная деятельность и оказание услуг. Служба настроена на запуск при загрузке. Когда услуга запускается он проверяет, работает ли операция или нет. Если это не при запуске он использует таймер для запуска основного действия.

Когда действие приостанавливается, он запускает службу для запуска в одном второй: Код:

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

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

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

Кажется, что файл ZIP файла типа kiosk-mode доступен для скачивания.

Ответ 7

Запуск приложения при загрузке

ЛУЧШИЙ способ добиться этого - установить приложение в качестве запуска

<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

сначала вы должны установить свое приложение в качестве владельца устройства. NB ваше устройство должно быть недоступно: если вы его зарегистрировали, вы должны сделать factory reset и пропустить регистрацию учетной записи.

чтобы иметь возможность зарегистрировать свое приложение, вы должны сначала настроить компонент 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();
}

Ответ 8

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

Ответ 9

Xposed framework может это сделать. Он нуждается в корне, и есть вероятность, что он не будет работать на всех платформах. Найдите метод disable() в классе android.app.StatusBarManager.

Здесь, в исходном коде Android

Посмотрите здесь, как написать собственный модуль: Xposed учебник по разработке

Это намного проще, чем вы думаете на первый взгляд. Удачи!

Ответ 10

Наряду с настройкой вашего приложения с ресивером 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);
                        }
                    }
                });
    }

Это полностью скроет кнопку "Назад", кнопку "Приложения" и "Главная".