С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

Программирование Android

Войти
Регистрация
Восстановить пароль
 
RUS_
-13 / 0 / 0
Регистрация: 09.07.2015
Сообщений: 11
#1

Обработка нажатий клавиш громкости непосредственно Service (Activity уже закрыто) - Программирование Android

09.07.2015, 15:04. Просмотров 1050. Ответов 2
Метки нет (Все метки)

Уважаемые форумчане!
Буду благодарен за любую помощь.

Написал добрую часть приложения для Android, состоящего из Активности и Сервиса.
Активность запускает Сервис, после чего пользователь самостоятельно переходит на любую стороннюю Активность. Сервис как и положено продолжает свою работу в фоне. Моя проблема заключается в том, что не знаю как заставить этот Сервис реагировать на нажатие пользователем клавиши на корпусе устройства, когда открыта сторонняя Активность или дисплей погашен и заблокирован сенсорный экран.
Цель работы - получить устройство которое находясь в ЛЮБОМ РЕЖИМЕ будет отсылать на сервер свои GPS координаты при всяком нажатии определённой клавиши.

Перечислю варианты которые и опробовал:

1. Через обработчики событий Активности. (Работает пока активность в фокусе)
2. Intent.ACTION_MEDIA_BUTTON. По аналогии с управлением номером трека в аудио плеере. (Метод работает, только до первого входящего звонка пока нет переключения на звуковой поток вызова. Во время разговора управлять сервисом возможности нет!)

Последняя идея - это в цикле опрашивать текущий статус (ON/OFF) клавиши, но возможно ли это в Android?

В общем рад принять ваш опыт!
Спасибо.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.07.2015, 15:04
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Обработка нажатий клавиш громкости непосредственно Service (Activity уже закрыто) (Программирование Android):

Обработка нажатий клавиш программной клавиатуры - Программирование Android
Не знаю, была ли эта тема. Но столкнулся с такой проблемой: допустим есть макет с EditText и ListView. Они отображаются сверху вниз в...

Запуск activity из service - Программирование Android
Добрый вечер! Как правильно запускать активность из сервиса? Метод startActivity(new Intent(this,MyActivity.class)); не работает,...

Activity + Service - утечка памяти? - Программирование Android
Всем привет. Подскажите, пожалуйста, когда я запускаю сервис из активити (startService) и мой сервис работает достаточно долго, так...

Передача данных из activity в service - Программирование Android
Здравствуйте, как можно организовать передачу данных из activity в сервис, если сервис уже запущен и работает. как он должен отлавливать...

Обработка нажатий - Программирование Android
Господа подскажите как определить что пользователь провел пальцем влево или в право? Отслеживать в onTouch координаты? Если Х...

Обработка нажатий на виджет - Программирование Android
Почему не работает при нажатии на виджет? @Override public void onUpdate(Context context, AppWidgetManager appWidgetManager, int...

2
RUS_
-13 / 0 / 0
Регистрация: 09.07.2015
Сообщений: 11
11.07.2015, 19:12  [ТС] #2
Товарищи программисты Android. Неужели здесь никто этого не знает?
0
RUS_
-13 / 0 / 0
Регистрация: 09.07.2015
Сообщений: 11
18.07.2015, 15:45  [ТС] #3
Проблема решена управлением через клавишу Power.
По нажатию на клавишу Power 4 раза в течении 1-3 сек и сервис стабильно реагирует. Показываю для примера Android будет выводить короткий звук по команде от клавиши, и не важно заблокирован экран или нет, также не важно что сейчас делает пользователь. Пользователю не мешает ложных срабатываний нет. Проверенно на нескольких устройствах.

Принцип работы сводится к приёму intent от системы при реакции экрана на нажатие Power.

MyService.java
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
package ru.domen.helooword;
 
 
import android.app.Service;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.media.MediaPlayer;
import android.os.IBinder;
import android.util.Log;
 
 
public class MyService extends Service {
 
    final String LOG_TAG = "myLogs";
 
    int screen_status = 0;
    long screen_start_time = 0;
    long screen_max_time = 1250;  //Максимальное время между нажатиями
 
    BroadcastReceiver mScreenReceiver = new BroadcastReceiver() {
 
        @Override
        public void onReceive(Context context, Intent intent) {
            String action = intent.getAction();
            if (action.equals(Intent.ACTION_SCREEN_ON)) {
 
               if(screen_status == 0) {screen_start_time = System.currentTimeMillis();}
 
                screen_status++;  //Счётчик нажатий
 
                someTask();
 
            }
            if (action.equals(Intent.ACTION_SCREEN_OFF)) {
                if(screen_status == 0) {screen_start_time = System.currentTimeMillis();}
 
                screen_status++;
 
                someTask();
 
            }
        }
    };
 
 
    public void onCreate() {
        super.onCreate();
        Log.d(LOG_TAG, "onCreate");
    }
 
     public int onStartCommand(Intent intent, int flags, int startId) {
         Log.d(LOG_TAG, "onStartCommand");
 
         IntentFilter intentFilter =  new  IntentFilter ( Intent . ACTION_SCREEN_ON );
         intentFilter .addAction(Intent.ACTION_SCREEN_OFF );
         registerReceiver(mScreenReceiver, intentFilter);
 
         someTask();
 
        return super.onStartCommand(intent, flags, startId);
    }
 
    public void onDestroy() {
        super.onDestroy();
        Log.d(LOG_TAG, "onDestroy");
    }
 
    public IBinder onBind(Intent intent) {
        Log.d(LOG_TAG, "onBind");
        return null;
    }
 
    void someTask() {
 
        final MediaPlayer mp = MediaPlayer.create(this, R.raw.ooy);
        mp.setLooping(false);
 
//Обнуляем счётчик по превышению максимального времени между нажатиями 
if((System.currentTimeMillis() - screen_start_time) > (screen_max_time * screen_status) ) {screen_status = 0;}
 
                                     //Выводим звук или что нужно делаем
if(screen_status==3) {
 
    screen_status = 0;
 
    mp.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
        public void onPrepared(MediaPlayer mp) {
     
            mp.start();
        }
    });
 
    mp.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
        public void onCompletion(MediaPlayer mp) {
            mp.release();
        }
    });
 
}
 
}
Добавлено через 18 минут
Добавлю что в эмуляторе с такими настройками работает криво, т.к. эмулятор может тормозить. Я проверял на реальном устройстве.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.07.2015, 15:45
Привет! Вот еще темы с ответами:

Fragment обработка нажатий - Программирование Android
Здравствуйте. Есть 9 Layout-ов. Каждый выступает в роли контейнера для фрагментов. Вопрос в следующем. Не могу сделать обработку нажатий на...

Sliding Menu обработка нажатий - Программирование Android
Кто нибудь использовал данную библиотеку? menu = new SlidingMenu(this); menu.setMode(SlidingMenu.LEFT); ...

Обработка onTouchEvent в Activity - Программирование Android
Хочу в активити обрабатывать все прикосновения, независимого от того, были ли они на кнопке или на свободном пространстве. Однако после...

Обработка нажатий внутри класса адаптера - Программирование Android
Можно ли обрабатывать нажатия в классе адаптера expandablelistview? Если нет, то что будет если я поставлю там обработчики?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.