Форум программистов, компьютерный форум CyberForum.ru

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

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

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

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

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

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

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

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

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

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

Обработка onTouchEvent в Activity Android
Android Обработка нажатий
Android Запуск activity из service
Android Sliding Menu обработка нажатий
Обработка нажатий внутри класса адаптера Android
Android Обработка нажатий клавиш программной клавиатуры
Fragment обработка нажатий Android
Обработка нажатий на виджет Android
Обработка событий в Service Android
Обработка нажатий на сам фрагмент а не на отдельную кнопку Android
Передача данных из activity в service Android
Android Activity + Service - утечка памяти?

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
RUS_
-13 / 0 / 0
Регистрация: 09.07.2015
Сообщений: 11
11.07.2015, 19:12  [ТС]     Обработка нажатий клавиш громкости непосредственно Service (Activity уже закрыто) #2
Товарищи программисты Android. Неужели здесь никто этого не знает?
RUS_
-13 / 0 / 0
Регистрация: 09.07.2015
Сообщений: 11
18.07.2015, 15:45  [ТС]     Обработка нажатий клавиш громкости непосредственно Service (Activity уже закрыто) #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 минут
Добавлю что в эмуляторе с такими настройками работает криво, т.к. эмулятор может тормозить. Я проверял на реальном устройстве.
Yandex
Объявления
18.07.2015, 15:45     Обработка нажатий клавиш громкости непосредственно Service (Activity уже закрыто)
Ответ Создать тему
Опции темы

Текущее время: 08:14. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru