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

http://blog.csdn.net/wwj_748/article/details/19970271

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

2014-02-26 11:40 9076人阅读 评论(11) 收藏 举报

 分类:

【Android通讯录模块开发】(10) 

版权声明:本文为博主原创文章,未经博主允许不得转载。

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

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

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

界面布局:

/Contact_Demo/res/layout/contact_record_list_view.xml

[html] view plaincopy

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:id="@+id/contact_record_view"
  4. android:layout_width="match_parent"
  5. android:layout_height="match_parent"
  6. android:background="#000000">
  7. <ListView
  8. android:id="@+id/call_log_list"
  9. android:layout_width="fill_parent"
  10. android:layout_height="fill_parent"
  11. android:layout_alignParentTop="true"
  12. android:cacheColorHint="#000000"
  13. android:fadingEdge="none"
  14. android:scrollingCache="false"
  15. android:visibility="visible" />
  16. </RelativeLayout>

/Contact_Demo/res/layout/contact_record_list_item.xml

[html] view plaincopy

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:layout_width="fill_parent"
  4. android:layout_height="wrap_content"
  5. android:orientation="vertical" >
  6. <ImageView
  7. android:id="@+id/call_type"
  8. android:layout_width="wrap_content"
  9. android:layout_height="wrap_content"
  10. android:layout_centerVertical="true"
  11. android:layout_marginLeft="5dip"
  12. android:layout_marginRight="5dip"
  13. android:background="@drawable/ic_calllog_outgoing_nomal" />
  14. <LinearLayout
  15. android:layout_width="wrap_content"
  16. android:layout_height="wrap_content"
  17. android:layout_centerVertical="true"
  18. android:layout_toRightOf="@+id/call_type"
  19. android:orientation="vertical" >
  20. <TextView
  21. android:id="@+id/name"
  22. android:layout_width="wrap_content"
  23. android:layout_height="0dip"
  24. android:layout_weight="1"
  25. android:textAppearance="?android:textAppearanceMedium"
  26. android:textColor="#ffffff" />
  27. <TextView
  28. android:id="@+id/number"
  29. android:layout_width="wrap_content"
  30. android:layout_height="wrap_content"
  31. android:textAppearance="?android:textAppearanceSmall"
  32. android:textColor="#cccccc" />
  33. </LinearLayout>
  34. <TextView
  35. android:id="@+id/call_btn"
  36. android:layout_width="wrap_content"
  37. android:layout_height="wrap_content"
  38. android:layout_alignParentRight="true"
  39. android:layout_centerVertical="true"
  40. android:layout_marginLeft="10dip"
  41. android:layout_marginRight="10dip"
  42. android:background="@drawable/ic_calllog_call_btn" />
  43. <ImageView
  44. android:id="@+id/fg"
  45. android:layout_width="wrap_content"
  46. android:layout_height="75dip"
  47. android:layout_toLeftOf="@+id/call_btn"
  48. android:background="@drawable/black_bg" />
  49. <TextView
  50. android:id="@+id/time"
  51. android:layout_width="wrap_content"
  52. android:layout_height="wrap_content"
  53. android:layout_centerVertical="true"
  54. android:layout_toLeftOf="@+id/fg"
  55. android:textColor="#ffffff" />
  56. </RelativeLayout>

定义实体类:

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

[java] view plaincopy

  1. package com.suntek.contact.model;
  2. /**
  3. * 通话记录实体类
  4. *
  5. * @author Administrator
  6. *
  7. */
  8. public class CallLogBean {
  9. private int id;
  10. private String name; // 名称
  11. private String number; // 号码
  12. private String date; // 日期
  13. private int type; // 来电:1,拨出:2,未接:3
  14. private int count; // 通话次数
  15. public int getId() {
  16. return id;
  17. }
  18. public void setId(int id) {
  19. this.id = id;
  20. }
  21. public String getName() {
  22. return name;
  23. }
  24. public void setName(String name) {
  25. this.name = name;
  26. }
  27. public String getNumber() {
  28. return number;
  29. }
  30. public void setNumber(String number) {
  31. this.number = number;
  32. }
  33. public String getDate() {
  34. return date;
  35. }
  36. public void setDate(String date) {
  37. this.date = date;
  38. }
  39. public int getType() {
  40. return type;
  41. }
  42. public void setType(int type) {
  43. this.type = type;
  44. }
  45. public int getCount() {
  46. return count;
  47. }
  48. public void setCount(int count) {
  49. this.count = count;
  50. }
  51. }

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

