#java #android
#java #Android
Вопрос:
У нас есть требование, чтобы наше приложение всегда было на высоте. Фактически нам нужно создать режим киоска для устройства. Эти устройства будут предоставлены пользователям, чтобы они использовали только наше приложение на устройстве.
Мы провели некоторое исследование по перехвату всех возможных ключевых событий, таких как нажатие пользователем Home и Search, но этот метод кажется довольно сложным.
Мы решили попробовать создать сервис с нашим приложением, которое будет отслеживать, какой процесс находится на самом верхнем уровне, и, если это не наше приложение, вернуть наше на первое место. Мы застряли на части вывода нашего приложения на вершину. При попытке использовать startActivity() ничего не происходит. Мы подумали, что это можно было бы сделать таким же образом, как домашняя программа запуска вызывает нашу активность.
Мы просмотрели все сообщения, связанные с этим, но не нашли правильного решения. Если есть лучший способ сделать это, пожалуйста, дайте мне знать!
большое, очень большое спасибо.
Комментарии:
1. Как отвратительно! Что происходит при входящих телефонных звонках? Устройство не может принимать телефонные звонки в режиме киоска? Звучит настолько банально, что вместо этого вам следует рассмотреть возможность использования настроенного ПЗУ.
2. у него не будет телефонного плана. Это всего лишь устройство сбора данных. Не обязательно полностью блокировать их, просто не рекомендуется использовать устройство для других целей.
Ответ №1:
Эти устройства будут предоставлены пользователям, чтобы они использовали только наше приложение на устройстве.
Единственный способ, который будет полностью работать, — это если вы производите устройство самостоятельно.
Мы решили попробовать создать сервис с нашим приложением, которое будет отслеживать, какой процесс находится на самом верхнем уровне, и, если это не наше приложение, вернуть наше на первое место. Мы застряли на части вывода нашего приложения на вершину. При попытке использовать startActivity() ничего не происходит. Мы подумали, что это можно было бы сделать таким же образом, как домашняя программа запуска вызывает нашу активность.
Почему бы вам просто не сделать ваше приложение начальным экраном? Таким образом, любой, кто нажмет HOME, перейдет к вашему приложению.
Конечно, пользователи могут перезагрузить эти устройства в «безопасном режиме» и удалить ваше приложение, если только вы не производите устройство самостоятельно и не можете использовать его в качестве начального экрана прошивки.
Комментарии:
1. Технически вам не обязательно создавать его самостоятельно, но для этого потребуется настроенное ПЗУ.
2. @EboMike: Верно, но я предполагаю / надеюсь / что угодно, что OP не собирается распространять оборудование, на которое не распространяется какая-либо гарантия. Может быть, они сами гарантируют оборудование или что-то в этомроде.
3. спасибо, ребята, я бы предпочел не идти этим путем из-за проблемы с гарантией, а также из-за гибкости при переходе на другое оборудование. На самом деле они просто не хотят, чтобы пользователи просматривали веб-страницы и тому подобное. Если у них есть какие-либо технические возможности и они могут взломать их, то это не проблема
Ответ №2:
Ну, я разрабатываю приложение, которое должно быть недоступным. Это потому, что это приложение используется инспекторами дорожного движения, а не для ежедневных звонков, и мы должны были убедиться, что они не выходят из нашего приложения и не занимаются серфингом в Интернете вместо работы.
Итак, вы должны включить это в свой mainfest:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.droid"
android:versionCode="1"
android:versionName="1.0">
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"></uses-permission>
<uses-permission android:name="android.permission.CALL_PHONE"/>
<uses-permission android:name="android.permission.GET_TASKS"/>
<uses-permission android:name="android.permission.READ_CONTACTS"/>
<uses-permission android:name="android.permission.SET_WALLPAPER" />
<uses-permission android:name="android.permission.EXPAND_STATUS_BAR"/>
<uses-permission android:name="android.permission.CAMERA"/>
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.autofocus" />
<application
persistent="true"
android:icon="@drawable/icon"
android:label="@string/app_name"
android:debuggable="true">
<activity android:name=".YourActivity"
android:label="@string/app_name"
android:theme="@android:style/Theme.NoTitleBar.Fullscreen"
android:imeOptions="actionSend|flagNoEnterAction"
android:configChanges="keyboardHidden|orientation">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
<category android:name="android.intent.category.HOME"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
</activity>
<receiver android:name="BootReceiver">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
<category android:name="android.intent.category.HOME" />
</intent-filter>
</receiver>
</application>
</manifest>
Вы должны поместить класс boot receiver в свое приложение:
(BootReceiver.java )
public class BootReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent arg1) {
Intent startupIntent = new Intent(context, YourActivity.class);
startupIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(startupIntent);
}
}
После этого вы должны отключить все кнопки в своих действиях:
/**
* This method disables all buttons.
*/
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
return true;
}
/**
* This method disables all buttons.
*/
@Override
public boolean onKeyUp(int keyCode, KeyEvent event) {
return true;
}
Теперь у вас есть основа приложения, из которого нельзя выйти (даже если пользователь нажимает кнопку «Домой»), и если он перезагрузит телефон, ваше приложение запустится сразу после завершения загрузки. Теперь он может стереть ваше приложение, только если у него есть adb (и вы оставили включенной отладку по usb), или если он жестко перезагрузит телефон.
Не стесняйтесь задавать вопросы, если что-то непонятно или если я оставил какие-то ошибки в приведенном ниже коде. И, кстати, вы должны заменить …-ы в своем собственном коде.
Редактировать: исправлен xml.
Комментарии:
1. Я проверю это завтра, чтобы быть более точным (сейчас я дома).
2. Что делать, если пользователь попросил кого-то другого позвонить на телефон (после получения номера телефона?) Как насчет удерживания кнопки HOME для переключения задач? Как насчет удержания кнопки камеры, чтобы переключиться на приложение камеры? (Возможно, некоторые из них покрываются обработчиками OnKey *, но я не так уверен.) Как насчет установки приложения через market.android.com (предполагается, что подключенная учетная запись gmail известна?)
3. @edem: С манифестом, который вы перечислили здесь, кнопка HOME все еще должна работать. Вам понадобится одно из ваших действий, чтобы использовать
HOME
категорию и быть настроенным в качестве начального экрана по умолчанию. И вам все еще приходится иметь дело с безопасным режимом, восстанавливающим доступ к собственному главному экрану устройства, в дополнение к замеченным вами пробелам. Я не совсем уверен, что вы выигрываете во время загрузкиBroadcastReceiver
, хотя, возможно, я чего-то не понимаю.4. Спасибо, джентльмены, я могу попробовать этот метод. Я просто предположил, что будет слишком сложно перехватить все возможные случаи. Я знаю, что приложению под названием Toddlerlock удалось это сделать.
5. эдем, не могли бы вы сказать мне, зачем нужны ссылки на 2 активности в вашем манифесте?