Android: как управлять кнопкой «Домой»

Мы пытаемся предоставить умственно и физически неполноценной дочери моего соседа приложение, которое позволит ей использовать Android-планшет в качестве Talker, т. е. она нажимает несколько больших кнопок, и устройства генерируют речь. Приложение в основном представляет собой WebView и дополнительный объект в Javascript, используемый для выполнения и управления генерацией речи, а также некоторую логику для обработки изменений ориентации. Файлы HTML создаются в автономном режиме для ее конкретного расположения говорящих элементов. Мы также добавили некоторые средства воспроизведения музыки и просмотра изображений, чтобы сделать устройство более привлекательным для нее.

Проблема в том, что кнопка «Домой» возвращает ее в безумие экрана запуска Android, а на тестовом устройстве (Archos 70) кнопка «Домой» не является физической кнопкой, а отображается на самом сенсорном экране, что делает ее слишком простой. случайно попал.

Поэтому я хотел бы вернуться к средству запуска Android, только нажав последовательность «домой», «назад», «домой» без каких-либо промежуточных действий.

Могу ли я добиться этого, сделав само приложение средством запуска? Как я могу вернуться к исходному лаунчеру в последовательности «дом, назад, дом»? Похоже, это уходит глубоко во внутренности Android, да?

Единственная подсказка, которую я нашел до сих пор, это Overriding Home для замены приложения Car Home, но оно имеет рейтинг -1 и сообщается, что работает только в эмуляторе. Также я сомневаюсь, что смогу полностью отказаться от исходного лаунчера, так как в противном случае больше нет доступа, например. управление массовым USB-устройством, позволяющее загружать новые HTML-файлы, закрывать и перезапускать приложение и т. д.

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


person Wangnick    schedule 26.07.2011    source источник
comment
+1 за осуществление замечательного благотворительного проекта в (как я предполагаю) свободное время.   -  person Ben Siver    schedule 27.07.2011
comment
Посмотрите, что они сделали в приложении для малышей. В конце концов, замена лаунчера может быть не так уж и плоха, может быть большая область экрана, чтобы вернуть ее в основную часть приложения, и небольшая область, чтобы вернуть планшет в нормальный режим. Замок мог быть сделан слишком сложным, чтобы она могла случайно открыть.   -  person Dan S    schedule 27.07.2011
comment
stackoverflow.com/questions/2162182/   -  person ldog    schedule 27.07.2011
comment
Хорошо, добавляем в манифест следующее: ‹category android:name=android.intent.category.DEFAULT /› ‹category android:name=android.intent.category.HOME / ›   -  person Wangnick    schedule 27.07.2011
comment
... заставляет Android спрашивать при нажатии кнопки «Домой», должно ли мое приложение стать стандартным домашним экраном. При ответе «да» Talker застревает на экране. Хорошо. Более того, перезагрузка устройства автоматически запускает Talker. Теперь, как вернуться к исходному лаунчеру домой, назад, домой? Обратите внимание, что я все еще могу выйти из тупика, используя adb shell pm uninstall com.wangnick.smalltalker.   -  person Wangnick    schedule 27.07.2011


Ответы (2)


Могу ли я добиться этого, сделав само приложение средством запуска? Как я могу вернуться к исходному лаунчеру в последовательности «дом, назад, дом»? Похоже, это уходит глубоко во внутренности Android, да?

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

/* This should come from a preference that let's the user select an activity that can handle the HOME intent */
String packageName = "com.android.launcher";
String packageClass = "com.android.launcher2.Launcher";

Intent home_intent = new Intent(Intent.ACTION_MAIN);
home_intent.addCategory(Intent.CATEGORY_HOME);
home_intent.setComponent(new ComponentName(packageName, packageClass));
home_intent.addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
/* Here you should catch the exception when the launcher has been uninstalled, and let the user save themselves by opening the Market or an app list or something. Users sometimes use root apps to uninstall the system launcher, so your fake launcher is all that is left. Might as well give the poor user a hand. */
startActivity(home_intent);

Обнаружение дома/назад/дома немного неудобно, потому что дом придет не как onKeyEvent, а как новое намерение. Простое длительное нажатие кнопки «Назад», а затем отображение подсказки, вероятно, является безопасным/хорошим подходом.

person Kevin TeslaCoil    schedule 26.07.2011
comment
Большое спасибо, я попробую это завтра (здесь, в Германии, уже полночь). Обратите внимание, что домой, назад, домой — это просто пример. Поиск, назад, поиск, параметры или что-то в этом роде также должны быть хорошими и, возможно, предпочтительнее, чем всплывающее окно с длительным нажатием, которое может сбить ее с толку. - person Wangnick; 27.07.2011
comment
Работает действительно как шарм. Спасибо. - person Wangnick; 28.07.2011

Кнопка «Домой» не может быть переопределена. Вы можете написать приложение, которое отвечает на домашний интент (это то, что делает лаунчер), но это все.

person Romain Guy    schedule 26.07.2011
comment
Я знал это, но еще не пробовал. Спасибо вам и Дэну за то, что вдохновили меня попробовать. Теперь, как вернуться к исходному лаунчеру? - person Wangnick; 27.07.2011