关于自定义通话记录的查找等等。。。

通话记录数据保存的位置:
在contact2.db中的calls数据表中

利用ContentProvider查询Calls表中的数据:

Calls表的URI:CallLog.Calls.CONTENT_URI

Calls表中的列所对应的常量
_id      ----> CallLog.Calls._ID
photo_id ----> CallLog.Calls.CACHED_PHOTO_ID/"photo_id"
type     ----> CallLog.Calls.TYPE
number   ----> CallLog.Calls.NUMBER;
time     ----> CallLog.Calls.DATE;
name     ----> CallLog.Calls.CACHED_NAME;

条目布局的注意事项:
1)头像的处理:头像位置要使用一个RelativeLayout
   或FrameLayout,里面包括一大一小两个ImageView。
   大的ImageView用来显示头像,默认可见
   小的ImageView用来显示陌生人的惊叹号,默认不可见
   根据ListView显示条目的calllog的name属性值来决定
   小的ImageView是否可见
2)用户姓名字体颜色的处理
   根据calllog的type属性的属性值来设定name的颜色
   如果type为3,代表着这是一个未接电话,需要用红色显示名字
   如果为其它取值,用黑色显示名字
3)呼出电话小图标的处理
   与1)中惊叹号图标的处理方式类似。所有的条目布局中都包含
   一个呼出电话的小图标。默认时该图标不可见。如果ListView显示
   条目的type属性值为2时,该图标可见。
4)通话时间的处理
   今天发生的通话,用“时时:分分”来表示
   昨天发生的通话,用“昨天”来表示
   前天发生的通话,用“前天”来表示
   更早发生的通话,用“年年年年/月月/日日”来表示
   注意:对于昨天,前天和年月日显示是否也需要“时时:分分”
   自行决定吧

调优:
1)calllog内容的加载最好使用异步的方式进行

style的用法
在写布局文件的时候,如果有大量的相同属性在使用
可以把这些重复的属性提取到style.xml文件中
比如,友录项目中,在写headerview_layout的时候
左侧IamgeView和右侧ImageView的layout_width
layout_height和layout_gravity三个属性的值都一样
可以将其提取为一个自定义的style
 <style name="HeaderViewImageView">
        <item name="android:layout_width">30dp</item>
        <item name="android:layout_height">30dp</item>
        <item name="android:layout_gravity">center_vertical</item>
 </style>
这样,就没有必要在布局文件中再次写这三个属性了
直接引用该style即可:
<ImageView
  android:id="@+id/iv_headerview_left"
  style="@style/HeaderViewImageView"
  android:layout_marginLeft="10dp" />

<ImageView
 android:id="@+id/iv_headerview_right"
 style="@style/HeaderViewImageView"
 android:layout_marginRight="10dp" />

BaseFragment的使用
如果多个Fragment中存在重复的代码逻辑,
可以将这部分代码进行提取,放到父类中。
这样各个子Fragment通过继承就可以使用这些
方法,而不用重复的写相同的代码。
由于Java不支持多继承机制,所以要改变以下继承层次
从原先的:
ContactFragment----->Fragment
CalllogFragment----->Fragment
变成现在的:
ContactFragment---->BaseFragment---->Fragment
CalllogFragment---->BaseFragment---->Fragment
将ContactFragment和CalllogFragment中相同逻辑的
代码提取到BaseFragment中。

利用电话号码反查头像ID
calls表中的photo_id列数据存在一个小问题,当对方
拨打电话进来时,如果没有接听,则对方的头像ID值是
不会记录在calls表中的。此时CalllogFragment中显示
该条通话记录的时候就不会有头像出现。所以,需要利用
电话号码去其它表中查询该用户的头像ID。
利用电话号码查询头像ID最简单的方式就是利用phone_lookup表的
ContentProvider来进行查询。查询时需要注意的是,该ContentProvider
支持的Uri格式为:
Uri.withAppendedPath(ContactsContract.PhoneLookup.CONTENT_FILTER_URI, 电话号码);

完整的利用电话号码查询头像id的代码实例为:
protected static int getPhotoIdByNumber(Context context,String number) {
	int photoId = 0;
	//利用phone_lookup数据表所对应的ContentProvider进行查询
	ContentResolver cr = context.getContentResolver();
	Uri uri = Uri.withAppendedPath(ContactsContract.PhoneLookup.CONTENT_FILTER_URI, number);
	Cursor c = cr.query(uri , new String[]{PhoneLookup.PHOTO_ID}, null, null, null);
	//如果提供的电话号码确实是有头像的
	if(c.moveToNext()){
		photoId = c.getInt(0);
	}
		c.close();
		return photoId;
	}


利用adapter删除数据时
如果没有及时更新ListView中的数据显示
会导致异常:
异常信息是说不能从非UI线程更新ListView

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值