понедельник, 14 марта 2011 г.

Missed calls count

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

Потому что часы эти я делаю для локскрина и ткнув в телефон кнопкой я хочу, чтобы он показал мне а) время (потому что часы на руке не ношу уже лет и лет) и б) ничего ли я не пропустил (не звонил ли кто, не пришла ли дурная смс с рекламой etc)

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

Так что все таки почитал про ContentObserver: грубо говоря это обьект, который реагирует на изменения определенного содержимого, в моем случае это CallLog.Calls.CONTENT_URI

Код получился несложный ни разу:

    private class EventsObserver extends ContentObserver {

        public EventsObserver() {
            super(null);
        }

        @Override
        public void onChange(boolean selfChange) {

            final int t = missedCallsCount;
            Cursor c = getContentResolver().query(
                    CallLog.Calls.CONTENT_URI,
                    null,
                    CallLog.Calls.TYPE + " = ? AND " + CallLog.Calls.NEW + " = ?",
                    new String[]{Integer.toString(CallLog.Calls.MISSED_TYPE), "1"},
                    CallLog.Calls.DATE + " DESC"
            );

            missedCallsCount = c.getCount();
            if (t != missedCallsCount) {
                getApplicationContext().sendBroadcast(new Intent("info.hamster.widgets.time_to_update"));
            }
        }
    }

Ну и обьект создать и зарегить надо


    getApplicationContext().getContentResolver().registerContentObserver(CallLog.Calls.CONTENT_URI, true, eventsObserver);

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

Как это тестить: реальным телефоном принимать звонки - глупо, есть есть эмулятор, который этому обучен. Нужен telnet-клиент (на 7-ке оказывается нет, надо скачать Putty - легкий и бесплатный telnet/ssh клиент)

Запускаем и коннектимся к localhost к порту, который сейчас занял эмулятор - он его в заголовке окна пишет, по-моему обычно это 5554. Приконектились, получили консоль (очень неудобную между прочим.. ну типа стрелка вверх не вызывает предыдущую команду, хотя скорее всего это я туплю и или надо putty настроить, или другие сочетания клавишь для этого используются)

Чтобы позвонить "на эмулятор", пишем:

  gsm call 12345

и вуаля - входящий звонок от "12345"! Для имитации непринятого вызова не дожидаясь ответа :) сбрасываем звонок:

  gsm cancel 12345

Ну собственно и все, тестить можно.. там help прямо в консольке можно набрать и узнать, что много чего можно сделать - смс-ку прислать и кучу всего такого

Комментариев нет:

Отправить комментарий