Как включить режим киоска в пользовательском приложении для Android [дубликат]

Исключение нулевого указателя - это индикатор того, что вы используете объект, не инициализируя его.

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

public class Student {

    private int id;

    public int getId() {
        return this.id;
    }

    public setId(int newId) {
        this.id = newId;
    }
}

Приведенный ниже код дает вам исключение с нулевым указателем.

public class School {

    Student obj_Student;

    public School() {
        try {
            obj_Student.getId();
        }
        catch(Exception e) {
            System.out.println("Null Pointer ");
        }
    }
}

Поскольку вы используете Obj_Student, но вы забыли инициализировать его, как в правильном коде, показанном ниже:

public class School {

    Student obj_Student;

    public School() {
        try {
            obj_Student = new Student();
            obj_Student.setId(12);
            obj_Student.getId();
        }
        catch(Exception e) {
            System.out.println("Null Pointer ");
        }
    }
}
102
задан Joshua Pinter 6 February 2015 в 16:08
поделиться

10 ответов

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

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. Нажмите кнопку «Стоп», чтобы отключить режим киоска.

Кажется, что файл [k2k] с кодом режима доступен для скачивания .

2
ответ дан Big Rich 20 August 2018 в 06:43
поделиться

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

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

9
ответ дан Community 20 August 2018 в 06:43
поделиться

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

2
ответ дан Fred 20 August 2018 в 06:43
поделиться

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

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

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

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

1
ответ дан JohnyTex 20 August 2018 в 06:43
поделиться
  • 1
    Любой модуль Xposed, который, как вы думаете, делает это? – Firelord 21 December 2015 в 09:41

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

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

3
ответ дан Manifest 20 August 2018 в 06:43
поделиться

В новом 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.isLockTaskPermited ().

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

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

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

Запустив ваше приложение при загрузке

, лучший способ выполнить это - установить ваше приложение в качестве запуска

<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();
}
2
ответ дан nonsensei 20 August 2018 в 06:43
поделиться

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

17
ответ дан rbot 20 August 2018 в 06:43
поделиться
  • 1
    Могу ли я знать, почему это было приостановлено? Я написал свое полноценное, в настоящее время развернутое Android-приложение для киоска, редактируя & amp; развивается поверх андроидной пусковой установки plus. – rbot 11 December 2012 в 00:33
  • 2
    В этом случае я подтверждаю ваш ответ и ваш комментарий ;-) – Mawg 19 February 2013 в 10:17
  • 3
    @rbot, как вы это сделали? Я пытаюсь создать приложение для киосков на века, и я решил почти все остальное, за исключением того, что лоток уведомлений не открывается. – Wakka02 11 July 2013 в 09:05
  • 4
    @ Wakka02 Я думаю, что искал onwindowchanged или какое-то подобное событие (которое может указывать на открытие Notification Tray) и закрыть лоток. Я сделал это давно, поэтому не помню специфику. – rbot 19 July 2013 в 17:34
  • 5
    @ Wakka02: проверьте мой ответ на: stackoverflow.com/questions/11958034/hide-tablet-system-bar – Basher51 2 May 2014 в 10:29

Вы можете запускать автозапуск приложений при загрузке, прослушивая намерение 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>
25
ответ дан Valentin 20 August 2018 в 06:43
поделиться
  • 1
    Вам также необходимо переопределить onbackpressed от первого действия, когда вы нажмете кнопку «Назад», которую вы переходите в панель запуска – ademar111190 19 June 2012 в 21:17
  • 2
    Как получить системный диалог n предупреждающих полос, отключенных с помощью кода – Gnanam R 10 April 2013 в 05:43
  • 3
    @GnanamR: проверьте мой ответ на: stackoverflow.com/questions/11958034/hide-tablet-system-bar – Basher51 2 May 2014 в 10:30
  • 4
    @Rinkalkumar Запустите приложение в полноэкранном режиме. – John61590 30 May 2014 в 06:52
9
ответ дан Community 31 October 2018 в 06:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: