Режим киоска в Android - PullRequest
       44

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

110 голосов
/ 15 января 2010

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

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

Ответы [ 10 ]

26 голосов
/ 15 января 2010

Вы можете автоматически запускать приложения при загрузке, прослушивая намерение android.intent.action.BOOT_COMPLETED в BroadcastReceiver и начиная свою деятельность оттуда.В Activity вы можете зарегистрироваться как новый домашний экран по умолчанию [1] и управлять клавишами.

Я думаю, что есть некоторые случаи, которые вы не можете обработать, не изменяя структуру (например, длительное нажатие на 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>
17 голосов
/ 03 июля 2014

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

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

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

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

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

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

9 голосов
/ 02 августа 2013

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

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

    <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/ для другого способа

4 голосов
/ 15 сентября 2017

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

3 голосов
/ 03 октября 2016

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

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

2 голосов
/ 27 июля 2016

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

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

<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 ( без рута )

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();
}
2 голосов
/ 02 февраля 2012

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

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

1 голос
/ 20 августа 2015

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

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

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

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

0 голосов
/ 25 марта 2016

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

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

...