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

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

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

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

09.07.2015, 15:04. Просмотров 830. Ответов 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 уже закрыто)
Посмотрите здесь:
Android Обработка нажатий клавиш программной клавиатуры
Android Запуск activity из service
Передача данных из activity в service Android
Android Activity + Service - утечка памяти?
Android Обработка нажатий
Обработка нажатий на виджет Android
Fragment обработка нажатий Android
Android Sliding Menu обработка нажатий
Обработка onTouchEvent в Activity Android
Обработка нажатий внутри класса адаптера Android
Android Обработка NFC в запущенной Activity
Обработка нажатий на сам фрагмент а не на отдельную кнопку Android

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
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 минут
Добавлю что в эмуляторе с такими настройками работает криво, т.к. эмулятор может тормозить. Я проверял на реальном устройстве.
Ответ Создать тему
Опции темы

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