Android通讯录管理(获取联系人、通话记录、短信消息)(二)

前言:上一篇博客介绍的是获取联系人的实现,本篇博客将介绍通话记录的实现。

同样的,你可以到这里下载源码:http://download.csdn.net/detail/wwj_748/6962865

界面布局:

/Contact_Demo/res/layout/contact_record_list_view.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"android:id="@+id/contact_record_view"android:layout_width="match_parent"android:layout_height="match_parent" android:background="#000000"><ListViewandroid:id="@+id/call_log_list"android:layout_width="fill_parent"android:layout_height="fill_parent"android:layout_alignParentTop="true"android:cacheColorHint="#000000"android:fadingEdge="none"android:scrollingCache="false"android:visibility="visible" /></RelativeLayout>

/Contact_Demo/res/layout/contact_record_list_item.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="fill_parent"android:layout_height="wrap_content"android:orientation="vertical" ><ImageViewandroid:id="@+id/call_type"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_centerVertical="true"android:layout_marginLeft="5dip"android:layout_marginRight="5dip"android:background="@drawable/ic_calllog_outgoing_nomal" /><LinearLayoutandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_centerVertical="true"android:layout_toRightOf="@+id/call_type"android:orientation="vertical" ><TextViewandroid:id="@+id/name"android:layout_width="wrap_content"android:layout_height="0dip"android:layout_weight="1"android:textAppearance="?android:textAppearanceMedium"android:textColor="#ffffff" /><TextViewandroid:id="@+id/number"android:layout_width="wrap_content"android:layout_height="wrap_content"android:textAppearance="?android:textAppearanceSmall"android:textColor="#cccccc" /></LinearLayout><TextViewandroid:id="@+id/call_btn"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignParentRight="true"android:layout_centerVertical="true"android:layout_marginLeft="10dip"android:layout_marginRight="10dip"android:background="@drawable/ic_calllog_call_btn" /><ImageViewandroid:id="@+id/fg"android:layout_width="wrap_content"android:layout_height="75dip"android:layout_toLeftOf="@+id/call_btn"android:background="@drawable/black_bg" /><TextViewandroid:id="@+id/time"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_centerVertical="true"android:layout_toLeftOf="@+id/fg"android:textColor="#ffffff" /></RelativeLayout>

定义实体类:

/Contact_Demo/src/com/suntek/contact/model/CallLogBean.java

