Исключение нулевого указателя - это индикатор того, что вы используете объект, не инициализируя его.
Например, ниже - класс ученика, который будет использовать его в нашем коде.
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 ");
}
}
}
Нашел еще одну возможную технику на этом форуме forum . Цитируя это сообщение:
Используя следующие методы, вы можете создать приложение, которое предотвратит воспроизведение «обычных» пользователей с помощью чего-либо, кроме вашего приложения.
Приложение состоит из двух модулей. Основная деятельность и услуга. Служба настроена на запуск при загрузке. Когда служба запускается, она проверяет, работает ли действие или нет. Если он не работает, он использует таймер для запуска основного действия.
Когда действие приостановлено, он запускает службу за одну секунду: Код:
Sub Activity_Pause (UserClosed As Boolean) If kiosk Then StartServiceAt(KioskService, DateTime.Now + 1 * DateTime.TicksPerSecond, false) End Sub
Если пользователь нажимает на главный экран, главный экран будет отображаться в течение нескольких секунд. Однако ваше приложение вернется на передний план через несколько секунд, и пользователь не сможет взаимодействовать с другими приложениями или изменить настройки.
Служба настроена на работу переднего плана. Это предотвращает убийство нашей компанией Android. Нажмите кнопку «Стоп», чтобы отключить режим киоска.
Кажется, что файл [k2k] с кодом режима доступен для скачивания .
Наряду с настройкой приложения с приемником 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);
}
}
});
}
Это полностью скроет кнопку «Назад», кнопку «Приложения» и «Главная».
Недавно Google выпустил API управления Android , который позволяет легко настроить режим киоска для любых Android-устройств под управлением Android 5.1 или выше, а также для установки различных других политик.
Xposed framework может это сделать. Он нуждается в корне, и есть вероятность, что он не будет работать на всех платформах. Ищите метод disable () в классе android.app.StatusBarManager.
Здесь, в исходном коде Android
Посмотрите здесь, как написать собственный модуль: Xposed учебник по разработке
Это намного проще, чем вы думаете на первый взгляд. Удачи!
Настроить страницу для одиночных целей Страница разработчика Android описала эту вещь, которую вы можете легко узнать оттуда.
Теперь легко настроить Android 6.0 Marshmallow и более поздние устройства в качестве корпоративных, одноразовых (COSU) устройств.
В новом 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()
.
, лучший способ выполнить это - установить ваше приложение в качестве запуска
<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://code.google.com/p/android-launcher-plus/
Вы можете запускать автозапуск приложений при загрузке, прослушивая намерение 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>