Добавление функции скриншота в Android 2.3

Я реализую функцию скриншота для Android 2.3 (я знаю, что в ICS уже есть функция скриншота). Я использую проект Android Screenshot Library (сокращенно ASL) в качестве основы и модифицирую его в соответствии со своими потребностями. Я также могу свободно модифицировать для него исходный код Android. Цель состоит в том, чтобы сделать что-то вроде того, что делает Galaxy Note: вы делаете снимок экрана с помощью комбинации клавиш, а затем появляется редактор, который позволяет вам изменять изображение по своему усмотрению. Скриншот можно было сделать где угодно: на главном экране, при использовании приложений и т. д.

Сейчас у меня есть 3 рабочие части: собственный двоичный файл, который захватывает экранный буфер, служба, которая взаимодействует с собственным двоичным файлом и извлекает снимок экрана, и редактор. Но я не уверен, как я мог объединить 3 вещи вместе. Собственный двоичный файл можно добавить в предустановленную часть Android, а init.rc можно изменить, чтобы он выполнялся от имени пользователя root при загрузке (хотя мне все равно нужно это сделать). Редактор — это простое приложение, которое также можно включить в Android. Но я до сих пор не могу понять, что делать с сервисом.

В идеале я хотел бы захватить комбинацию клавиш (скажем, кнопку питания и уменьшение громкости или, может быть, две кнопки на передней панели), которая запускает службу. Затем служба вызовет двоичный файл, чтобы сделать снимок экрана, и запустит намерение открыть редактор со снимком экрана. Однако, насколько мне известно, служба не может перехватывать нажатия клавиш. Кроме того, служба должна быть где-то привязана, чтобы знать, когда она должна сделать снимок экрана, поэтому я предполагаю, что мне следует изменить сам Android, чтобы запустить службу и привязаться к ней при запуске, но документация относительно исходного кода Android отсутствует. и я понятия не имею, где начать искать.

Кто-нибудь знает, какой компонент Android отвечает за нажатия клавиш и где я должен привязать свою службу? Возможен ли вообще мой подход?

Заранее благодарим за любую возможную помощь.


person ziritrion    schedule 31.05.2012    source источник
comment
Я не мог понять, как взаимодействовать с клавишами (пока), но я нашел обходной путь, обнаружив, когда пользователь встряхивает телефон, что было довольно просто реализовать. Если я узнаю, как делать то, что хочу, я обновлю свой вопрос ответом.   -  person ziritrion    schedule 13.06.2012


Ответы (1)


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

person Igor F.    schedule 04.06.2012
comment
Спасибо за ответ! Я очень боялся, что мой вопрос будет похоронен среди других. Однако на моем устройстве нет специальной кнопки камеры; у него есть только кнопки питания и громкости, а также типичные 4 емкостные кнопки на передней панели. Однако один из ответов в вашей ссылке (я искал несколько дней и еще не видел этот вопрос!) указывает на InputMethodService, на который я сразу же рассмотрю. Спасибо еще раз! - person ziritrion; 04.06.2012
comment
Но почему кнопки? Дропкап, если я правильно помню, полагается на G-сенсор: встряхиваешь аппарат, и он делает скриншот. Вы можете запрограммировать другие шаблоны, например, двойное нажатие на спину или что-то подобное. Другая возможность — отложенный снимок экрана: вы запускаете приложение для съемки экрана, нажимаете в нем кнопку и у вас есть, скажем, 5 секунд, чтобы вернуться к приложению, для которого вы хотите сделать снимок экрана. - person Igor F.; 05.06.2012
comment
Это возможно, но поскольку Android ICS делает это, нажав кнопку питания + уменьшение громкости, я хотел сделать это таким же образом. Однако, даже если я сделаю это с помощью G-сенсора или чего-то еще, я все еще не уверен, как мне поймать это глобально, а затем получить доступ к моему демону: службе? Если да, то куда мне его положить? Я не планирую делать приложение для продажи в Google Play; Я пытаюсь создать свой собственный образ Android для конкретного устройства с этой функцией. - person ziritrion; 06.06.2012
comment
Служба является подходящим местом для этого. Вы можете запустить его из Activity или во время загрузки. Ваш демон может быть частью службы (работающей в том же процессе). Или, если это часть другого процесса, вы можете отправить ему намерение. - person Igor F.; 06.06.2012
comment
Хорошо, я попробую. Я полагаю, что если я хочу, чтобы мой сервис запускался во время загрузки и продолжал работать в фоновом режиме, мне нужно запустить его, а не привязывать к действию, верно? Спасибо за все эти идеи. - person ziritrion; 06.06.2012
comment
Вы запустите его из BroadcastReceiver, который прослушивает BOOT_COMPLETED. Это происходит только один раз за загрузку, поэтому вам не потребуется постоянное подключение (т.е. привязка) к сервису. Но по-прежнему неплохо иметь Activity, из которого пользователь может остановить службу, когда она больше не нужна. - person Igor F.; 06.06.2012
comment
Вы имеете в виду создание приложения без каких-либо действий; просто служба, которая слушает BOOT_COMPLETED, верно? И затем, чтобы вызвать захват экрана, просто используйте фильтры намерений, чтобы выяснить, когда пользователь хочет сделать снимок экрана (например, дважды нажать назад, встряхнуть телефон или что-то еще), верно? Извините, если я задаю слишком много глупых вопросов, но я ужасный программист. Спасибо за вашу помощь. - person ziritrion; 06.06.2012
comment
Я имею в виду, что вам нужно будет прослушать BOOT_COMPLETED и, когда это произойдет, запустить свою службу. Подобно сервису музыкального проигрывателя, он будет работать в фоновом режиме и реагировать, скажем, на встряхивание телефона. Кроме того, как и в музыкальном проигрывателе, вы можете добавить активность, чтобы пользователь мог остановить вашу службу, если она больше не нужна. В противном случае он будет разряжать аккумулятор в течение всего дня. - person Igor F.; 07.06.2012
comment
давайте продолжим это обсуждение в чате - person Igor F.; 07.06.2012