Наблюдатель содержимого Android - метод onChange проверяет, пропущен ли последний вызов или нет

Я работаю над приложением для Android, и мне нужно увеличить количество входящих пропущенных вызовов.

Я зарегистрировал ContentObserver. Как я могу проверить в методе onChange, является ли вызов пропущенным или нет?

У меня есть contentobserver со следующим кодом:

public class IncomingCall extend BroadcastReceiver
{
public void onReceive( final Context context, Intent intent)
{
String state= extras.getString(TelephonyManager.EXTRA_STATE);
    if (TelephonyManager.EXTRA_STATE_IDLE.equals(state))
        {
            context.getApplicationContext().getContentResolver().registerContentObserver(android.provider.CallLog.Calls.CONTENT_URI, true, new CallContentObserver(new Handler(), context));
        }

}

 class CallContentObserver extends ContentObserver {

    Context context;

    public CallContentObserver(Handler handler, Context context) {
        super(handler);
        this.context = context;
    }

    @Override
    public boolean deliverSelfNotifications() {
        return true;
    }

    @Override
    public void onChange(boolean selfChange) {
        super.onChange(selfChange);

        //flag for missed calls
        how to check if last call is missed call?

Cursor c = context.getContentResolver().query(CallLog.Calls.CONTENT_URI,null,null, null, null);
        int type = c.getColumnIndex(CallLog.Calls.TYPE);
        while (c.moveToNext()) {
            String callType = c.getString(type);

            int dircode = Integer.parseInt(callType);
            switch (dircode) {

            case CallLog.Calls.MISSED_TYPE:
                flag++;

            }
            break;
        }

}

Нет ли другого способа сделать это? (лучше, чем у меня при проверке последнего звонка из базы CallLog?


person just ME    schedule 16.05.2013    source источник
comment
Пробовали ли вы stackoverflow.com/questions/7835876/?   -  person sandrstar    schedule 16.05.2013
comment
Я обновил свой код. Это то, что я пробовал. ЭТО НОРМАЛЬНО?   -  person just ME    schedule 16.05.2013
comment
хорошо, но использование Uri из onChange(boolean selfChange, Uri uri), вероятно, было бы более эффективным и быстрым, чем повторение всех доступных вызовов.   -  person sandrstar    schedule 16.05.2013
comment
код, который я написал, работает неправильно. значение флага не увеличивается правильно. Не могли бы вы предоставить мне код?   -  person just ME    schedule 16.05.2013
comment
а если после пропущенного звонка у меня есть входящий/исходящий звонок?:)   -  person just ME    schedule 16.05.2013


Ответы (1)


Я бы предложил попробовать следующий код, чтобы определить, является ли последний вызов пропущенным или нет:

@Override
public void onChange(boolean selfChange, Uri uri) {

    if (null == uri) {
        onChange(selfChange);
        return;
    }

    super.onChange(selfChange, uri);

    final Cursor c = context.getContentResolver().query(uri,null,null, null, null);
    final int type = c.getColumnIndex(CallLog.Calls.TYPE);
    final int dircode = c.getInt(type);

    switch (dircode) {
        case CallLog.Calls.MISSED_TYPE:
            flag++;
            break;
    }
}

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

Еще одно предложение - реализовать Сервис для проверки количества пропущенных вызовов, чтобы у вас не было долгой обработки в ContentObserver.

person sandrstar    schedule 16.05.2013
comment
Выдает android.database.CursorIndexOutOfBoundsException: запрашивается индекс -1 с размером 13 в строке: final int dircode = c.getInt(type); - person powder366; 08.05.2016