本文代码以MTK平台Android 4.4为分析对象,与Google原生AOSP有些许差异,请读者知悉。
Android系统通话记录存储在联系人数据库contacts2.db中的calls表中,通话记录(calllog)存储到数据库的时机可查看我之前的一篇博客Android4.4 Telephony流程分析——电话挂断step39,系统提供了CallLogProvider这个ContentProvider来供外界访问。我们来看本文将会使用到的CallLogProvider的代码片段:
/**
* Call log content provider.
*/
public class CallLogProvider extends ContentProvider {
......
private static final int CALLS_JION_DATA_VIEW = 5;
private static final int CALLS_JION_DATA_VIEW_ID = 6;
......
private static final UriMatcher sURIMatcher = new UriMatcher(UriMatcher.NO_MATCH);
static {
sURIMatcher.addURI(CallLog.AUTHORITY, "calls", CALLS);
sURIMatcher.addURI(CallLog.AUTHORITY, "calls/#", CALLS_ID);
sURIMatcher.addURI(CallLog.AUTHORITY, "calls/filter/*", CALLS_FILTER);
sURIMatcher.addURI(CallLog.AUTHORITY, "calls/search_filter/*", CALLS_SEARCH_FILTER);
sURIMatcher.addURI(CallLog.AUTHORITY, "callsjoindataview", CALLS_JION_DATA_VIEW);
sURIMatcher.addURI(CallLog.AUTHORITY, "callsjoindataview/#", CALLS_JION_DATA_VIEW_ID);
sURIMatcher.addURI(CallLog.AUTHORITY, SearchManager.SUGGEST_URI_PATH_QUERY, SEARCH_SUGGESTIONS);
sURIMatcher.addURI(CallLog.AUTHORITY, SearchManager.SUGGEST_URI_PATH_QUERY + "/*", SEARCH_SUGGESTIONS);
sURIMatcher.addURI(CallLog.AUTHORITY, SearchManager.SUGGEST_URI_PATH_SHORTCUT + "/*", SEARCH_SHORTCUT);
}
private static final HashMap<String, String> sCallsProjectionMap;
......
private static final String mstableCallsJoinData = Tables.CALLS + " LEFT JOIN "
+ " (SELECT * FROM " + Views.DATA + " WHERE " + Data._ID + " IN "
+ "(SELECT " + Calls.DATA_ID + " FROM " + Tables.CALLS + ")) AS " + Views.DATA
+ " ON(" + Tables.CALLS + "." + Calls.DATA_ID + " = " + Views.DATA + "." + Data._ID + ")";
......
private static final HashMap<String, String> sCallsJoinDataViewProjectionMap;
......
@Override
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs,
String sortOrder) {
final SQLiteQueryBuilder qb = new SQLiteQueryBuilder();
.......
switch (match) {
......
case CALLS_JION_DATA_VIEW: {
qb.setTables(mstableCallsJoinData);
qb.setProjectionMap(sCallsJoinDataViewProjectionMap);
qb.setStrict(true);
break;
}
case CALLS_JION_DATA_VIEW_ID: {
qb.setTables(mstableCallsJoinData);//将查询这个数据集合,<span style="line-height: 23.9999980926514px; font-family: Arial;">mstableCallsJoinData</span>前面已定义
qb.setProjectionMap(sCallsJoinDataViewProjectionMap);
qb.setStrict(true);
selectionBuilder.addClause(getEqualityClause(Tables.CALLS + "." + Calls._ID,
parseCallIdFromUri(uri)));
break;
}
......
}
......
}
......
}
calls表的主要字段及其数据类型可查看下表: