Не получить первые данные CallLog - PullRequest
1 голос
/ 12 октября 2011

Я пытаюсь получить звонок, который только что сделал / получил. Для этого я использую BroadcastReceiver и IntentServices.

Это происходит так:

В моем классе BroadcastReceiver я проверяю, является ли состояние OFFHOOK , если да, я устанавливаю флаг в SharedPreferences , поэтому, когда состояние становится IDLE, Я проверяю, является ли этот флаг все еще true, если это так, я вызываю IntentService , который входит в CallLog * ContentProvider * и получаю последние данные как это:

cursor = getContentResolver().query(android.provider.CallLog.Calls.CONTENT_URI, mCursorFields, null, null, android.provider.CallLog.Calls.DATE + " DESC");

cursor.moveToFirst();
cursor.getString(cursor.getString(cursor.getColumnIndex(android.provider.CallLog.Calls.NUMBER));
...

До сих пор это происходит идеально, единственная проблема:

"Он не получает последнюю запись. Он получает следующую запись, то есть вызов, сделанный до этого."

Итак, если я звонил ранее человеку «X», в CallLog регистрируется этот звонок человеку «X». И теперь, если я звоню человеку «Y», вместо того чтобы получить звонок человеку «Y», он получает звонок человеку «X», это был звонок, который я сделал до этого.

Я не знаю, что может происходить. Он отлично работал при использовании ContentObserver , но я подумал, что он будет более эффективно построен с BroadcastReceiver .

Есть идеи?

Заранее спасибо.


Просто комментарий об использовании ContentObserver:

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

Ответы [ 3 ]

2 голосов
/ 12 октября 2011

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

1 голос
/ 12 октября 2011

Вы отслеживаете звонки, используя общие ссылки, это неэффективно.Вместо того, чтобы брать один static variable, а затем устанавливать его значение всякий раз, когда изменяется состояние вызова, я поместил приведенный ниже код для отслеживания состояний вызовов и получения новых данных журнала вызовов из внутренней базы данных. Этот код работает нормальнодля меня.

public void onCallStateChanged(int state, String incomingNumber) {
super.onCallStateChanged(state, incomingNumber);

switch (state) {
    case TelephonyManager.CALL_STATE_IDLE:
        // Toast.makeText(context, "CALL_STATE_IDLE", Toast.LENGTH_LONG).show();
        /**this condition will check that last state was not CALL_STATE_IDLE means that 
        * recently there was disconneted call
        */
        if(UDF.phoneState != TelephonyManager.CALL_STATE_IDLE) {
            //You can query for new call log
        } 
        break;
    case TelephonyManager.CALL_STATE_OFFHOOK:
         //Toast.makeText(context, "CALL_STATE_OFFHOOK", Toast.LENGTH_LONG).show();
        break;
    case TelephonyManager.CALL_STATE_RINGING:
         //Toast.makeText(context, "CALL_STATE_RINGING", Toast.LENGTH_LONG).show();
        endCallIfBlocked(incomingNumber);
        break;

    default:
        break;
}
UDF.phoneState = state;
}
0 голосов
/ 13 июля 2013

Я только что исправил создание задержки до 4000 мс при извлечении из БД в состоянии ожидания.

handler.postdelay(new Runnable(run() {
    //write code here
}), 4000);

это прекрасно работает для меня ...

...