package com.suntek.contact.model;/*** 通话记录实体类* * @author Administrator* */
public class CallLogBean {private int id;private String name; // 名称private String number; // 号码private String date; // 日期private int type; // 来电:1,拨出:2,未接:3private int count; // 通话次数public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getNumber() {return number;}public void setNumber(String number) {this.number = number;}public String getDate() {return date;}public void setDate(String date) {this.date = date;}public int getType() {return type;}public void setType(int type) {this.type = type;}public int getCount() {return count;}public void setCount(int count) {this.count = count;}}

/Contact_Demo/src/com/suntek/contact/adapter/DialAdapter.java

package com.suntek.contact.adapter;import java.util.List;import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;import com.suntek.contact.R;
import com.suntek.contact.model.CallLogBean;/*** 电话记录适配器* * @author Administrator* */
public class DialAdapter extends BaseAdapter {private Context ctx;private List<CallLogBean> callLogs;private LayoutInflater inflater;public DialAdapter(Context context, List<CallLogBean> callLogs) {this.ctx = context;this.callLogs = callLogs;this.inflater = LayoutInflater.from(context);}@Overridepublic int getCount() {return callLogs.size();}@Overridepublic Object getItem(int position) {return callLogs.get(position);}@Overridepublic long getItemId(int position) {return position;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {ViewHolder holder;if (convertView == null) {convertView = inflater.inflate(R.layout.contact_record_list_item,null);holder = new ViewHolder();holder.call_type = (ImageView) convertView.findViewById(R.id.call_type);holder.name = (TextView) convertView.findViewById(R.id.name);holder.number = (TextView) convertView.findViewById(R.id.number);holder.time = (TextView) convertView.findViewById(R.id.time);holder.call_btn = (TextView) convertView.findViewById(R.id.call_btn);convertView.setTag(holder); // 缓存} else {holder = (ViewHolder) convertView.getTag();}CallLogBean callLog = callLogs.get(position);switch (callLog.getType()) {case 1:holder.call_type.setBackgroundResource(R.drawable.ic_calllog_outgoing_nomal);break;case 2:holder.call_type.setBackgroundResource(R.drawable.ic_calllog_incomming_normal);break;case 3:holder.call_type.setBackgroundResource(R.drawable.ic_calllog_missed_normal);break;}holder.name.setText(callLog.getName());holder.number.setText(callLog.getNumber());holder.time.setText(callLog.getDate());addViewListener(holder.call_btn, callLog, position);return convertView;}private static class ViewHolder {ImageView call_type;TextView name;TextView number;TextView time;TextView call_btn;}private void addViewListener(View view, final CallLogBean callLog,final int position) {view.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {Uri uri = Uri.parse("tel:" + callLog.getNumber());Intent intent = new Intent(Intent.ACTION_CALL, uri);ctx.startActivity(intent);}});}
}

/Contact_Demo/src/com/suntek/contact/ContactRecordListActivity.java

package com.suntek.contact;import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;import android.app.Activity;
import android.content.AsyncQueryHandler;
import android.content.ContentResolver;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.provider.CallLog;
import android.widget.ListView;import com.suntek.contact.adapter.DialAdapter;
import com.suntek.contact.model.CallLogBean;/*** 通话记录列表* * @author wwj* */
public class ContactRecordListActivity extends Activity {private ListView callLogListView;private AsyncQueryHandler asyncQuery;private DialAdapter adapter;private List<CallLogBean> callLogs;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.contact_record_list_view);callLogListView = (ListView) findViewById(R.id.call_log_list);asyncQuery = new MyAsyncQueryHandler(getContentResolver());init();}private void init() {Uri uri = android.provider.CallLog.Calls.CONTENT_URI;// 查询的列String[] projection = { CallLog.Calls.DATE, // 日期CallLog.Calls.NUMBER, // 号码CallLog.Calls.TYPE, // 类型CallLog.Calls.CACHED_NAME, // 名字CallLog.Calls._ID, // id};asyncQuery.startQuery(0, null, uri, projection, null, null,CallLog.Calls.DEFAULT_SORT_ORDER);}private class MyAsyncQueryHandler extends AsyncQueryHandler {public MyAsyncQueryHandler(ContentResolver cr) {super(cr);}@Overrideprotected void onQueryComplete(int token, Object cookie, Cursor cursor) {if (cursor != null && cursor.getCount() > 0) {callLogs = new ArrayList<CallLogBean>();SimpleDateFormat sfd = new SimpleDateFormat("MM-dd hh:mm");Date date;cursor.moveToFirst(); // 游标移动到第一项for (int i = 0; i < cursor.getCount(); i++) {cursor.moveToPosition(i);date = new Date(cursor.getLong(cursor.getColumnIndex(CallLog.Calls.DATE)));String number = cursor.getString(cursor.getColumnIndex(CallLog.Calls.NUMBER));int type = cursor.getInt(cursor.getColumnIndex(CallLog.Calls.TYPE));String cachedName = cursor.getString(cursor.getColumnIndex(CallLog.Calls.CACHED_NAME));// 缓存的名称与电话号码,如果它的存在int id = cursor.getInt(cursor.getColumnIndex(CallLog.Calls._ID));CallLogBean callLogBean = new CallLogBean();callLogBean.setId(id);callLogBean.setNumber(number);callLogBean.setName(cachedName);if (null == cachedName || "".equals(cachedName)) {callLogBean.setName(number);}callLogBean.setType(type);callLogBean.setDate(sfd.format(date));callLogs.add(callLogBean);}if (callLogs.size() > 0) {setAdapter(callLogs);}}super.onQueryComplete(token, cookie, cursor);}}private void setAdapter(List<CallLogBean> callLogs) {adapter = new DialAdapter(this, callLogs);callLogListView.setAdapter(adapter);}
}

代码是最好的解释了,这里使用的几个重要的类,一个是Uri(进行查询的通用资源标志符),一个是AsyncQueryHandler(Android提供的异步操作数据库的类),这里我们调用它的startQuery方法来查询数据库,在它onQueryComplete方法中得到数据库返回的游标cousor,通过curor来取得数据库对应表中的字段值。



												

Android通讯录管理(获取联系人、通话记录、短信消息)(二)相关推荐

  1. android通讯录管理(获取联系人,通话记录,短信消息),Android通讯录管理(获取联系人、通话记录、短信消息)(二)...

