无法从通话记录中获取最新项目

时间:2011-05-19 09:16:12

标签: android

我已经注册了一个监视通话记录的contentobserver。 但我无法得到最新的电话,我来的最远的是第一次接到最新的电话,之后只需要先前的电话,然后是之前的电话。 此外,它一次返回2个日志条目。

我正在使用的代码是:

import java.text.SimpleDateFormat;
import java.util.Date;

import android.content.ContentResolver;
import android.content.Context;
import android.database.ContentObserver;
import android.database.Cursor;
import android.os.Handler;
import android.provider.BaseColumns;
import android.provider.CallLog;
import android.util.Log;

class CallMonitor extends ContentObserver {

   private PositionDbAdapter mDbHelper;
   Cursor cur;
   Context CallMon = Position.MAIN_ACTIVITY;

   int idColumn;
   int numberColumn;
    int dateColumn;
    int typeColumn;
    int durColumn;

   public CallMonitor(Handler handler, Context context){
        super(handler);
        CallMon = context;
   }

   @Override
   public void onChange(boolean selfChange) {
        if(cur==null){
                cursorInit(CallMon);
        }

        if (!cur.moveToNext()) {
           //do we really want to close the cursor?
           //cur.close();
           return;
        }


        String number = cur.getString(numberColumn);
      String id = cur.getString(idColumn);
      String type = cur.getString(typeColumn);
      String date = cur.getString(dateColumn);
      String dur = cur.getString(durColumn);
      Date dateN = new Date(Long.parseLong(date));
      Date date2 = new Date();
      Log.d("Position", date2+": "+dateN+":"+id+", "+number+", "+type+", "+dur);
      //cur.moveToNext();
   }
   public void Destroy() {
      Log.d("Position", "Destroy Call Monitor");
      cur.close();
   }

   public void cursorInit(Context context){
        String[] projection = new String[]{
              BaseColumns._ID,
              CallLog.Calls.DATE,
              CallLog.Calls.NUMBER,
              CallLog.Calls.DURATION,
              CallLog.Calls.TYPE
        };
        ContentResolver resolver = context.getContentResolver();

        cur = resolver.query(CallLog.Calls.CONTENT_URI, projection, null,null, "date DESC");
        //cur.moveToFirst();
        numberColumn = cur.getColumnIndex(CallLog.Calls.NUMBER);
        typeColumn = cur.getColumnIndex(CallLog.Calls.TYPE);
        dateColumn = cur.getColumnIndex(CallLog.Calls.DATE);
        durColumn = cur.getColumnIndex(CallLog.Calls.DURATION);
        idColumn = cur.getColumnIndex(CallLog.Calls._ID);

   } 
}

我尝试过各种各样的cur.moveToFirst .moveToNext等......

我最接近的是它第一次发射时,我得到了正确的callog项目,但后来又得到另一个。 然后是第二次和第三次......我变老了。

我认为ii关闭光标然后它将从头开始,但是当我这样做时,它会抛出一个错误,可能是因为当光标自动获得第二个时,我不想要的光标被关闭。

有人可以帮助我吗?

2 个答案:

答案 0 :(得分:0)

我已经通过BroadcastReceiver完成了这种类型的操作。可能会对你有所帮助:

public class CallReceiver extends BroadcastReceiver {


//<----------------- Fields------------->
private String phone_no = "";
private int phone_id;
private String incoming_time = "";
private Context context;


@Override
public void onReceive(Context ctx, Intent intent) {

    context = ctx;
    final Bundle bundle = intent.getExtras();



    incomingCalls(bundle);

}


/**
 * Check incoming  call and match in database
 * @param bundle
 */
private void incomingCalls(Bundle bundle) {
    if (null == bundle)
        return;

    Log.i("IncomingCallReceiver", bundle.toString());

    final String state = bundle.getString(TelephonyManager.EXTRA_STATE);

    Log.i("IncomingCallReceiver", "State: " + state);
    phone_no = bundle.getString(TelephonyManager.EXTRA_INCOMING_NUMBER);

    if (state.equals(TelephonyManager.EXTRA_STATE_RINGING)
            && phone_no != null && !phone_no.equalsIgnoreCase("")) {

        final DateFormat formatter = new SimpleDateFormat(
                "MMM dd yyyy HH:mm");
        Calendar calendar = Calendar.getInstance();
        calendar.setTimeInMillis(System.currentTimeMillis());

        incoming_time = formatter.format(calendar.getTime());
        Log.i("IncomingCallReceiver", "Incomng Number: " + phone_no);


        if (phone_id != 0) {

                Log.i("Phone number", phone_no);
                Log.i("Phone ID", phone_id+"");
                Log.i("Incoming time", incoming_time);



        }

    }
}

}

答案 1 :(得分:0)

如果您希望从较旧的条目显示呼叫日志

    ContentResolver resolver = context.getContentResolver();

    cur = resolver.query(CallLog.Calls.CONTENT_URI, projection, null,null, "date DESC");
    while(cur.moveToNext()){
    numberColumn = cur.getColumnIndex(CallLog.Calls.NUMBER);
    typeColumn = cur.getColumnIndex(CallLog.Calls.TYPE);
    dateColumn = cur.getColumnIndex(CallLog.Calls.DATE);
    durColumn = cur.getColumnIndex(CallLog.Calls.DURATION);
    idColumn = cur.getColumnIndex(CallLog.Calls._ID);

    //display call log or do ur logic
    }   

如果您希望呼叫日志显示从较新到较旧(即最初的最新条目)

    ContentResolver resolver = context.getContentResolver();
    cur.moveToLast()
    cur = resolver.query(CallLog.Calls.CONTENT_URI, projection, null,null, "date DESC");
    while(cur.moveToPerivous()){
    numberColumn = cur.getColumnIndex(CallLog.Calls.NUMBER);
    typeColumn = cur.getColumnIndex(CallLog.Calls.TYPE);
    dateColumn = cur.getColumnIndex(CallLog.Calls.DATE);
    durColumn = cur.getColumnIndex(CallLog.Calls.DURATION);
    idColumn = cur.getColumnIndex(CallLog.Calls._ID);

    //display call log or do ur logic
    }