[java] view plaincopy

  1. package com.suntek.contact.adapter;
  2. import java.util.List;
  3. import android.content.Context;
  4. import android.content.Intent;
  5. import android.net.Uri;
  6. import android.view.LayoutInflater;
  7. import android.view.View;
  8. import android.view.View.OnClickListener;
  9. import android.view.ViewGroup;
  10. import android.widget.BaseAdapter;
  11. import android.widget.ImageView;
  12. import android.widget.TextView;
  13. import com.suntek.contact.R;
  14. import com.suntek.contact.model.CallLogBean;
  15. /**
  16. * 电话记录适配器
  17. *
  18. * @author Administrator
  19. *
  20. */
  21. public class DialAdapter extends BaseAdapter {
  22. private Context ctx;
  23. private List<CallLogBean> callLogs;
  24. private LayoutInflater inflater;
  25. public DialAdapter(Context context, List<CallLogBean> callLogs) {
  26. this.ctx = context;
  27. this.callLogs = callLogs;
  28. this.inflater = LayoutInflater.from(context);
  29. }
  30. @Override
  31. public int getCount() {
  32. return callLogs.size();
  33. }
  34. @Override
  35. public Object getItem(int position) {
  36. return callLogs.get(position);
  37. }
  38. @Override
  39. public long getItemId(int position) {
  40. return position;
  41. }
  42. @Override
  43. public View getView(int position, View convertView, ViewGroup parent) {
  44. ViewHolder holder;
  45. if (convertView == null) {
  46. convertView = inflater.inflate(R.layout.contact_record_list_item,
  47. null);
  48. holder = new ViewHolder();
  49. holder.call_type = (ImageView) convertView
  50. .findViewById(R.id.call_type);
  51. holder.name = (TextView) convertView.findViewById(R.id.name);
  52. holder.number = (TextView) convertView.findViewById(R.id.number);
  53. holder.time = (TextView) convertView.findViewById(R.id.time);
  54. holder.call_btn = (TextView) convertView
  55. .findViewById(R.id.call_btn);
  56. convertView.setTag(holder); // 缓存
  57. } else {
  58. holder = (ViewHolder) convertView.getTag();
  59. }
  60. CallLogBean callLog = callLogs.get(position);
  61. switch (callLog.getType()) {
  62. case 1:
  63. holder.call_type
  64. .setBackgroundResource(R.drawable.ic_calllog_outgoing_nomal);
  65. break;
  66. case 2:
  67. holder.call_type
  68. .setBackgroundResource(R.drawable.ic_calllog_incomming_normal);
  69. break;
  70. case 3:
  71. holder.call_type
  72. .setBackgroundResource(R.drawable.ic_calllog_missed_normal);
  73. break;
  74. }
  75. holder.name.setText(callLog.getName());
  76. holder.number.setText(callLog.getNumber());
  77. holder.time.setText(callLog.getDate());
  78. addViewListener(holder.call_btn, callLog, position);
  79. return convertView;
  80. }
  81. private static class ViewHolder {
  82. ImageView call_type;
  83. TextView name;
  84. TextView number;
  85. TextView time;
  86. TextView call_btn;
  87. }
  88. private void addViewListener(View view, final CallLogBean callLog,
  89. final int position) {
  90. view.setOnClickListener(new OnClickListener() {
  91. @Override
  92. public void onClick(View v) {
  93. Uri uri = Uri.parse("tel:" + callLog.getNumber());
  94. Intent intent = new Intent(Intent.ACTION_CALL, uri);
  95. ctx.startActivity(intent);
  96. }
  97. });
  98. }
  99. }

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

