У меня есть гибридное приложение, написанное на телефоне для Android-планшетов. Теперь я хочу, чтобы планшет отображал только мое приложение. В принципе, я хочу, чтобы планшет всегда был в режиме киоска, который запускал только мое приложение. Чтобы все кнопки были отключены. Я искал решения онлайн, и один из них должен использовать "surelock", но он не делает все вышеперечисленное. Другой вариант - написать мой собственный ПЗУ, но я не смог найти никаких хороших учебников по этому поводу. Может ли кто-нибудь помочь мне?
Режим киоска для Android
Ответ 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/
Ответ 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
, если вы хотите закрыть приложение. Вы можете рассмотреть способ сделать это, например, нажав кнопку "Выход". В моем случае требуется пароль для выхода.
Ответ 4
Непринужденное решение возможно в телефоне Samsung, посмотрите на бесплатное приложение Superlock
https://play.google.com/store/apps/details?id=com.superkiosk.ospolice.superlocklite&hl=en_GB
Ответ 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