    Android通讯录管理(获取联系人.通话记录.短信消息)(二) 前言:上一篇博客介绍的是获取联系人的实现,本篇博客将介绍通话记录的实现. 界面布局: /Contact_Demo/res/layout ...

  2. Android通讯录管理 获取联系人 通话记录 短信消息 一

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! Andr ...

  3. Android通讯录管理(获取联系人 通话记录 短信消息)(一)

    Android通讯录管理(获取联系人.通话记录.短信消息) 2014年2月26日 通讯录开发研究学习 前言:前阵子主要是记录了如何对联系人的一些操作,比如搜索,全选.反选和删除等在实际开发中可能需要实 ...

  4. Android通讯录管理(获取联系人 通话记录 短信消息)(三)

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! Andr ...

  5. Android简易实战教程--第九话《短信备份~二》

    这一篇,承接地八话.使用高效的方式备份短信--xml序列化器. 存储短信,要以对象的方式存储.首先创建javabean: package com.itydl.createxml.domain;publ ...

  6. Android手机拨打电话、手动发送短信与自动拨打电话、自动发送短信(代码很简单哦)

    Android实现手动拨打电话,即点击后跳转到手机默认电话号码输入页面,可以将相应号码传送过去: <span style="font-size:18px;"> Inte ...

  7. Android实现拨打电话和发送短信,Android手机拨打电话、手动发送短信与自动拨打电话、自动发送短信(代码很简单哦)...

    Android实现手动拨打电话,即点击后跳转到手机默认电话号码输入页面,可以将相应号码传送过去: Intent intent = new Intent(Intent.ACTION_DIAL, Uri. ...

  8. Android实战技巧之三十九:短信收发

    7月4日从广州出差回来就定下写作计划,但迟迟没有动笔.耽搁的原因还是老样子,工作上又有新任务,全部精力都投入过去了,每天精疲力竭的回来也打不起精神做其他事了.这就是精力管理不当所致,就像我把很多要做的 ...

  9. Android通讯录管理(获取联系人、通话记录、短信消息)(三)

    Android通讯录管理(获取联系人.通话记录.短信消息)(三) 这是通讯录管理的最后一篇,前面两篇已经把获取联系人和通话记录解决了,短息消息就相对来说要稍微复杂那么一点.我们先来看看效果图: 源码下 ...

最新文章

  1. 记一下常用shell,防止自己忘了。。。记性不好
  2. Promise从入门到精通
  3. 基于Oracle11gR2 GRID的单实例库备份恢复
  4. [转]Vim常用命令速查
  5. android gradle + junit + jacoco 集成jenkins,sonar系统
  6. 测试环境服务器硬盘塞满问题排查
  7. 互联网日报 | 京东数科科创板IPO获受理;美团点评回应更名为“美团”;中通快递通过港交所上市聆讯...
  8. dj鲜生-24-含资源-模板操作-注册与登陆页的模板继承
  9. 自然语言处理跟踪研究
  10. leetcode第一刷_Merge Intervals
  11. .vbb文件转换为.txt文件
  12. CR渲染器全景图如何渲染颜色通道_3d Max设计师们的“偷懒”小技巧——云渲染篇...
  13. mysql拖库_利用SQL注入漏洞拖库的方法
  14. 修行漫谈——说说中年危机
  15. ubuntu 开机进不去桌面问题
  16. 项目 | Java+PhantomJs爬虫实战——半次元 下载高清原图
  17. 借贷记账法--借贷记账法 (Debit and Credit)
  18. axure元件制作-常用开关
  19. linux镜像使用什么pe安装系统,Linux系统ISO镜像文件可不可以用pe启动盘来安装
  20. 设备远程监控物联网平台

热门文章

  1. 线上崩了?一招教你快速定位问题。
  2. Unity 小项目:模拟太阳系
  3. 海报设计灵感:简约独特的图形图案排版 by Quim Marin
  4. Jenkins实现android自动打包 上传蒲公英及fir.im
  5. esp8266 蓝牙耳机_手把手带你制作WIFI智能开关.走进物联网-ESP8266学习日记(三)...
  6. adb 设置模拟器代理ip
  7. 流量暴增基建告急 网络重构需二次投资
  8. 教你自制超强笔记本水冷散热系统
  9. android-17手机,覆盖7大手机品牌近4亿安卓用户“互传联盟”让分享更容易
  10. 苹果Mac常用的快捷键有哪些?