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

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

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

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

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

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

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

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

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

    • Прикрепите устройство, на userdebug сборка пользовательских 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.isLockTaskPermited ().

    Чтобы активировать блокировку задач, вызовите android.app.Activity.startLockTask() из вашего разрешенного действия.

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

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

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

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

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

      К вашему фильтру намерения

    • Убедитесь, что ваше приложение разрушает панель инструментов, поэтому вы не можете добраться до панели уведомлений, см. Раздел «Как отключить панель состояния / панель уведомлений на андроиде программно? Или 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/ по-другому

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

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

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

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

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

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

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

    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-кода в режиме киоска также доступен для загрузки .

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

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

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

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

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

    Это полностью скроет кнопку «Назад», кнопку «Приложения» и «Домашняя кнопка».