Вчера доприводил в порядок свою кучу часов для андроида, оставил пока 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 прямо в консольке можно набрать и узнать, что много чего можно сделать - смс-ку прислать и кучу всего такого