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

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

Ответ 1

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

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

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

  • Настройте планшеты, используя различные хаки.

Итак, я объясню второй вариант.

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

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

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

Хорошо, так что у нас есть все, что остается, - заставить ваше приложение запускаться во время загрузки. Для этого вы можете найти множество учебников, просто Google.

Ответ 2

С 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

Ответ 3

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

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, если вы хотите закрыть приложение. Вы можете рассмотреть способ сделать это, например, нажав кнопку "Выход". В моем случае требуется пароль для выхода.

Ответ 5

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

12oz Ответ мыши (fooobar.com/info/494837/...) может работать в большинстве случаев, но он не полностью безопасен. Ваше приложение или услугу всегда можно убить системой или сбой, предоставляя пользователю полный доступ к устройству.

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

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

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

ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: Я работаю для Mason