Как получить пропущенные звонки на Android SDK 2.2

в моем приложении я должен выполнить какое-то действие, когда приходит вызов, но пользователь не отвечает.

Я искал в android.telephony и NotificationManager, но не нашел способа решить эту проблему.

Кто-нибудь знает, как узнать, есть ли на телефоне пропущенный вызов?


person Mathieu    schedule 24.09.2010    source источник


Ответы (3)


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

final String[] projection = null;
final String selection = null;
final String[] selectionArgs = null;
final String sortOrder = android.provider.CallLog.Calls.DATE + " DESC";
Cursor cursor = null;
try{
    cursor = context.getContentResolver().query(
            Uri.parse("content://call_log/calls"),
            projection,
            selection,
            selectionArgs,
            sortOrder);
    while (cursor.moveToNext()) { 
        String callLogID = cursor.getString(cursor.getColumnIndex(android.provider.CallLog.Calls._ID));
        String callNumber = cursor.getString(cursor.getColumnIndex(android.provider.CallLog.Calls.NUMBER));
        String callDate = cursor.getString(cursor.getColumnIndex(android.provider.CallLog.Calls.DATE));
        String callType = cursor.getString(cursor.getColumnIndex(android.provider.CallLog.Calls.TYPE));
        String isCallNew = cursor.getString(cursor.getColumnIndex(android.provider.CallLog.Calls.NEW));
        if(Integer.parseInt(callType) == MISSED_CALL_TYPE && Integer.parseInt(isCallNew) > 0){
            if (_debug) Log.v("Missed Call Found: " + callNumber);
        }
    }
}catch(Exception ex){
    if (_debug) Log.e("ERROR: " + ex.toString());
}finally{
    cursor.close();
}

Я надеюсь, что вы найдете это полезным.

person Camille Sévigny    schedule 25.08.2011
comment
Как объявляется MISSED_CALL_TYPE? - person erdomester; 05.10.2011
comment
MISSED_CALL_TYPE = android.provider.CallLog.Calls.MISSED_TYPE; - Извините, что опустил эту часть. - person Camille Sévigny; 06.10.2011
comment
Спасибо! Тогда я не мог его использовать, поэтому обнаружил, что для этих типов вызовов есть 2 способа: 1. объявить его как целое число: int typeColumn = c.getColumnIndex(android.provider.CallLog.Calls.TYPE); затем int callType = c.getInt(typeColumn); и ведь напр. если calltype==1 тогда..... 2: используйте int outgoingtypeColumn = c.getColumnIndex(android.provider.CallLog.Calls.TYPE + ='2'); и т. д. Надеюсь, это поможет другим! - person erdomester; 07.10.2011
comment
Спасибо Камилла, этот код был полезен. Для других, планирующих его использовать: не забудьте добавить android.permission.READ_CONTACTS в свой AndroidManifest.xml и проверьте, является ли курсор нулевым, прежде чем закрывать его. - person Dan J; 16.10.2011
comment
Я получаю сообщение об ошибке контекста, которое не может быть разрешено. Я поместил приведенный выше код в класс, расширяющий активность. - person Asraf; 09.03.2012
comment
Камилла, спасибо за код. Но этот код отвечает на звонки и смс. Как фильтровать звонки только в этом случае? - person BArtWell; 09.10.2012
comment
@BArtWell - приведенный выше код определенно не возвращает SMS-сообщения. - person Camille Sévigny; 08.11.2012

Насколько я понимаю, вам нужно запросить поставщика CallLog (или, возможно, CallLog.Calls), и на этой странице объясняется, как запрашивать поставщика контента: http://developer.android.com/guide/topics/providers/content-providers.html#basics

Я был бы рад увидеть код, если вы можете сделать эту работу!

person GôTô    schedule 24.09.2010
comment
да. Но в таком случае я не смогу узнать, ответили на пропущенный звонок или нет. В моем приложении, если на пропущенный телефон ответили, я не должен снова уведомлять пользователя о пропущенном телефонном звонке. - person Mathieu; 24.09.2010
comment
Как можно ответить на пропущенный вызов? В классе CallLog.Calls есть константа MISSING_TYPE, я считаю, что вызов имеет значение MISSING_TYPE, INCOMING_TYPE или OUTGOING_TYPE. - person GôTô; 24.09.2010
comment
да. Прошу прощения, что не ясно выразил то, что хочу. Я согласен с вами, что на пропущенный вызов нельзя ответить, когда звонит телефон. Но мы можем перезвонить, когда мы знаем, что после этого есть пропущенный вызов, и это то, что я имею в виду, отвечая на мой вопрос. Таким образом, я думаю, что лучше использовать уведомление, чем читать информацию в журнале вызовов. Надеюсь, на этот раз я яснее. - person Mathieu; 29.09.2010

Я полагаю, у вас есть контент-провайдеры для доступа к журналам вызовов.

http://www.anddev.org/video-tut_-_querying_and_displaying_the_calllog-t169.html

http://www.devx.com/wireless/Article/41133

Если этот код работает, вам просто нужно запустить этот запрос в нужное время. Я имею в виду, проверьте некоторые образцы, которые могут уведомить вас, когда вы получаете вызов на своем устройстве.

http://groups.google.com/group/android-developers/browse_thread/thread/d97a759a3708cbe3

Как только вы получите это уведомление, установите таймер или используйте встроенные намерения, чтобы обнаружить, что телефон вернулся в нормальное состояние, и получить доступ к журналам вызовов...

Возможный дубликат

приемник трансляции пропущенного вызова в Android

Показать всплывающее уведомление о пропущенном звонке в приложении для Android

person DeRagan    schedule 24.09.2010