[java] view plaincopy

  1. package com.suntek.contact;
  2. import java.text.SimpleDateFormat;
  3. import java.util.ArrayList;
  4. import java.util.Date;
  5. import java.util.List;
  6. import android.app.Activity;
  7. import android.content.AsyncQueryHandler;
  8. import android.content.ContentResolver;
  9. import android.database.Cursor;
  10. import android.net.Uri;
  11. import android.os.Bundle;
  12. import android.provider.CallLog;
  13. import android.widget.ListView;
  14. import com.suntek.contact.adapter.DialAdapter;
  15. import com.suntek.contact.model.CallLogBean;
  16. /**
  17. * 通话记录列表
  18. *
  19. * @author wwj
  20. *
  21. */
  22. public class ContactRecordListActivity extends Activity {
  23. private ListView callLogListView;
  24. private AsyncQueryHandler asyncQuery;
  25. private DialAdapter adapter;
  26. private List<CallLogBean> callLogs;
  27. @Override
  28. protected void onCreate(Bundle savedInstanceState) {
  29. super.onCreate(savedInstanceState);
  30. setContentView(R.layout.contact_record_list_view);
  31. callLogListView = (ListView) findViewById(R.id.call_log_list);
  32. asyncQuery = new MyAsyncQueryHandler(getContentResolver());
  33. init();
  34. }
  35. private void init() {
  36. Uri uri = android.provider.CallLog.Calls.CONTENT_URI;
  37. // 查询的列
  38. String[] projection = { CallLog.Calls.DATE, // 日期
  39. CallLog.Calls.NUMBER, // 号码
  40. CallLog.Calls.TYPE, // 类型
  41. CallLog.Calls.CACHED_NAME, // 名字
  42. CallLog.Calls._ID, // id
  43. };
  44. asyncQuery.startQuery(0, null, uri, projection, null, null,
  45. CallLog.Calls.DEFAULT_SORT_ORDER);
  46. }
  47. private class MyAsyncQueryHandler extends AsyncQueryHandler {
  48. public MyAsyncQueryHandler(ContentResolver cr) {
  49. super(cr);
  50. }
  51. @Override
  52. protected void onQueryComplete(int token, Object cookie, Cursor cursor) {
  53. if (cursor != null && cursor.getCount() > 0) {
  54. callLogs = new ArrayList<CallLogBean>();
  55. SimpleDateFormat sfd = new SimpleDateFormat("MM-dd hh:mm");
  56. Date date;
  57. cursor.moveToFirst(); // 游标移动到第一项
  58. for (int i = 0; i < cursor.getCount(); i++) {
  59. cursor.moveToPosition(i);
  60. date = new Date(cursor.getLong(cursor
  61. .getColumnIndex(CallLog.Calls.DATE)));
  62. String number = cursor.getString(cursor
  63. .getColumnIndex(CallLog.Calls.NUMBER));
  64. int type = cursor.getInt(cursor
  65. .getColumnIndex(CallLog.Calls.TYPE));
  66. String cachedName = cursor.getString(cursor
  67. .getColumnIndex(CallLog.Calls.CACHED_NAME));// 缓存的名称与电话号码,如果它的存在
  68. int id = cursor.getInt(cursor
  69. .getColumnIndex(CallLog.Calls._ID));
  70. CallLogBean callLogBean = new CallLogBean();
  71. callLogBean.setId(id);
  72. callLogBean.setNumber(number);
  73. callLogBean.setName(cachedName);
  74. if (null == cachedName || "".equals(cachedName)) {
  75. callLogBean.setName(number);
  76. }
  77. callLogBean.setType(type);
  78. callLogBean.setDate(sfd.format(date));
  79. callLogs.add(callLogBean);
  80. }
  81. if (callLogs.size() > 0) {
  82. setAdapter(callLogs);
  83. }
  84. }
  85. super.onQueryComplete(token, cookie, cursor);
  86. }
  87. }
  88. private void setAdapter(List<CallLogBean> callLogs) {
  89. adapter = new DialAdapter(this, callLogs);
  90. callLogListView.setAdapter(adapter);
  91. }
  92. }

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

[java] view plaincopy

  1. <pre code_snippet_id="205549" snippet_file_name="blog_20140226_3_3338512"></pre>
  2. <pre></pre>
  3. <pre></pre>
时间: 2024-10-16 10:31:52

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

Android通讯录管理一之联系人获取

正如我们知道的一样,Android的通讯录和短信管理是通过contentprovider来向开发者来开发接口的.必须从ContentResolver入手去解决.其中通讯录操作涉及到系统源码api的使用,特别是在表的uri上面容易弄混.在接下来的几篇文章中蜗牛将陆续为大家推出Android通讯管理相关知识的文章.其中包括联系人获取.通话记录获取.短信获取.短信详情获取发送短信.废话不多说先上图 先看看联系人的表的结构 其中对于开发这来说主要关注以上三个表,其中要用到联合查询,关于三张表的设计可以百

Android开发之Intent跳转到系统应用中的拨号界面、联系人界面、短信界面

