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

114

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

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

Эрик Х
источник
Вы решаете вашу проблему?
Menna-Allah Sami
3
Да, это возможно. Я написал
funcoder
Я также создал сообщение в блоге об этом (частично) с использованием Lollipop - хотя он исключает часть загрузочного приемника: sureshjoshi.com/mobile/android-kiosk-mode-without-root
SJoshi
Я ответил на аналогичный вопрос здесь о различных методах создания заблокированных одноразовых устройств: stackoverflow.com/a/43644803/2888763
Trevor

Ответы:

29

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

Я думаю, что есть некоторые случаи, с которыми вы не можете справиться без изменения фреймворка (например, долгое нажатие на главном экране, чтобы показать текущие активные приложения) - хотя я тоже мог ошибаться.

Но для прототипа этого могло быть достаточно.

Удачи мастеру!

[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>
Valentin
источник
1
Вам также нужно переопределить onbackpressed of first acitivty, иначе, когда вы нажмете кнопку возврата, вы перейдете к пусковой установке
ademar111190
Как добиться системного диалога с
панелями
1
@GnanamR: посмотрите мой ответ на: stackoverflow.com/questions/11958034/hide-tablet-system-bar
Basher51
@Rinkalkumar Запустить приложение в полноэкранном режиме.
John61590
17

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

RBOT
источник
7
Могу ли я узнать, почему это было отклонено? Я написал свое полноценное, развернутое в настоящее время киоск-приложение для Android, отредактировав и разработав приложение для запуска Android Plus.
rbot
1
В таком случае, я поддерживаю и ваш ответ, и ваш комментарий ;-)
Mawg говорит восстановить Монику
@rbot, как ты это сделал? Я пытался создать киоск-приложение целую вечность, и я решил почти все остальное, за исключением того, что убедился, что панель уведомлений не открывается.
Wakka02
1
@ Wakka02 Я думаю, что искал onwindowchanged или какое-то подобное событие (которое, возможно, может указывать на открытие лотка уведомлений) и закрыл лоток. Я делал это довольно давно, поэтому не помню подробностей.
rbot
@ Wakka02: посмотрите мой ответ на: stackoverflow.com/questions/11958034/hide-tablet-system-bar
Basher51
17

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

L 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().
nhaarman
источник
3
developer.android.com/guide/topics/admin/device-admin.html - при развертывании приложения для администрирования устройства.
Toshe
2
Вот моя статья о блокировках
PVoLan
9

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

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

    <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/, чтобы узнать другой способ

matt_lethargic
источник
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

сначала вы должны установить свое приложение в качестве владельца устройства. 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 ( рут не требуется )

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

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

Google недавно выпустил Android Management API, который позволяет легко настраивать режим киоска для любых устройств 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

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

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

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

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

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

Служба настроена как служба переднего плана. Это не позволяет Android убить наш сервис. Нажмите кнопку «Стоп», чтобы выключить режим киоска.

Похоже, что для загрузки также доступен пример ZIP-файла с кодом режима киоска .

Большой Богатый
источник
2

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

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

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

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

JohnyTex
источник
Любой модуль 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);
                        }
                    }
                });
    }

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

Кристи Уэлш
источник
как насчет панели уведомлений?
Эльшан