public static final Uri CALL_LOG_CONTENT_URI = CallLog.Calls.CONTENT_URI;//通话记录Uriprivate static final int QUERY_TOKEN = 304;public static final String[] SUMMARY_PROJECTION = new String[]{CallLog.Calls._ID, //IDCallLog.Calls.CACHED_NAME, //姓名CallLog.Calls.CACHED_NUMBER_LABEL, //缓存电话标签CallLog.Calls.CACHED_NUMBER_TYPE, //缓存电话类型(家庭电话,工作电话等)CallLog.Calls.NUMBER, //电话号码CallLog.Calls.TYPE, //通话类型(来电,去电,未接)CallLog.Calls.DURATION, //通话时长CallLog.Calls.DATE, //通话日期};
源码下载http://download.csdn.net/detail/wds1181977/7621419
2调用AsyncQueryHandler
private final class QueryContactsHandler extends AsyncQueryHandler {public QueryContactsHandler(Context context) {super(context.getContentResolver());}@Overrideprotected void onQueryComplete(int token, Object cookie, Cursor cursor) {if (cursor == null || cursor.isClosed() || !cursor.moveToFirst()) {mStopLoadHandler.sendEmptyMessage(QUERY_NO_CONTACTS);return;}if (!getActivity().isFinishing()) {if(cursor.getCount() > 0) {mStopLoadHandler.sendEmptyMessage(QUERY_COMPLETE);} else {mStopLoadHandler.sendEmptyMessage(QUERY_NO_CONTACTS);}if(mDateTimeMap != null){mDateTimeMap.clear();mDateTimeMap = null;}mDateTimeMap = new HashMap<Long, Boolean>();long currentDate = 0;while(!cursor.isAfterLast()){long _id = cursor.getLong(CallLogUtils.ID_INDEX);long date = cursor.getLong(CallLogUtils.DATE_INDEX);date = DateTimeUtils.getStartTimeOfDay(date);if(date != currentDate){mDateTimeMap.put(_id, true);currentDate = date;} else {mDateTimeMap.put(_id, false);}cursor.moveToNext();}mContactsAdapter.changeCursor(cursor);} else {if (cursor != null && !cursor.isClosed()) {cursor.close();}}}}
3开始查询
private void startEmptyQuery(){if (mQueryContactsHandler == null) {if(LogLevel.DEV){DevLog.e(TAG, "startEmptyQuery() failed, mQueryContactsHandler is null.");}return;}mQueryContactsHandler.cancelOperation(QUERY_TOKEN);Uri uri = CallLogUtils.CALL_LOG_CONTENT_URI;mQueryContactsHandler.startQuery(QUERY_TOKEN, null, uri, CallLogUtils.SUMMARY_PROJECTION, null, null, CallLogUtils.DEFAULT_SORT_ORDER);}
@Overridepublic void onResume(){if(LogLevel.MARKET){MarketLog.i(TAG, "onResume...");}super.onResume();startEmptyQuery();}
4读取Cursor Java Bean CallLogInfo
public static final int ID_INDEX = 0;public static final int CACHED_NAME_INDEX = 1;public static final int CACHED_NUMBER_LABEL_INDEX = 2;public static final int CACHED_NUMBER_TYPE_INDEX = 3;public static final int NUMBER_INDEX = 4;public static final int TYPE_INDEX = 5;public static final int DURATION_INDEX = 6;public static final int DATE_INDEX = 7;
public static CallLogInfo readCallLogInfoByCursor(Cursor cursor){if(cursor == null || cursor.isClosed()){return null;}try {CallLogInfo info = new CallLogInfo();info._id = cursor.getLong(ID_INDEX);info.name = cursor.getString(CACHED_NAME_INDEX);info.number_label = cursor.getString(CACHED_NUMBER_LABEL_INDEX);info.number_type = cursor.getString(CACHED_NUMBER_TYPE_INDEX);info.number = cursor.getString(NUMBER_INDEX);info.type = cursor.getInt(TYPE_INDEX);info.duration = cursor.getLong(DURATION_INDEX);info.date = cursor.getLong(DATE_INDEX);return info;} catch (Exception e){e.printStackTrace();return null;}}
电话记录类型
public static final String TYPE = "type";/** Call log type for incoming calls. */public static final int INCOMING_TYPE = 1;//来电记录/** Call log type for outgoing calls. */public static final int OUTGOING_TYPE = 2;//去电记录/** Call log type for missed calls. */public static final int MISSED_TYPE = 3;//未接记录/*** Call log type for voicemails.* @hide*/public static final int VOICEMAIL_TYPE = 4;//语言信箱
默认排序
public static final String DEFAULT_SORT_ORDER = CallLog.Calls.DEFAULT_SORT_ORDER;