现在开发中的功能需要直接跳转到拨号.联系人.短信界面等等,查找了很多资料,自己整理了一下.1.跳转到拨号界面,代码如下: 1)直接拨打 Intent intentPhone = new Intent(Intent.ACTION_CALL, Uri.parse("tel:" + phoneNumber)); startActivity(intentPhone); 2)跳转到拨号界面 Intent intent = newIntent(Intent.ACTION_DIAL,Uri.pars

手机通讯录怎么恢复?通话记录如何恢复

手机通讯录怎么恢复?通话记录如何恢复?我们现在是很少的使用到我们的手机通话记录的,就像是我们很少使用我们的手机联系人一样,但是有些时候,在一些独特的场合,自己不小心删除了自己的手机通话记录,你是不是会后悔呢? 若是当你删除了自己的手机通话记录之后,发现自己的手机通话记录中有比较重要的通话记录,自己又没有保存到手机联系人的话,那么我们该怎么办呢?不用着急,我们可以在没有备份的情况下使用下面的方法. 1.首先可以在准备恢复的时候打开电脑,之后在电脑上浏览器上下载安装"互盾安卓恢复大师",之

Android基础入门教程——10.2 SmsManager(短信管理器)

Android基础入门教程--10.2 SmsManager(短信管理器) 标签(空格分隔): Android基础入门教程 本节引言: 本节带来的是Android中的SmsManager(短息管理器),见名知意,就是用来管理手机短信的, 而该类的应用场景并不多,一般是我们发短信的时候才会用到这个API,当然这种短信是 文字短信,对于彩信过于复杂,而且在QQ微信各种社交APP横行的年代,你会去发1块钱一条的 彩信吗?所以本节我们只讨论发送普通文字短信! 官方文档:SmsManager 1.调用系统

Intent跳转到系统应用中的拨号界面、联系人界面、短信界面及其他

现在开发中的功能需要直接跳转到拨号.联系人.短信界面等等,查找了很多资料,自己整理了一下. 首先,我们先看拨号界面,代码如下: [java] view plaincopy Intent intent =new Intent(); intent.setAction("android.intent.action.CALL_BUTTON"); startActivity(intent); 和 [java] view plaincopy Uri uri = Uri.parse("te

解决:People下面选择分享可见联系人,选择多个联系人后通过短信分享,短信中只显示一个联系人

问题描述: [操作步骤]:People下导入导出中选择分享可见联系人,选择多个联系人后通过短信分享 [测试结果]:短信中只能显示一个联系人 [预期结果]:可以显示多个联系人 经过代码分析,从compose_message_activitu.xml中的ViewStub进行定位到现实联系人名片的视图: <ViewStub android:id="@+id/vcard_attachment_view_stub" android:layout="@layout/vcard_at

短信猫二次开发接口支持任何一种开发语言性能稳定

此款短信猫二次开发接口基于数据库开发方式支持任一种开发语言对短信猫开发,兼容性强.开发简单方便.灵活.稳定.可以快速地使您的应用系统实现短信功能,多种接口方式供二次开发时选择,系统具备良好的可扩展性.企事业单位通过此款短信猫二次开发接口方式实现短信功能,既实现了资源的共享和有效使用,便于企业对进出信息的管理.监控和统计,同时为以后短信功能的扩展提供了便利. 短信猫二次开发接口软件运行界面如图: 在该方案中,考虑到银行是对信息安全性要求很高的行业,采用短信猫作为短信收发设备,避免了常用的通过移动互

配送短信猫软件丰富,支持短信猫二次开发

配送短信猫软件丰富,支持短信猫二次开发 短信猫主要是用于二次开发领域,支持将短信收发功能集成.嵌入到其他系统.软件当中.最终实现短信收发除了需要有短信猫硬件外还需要相应短信猫软件的支持,即所谓的短信猫开发包.短信猫SDK或短信猫接口程序.而支持短信猫二次开发的软件非常丰富,有不同款式.有免费有收费,采用不同开发方式. 以下介绍我公司的几款短信猫开发软件,如下: 免费短信猫DLL开发包 提供有多种开发语言示例DEMO,方便程序员开发调用,免费短信猫开发包,免加密狗,自行测试调试使用. 短信服务器8

配送短信猫二次开发接口提供多种开发语言示例

免费配送的信猫二次开发接口提供有多种开发语言示例,如C#.C++.Delphi.PowerBuilder.VB.net.VC++.VisualBasic等多种开发示例方便程序开发人员开发调试.使用简单方便,将sms.dll文件拷贝到系统安装目录中的system32文件夹中,然后再根据以下接口函数说明和提供的例程源码开发,无需安装,免加密狗. 短信猫二次开发接口提供的开发语言示例有: 部分短信猫二次开发接口函数说明: 1.Sms_Connection(Com_Port As Integer,Com