android查询通话记录小结

项目中到通讯录以及通话记录的查询,本来在网上查了下资料,以为很简单就能实现。通讯录的查询没有什么问题,但是查询通话记录的时候遇到了问题。

当我根据电话号码来查询通话记录的时候,发现基本上查询到的记录只有寥寥几条,远比在手机自带通讯录中的通话记录少,但是我查询所有记录的时候,

获得的数据却没有损失。

这说明,应该是查询条件电话号码有问题,于是就去手机本地的通话记录数据库中查看数据库表,(手机需要获得root权限,并使用RE文件管理器查看)

路径是:data/data/com.android.providers.contacts/databases/contacts2.db

然后打开calls表:

_id number date duration type new name//主要用的就死这几个字段,number即是查询的电话号码,duration是通话时间,type有3个值:1代表呼入,2代表呼出

3代表未接,其他的看名字就知道是什么了,以下是核心代码

ContentResolver resolver = context.getContentResolver();
		
		String projection[] = new String[]{CallLog.Calls.DATE, CallLog.Calls.NUMBER,
			    CallLog.Calls.TYPE, CallLog.Calls.DURATION};
		Cursor recordCursor = resolver.query(CallLog.Calls.CONTENT_URI, projection,"number=? or number=?"
				, phone, CallLog.Calls.DEFAULT_SORT_ORDER);
		SimpleDateFormat sfd = new SimpleDateFormat("MM-dd HH:mm",Locale.getDefault());
		if(recordCursor != null){
			while(recordCursor.moveToNext()){
				String date = sfd.format(new Date(recordCursor.getLong(
						recordCursor.getColumnIndex(CallLog.Calls.DATE))));
				String phoneNum = recordCursor.getString(recordCursor.getColumnIndex(CallLog.Calls.NUMBER));
				int type = recordCursor.getInt(recordCursor.getColumnIndex(CallLog.Calls.TYPE));
				int duration = recordCursor.getInt(recordCursor.getColumnIndex(CallLog.Calls.DURATION));
				
				
				
			}
			recordCursor.close();

projection是需要查询的字段,resolver.query(CallLog.Calls.CONTENT_URI, projection,"number=? or number=?", phone, CallLog.Calls.DEFAULT_SORT_ORDER);这几个参数分别是所查询表的路径,查询字段,条件,条件的值,排序;其中phone是一个字符串数组,里面的值分别填充查询条件里面的?;

为什么我查询条件是number=? or number=?,我查1个电话号码的通话记录干嘛等于2个值?

我一开始就是number=?,然后查询记录总是少,通过查询数据库表里面的值和程序里面打印的值,终于知道错在哪了,

原因就是在通讯录里面添加联系人然后保存号码的时候,如果你是自己手动输入的话,一般都会自动空格,比如135 5645 5645这样保存的,

那么在数据库表里面也是有空格的,然后如果你这个号码丢失了,你问别人要回来,直接复制添加13556455645,这样没有空格,数据库表里面

也就没有空格,所以你查询的时候只按照一个number无论是有空格还是没有空格都可能会有记录丢失。

知道原因在哪,问题就好解决了,查询的时候传入2个参数,有空格和无空格的就能保证全部查询啦。。。

最好上一张我做好的DEMO作为结束,第一次写博客,望多指教啊......

android查询通话记录小结_第1张图片
 

你可能感兴趣的:(android开发)