Android通讯录管理(获取联系人、通话记录、短信消息)(三)
这是通讯录管理的最后一篇,前面两篇已经把获取联系人和通话记录解决了,短息消息就相对来说要稍微复杂那么一点。我们先来看看效果图:
源码下载:http://download.csdn.net/detail/wwj_748/6962865
   
首先显示短信列表,每个列表会显示发送人号码,日期还有短信的内容概要,点击列表之后进入穿查看会话的短信消息,这里为了简单起见就没有把发送消息的功能加进去了。
布局界面:
/Contact_Demo/res/layout/sms_list_view.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:background="#000000"android:orientation="vertical" ><ListViewandroid:id="@+id/sms_list"android:layout_width="fill_parent"android:layout_height="wrap_content"android:layout_gravity="center"android:cacheColorHint="#00000000"android:choiceMode="singleChoice"android:fastScrollEnabled="true"android:soundEffectsEnabled="true" /></LinearLayout>

/Contact_Demo/res/layout/sms_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:gravity="center_vertical"android:paddingTop="5dip" ><QuickContactBadgeandroid:id="@+id/qcb"android:layout_width="75dip"android:layout_height="75dip"android:layout_marginBottom="3dip"android:src="@drawable/touxiang" /><LinearLayoutandroid:id="@+id/ll"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginLeft="3dip"android:layout_toRightOf="@+id/qcb"android:gravity="center_vertical"android:orientation="horizontal" ><TextViewandroid:id="@+id/name"android:layout_width="wrap_content"android:layout_height="wrap_content"android:singleLine="true"android:textAppearance="?android:attr/textAppearanceMedium"android:textColor="#ffffff" /><TextViewandroid:id="@+id/count"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginLeft="5dip"android:singleLine="true"android:textAppearance="?android:attr/textAppearanceSmall"android:textColor="#ffffff" /></LinearLayout><TextViewandroid:id="@+id/date"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_below="@+id/ll"android:layout_marginLeft="3dip"android:layout_toRightOf="@+id/qcb"android:singleLine="true"android:textAppearance="?android:attr/textAppearanceSmall"android:textColor="#ffffff" /><TextViewandroid:id="@+id/content"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_below="@+id/date"android:layout_gravity="bottom"android:layout_marginLeft="3dip"android:layout_toRightOf="@+id/qcb"android:singleLine="true"android:textAppearance="?android:attr/textAppearanceMedium"android:textColor="#5CACEE" /></RelativeLayout>
短息实体类:
/Contact_Demo/src/com/suntek/contact/model/SMSBean.java
package com.suntek.contact.model;public class SMSBean {private String thread_id; // 线程idprivate String msg_count; // 消息个数private String msg_snippet; // 消息片段private String address; // 地址private Long date; // 日期private String read; // 已读public SMSBean(String threadId, String msgCount, String msgSnippet) {thread_id = threadId;msg_count = msgCount;msg_snippet = msgSnippet;}public SMSBean() {}public String getAddress() {return address;}public void setAddress(String address) {this.address = address;}public Long getDate() {return date;}public void setDate(Long date) {this.date = date;}public String getRead() {return read;}public void setRead(String read) {this.read = read;}public String getThread_id() {return thread_id;}public void setThread_id(String threadId) {thread_id = threadId;}public String getMsg_count() {return msg_count;}public void setMsg_count(String msgCount) {msg_count = msgCount;}public String getMsg_snippet() {return msg_snippet;}public void setMsg_snippet(String msgSnippet) {msg_snippet = msgSnippet;}
}

短信列表适配器:
/Contact_Demo/src/com/suntek/contact/adapter/SMSAdpter.java

package com.suntek.contact.adapter;import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;import com.suntek.contact.R;
import com.suntek.contact.model.SMSBean;/*** 短信适配器* * @author Administrator* */
public class SMSAdpter extends BaseAdapter {private LayoutInflater mInflater;private List<SMSBean> smsList;private Date date;private SimpleDateFormat sdf;public SMSAdpter(Context context) {mInflater = LayoutInflater.from(context);this.smsList = new ArrayList<SMSBean>();this.date = new Date();this.sdf = new SimpleDateFormat("MM/dd HH:mm");}public void assignment(List<SMSBean> smsList) {this.smsList = smsList;}public void add(SMSBean bean) {smsList.add(bean);}public void remove(int position) {smsList.remove(position);}@Overridepublic int getCount() {return smsList.size();}@Overridepublic Object getItem(int position) {return smsList.get(position);}@Overridepublic long getItemId(int position) {return position;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {ViewHolder holder = null;if (convertView == null) {convertView = mInflater.inflate(R.layout.sms_list_item, parent,false);holder = new ViewHolder();holder.name = (TextView) convertView.findViewById(R.id.name);holder.count = (TextView) convertView.findViewById(R.id.count);holder.date = (TextView) convertView.findViewById(R.id.date);holder.content = (TextView) convertView.findViewById(R.id.content);} else {holder = (ViewHolder) convertView.getTag();}holder.name.setText(smsList.get(position).getAddress());holder.count.setText("(" + smsList.get(position).getMsg_count() + ")");this.date.setTime(smsList.get(position).getDate());holder.date.setText(this.sdf.format(date));holder.content.setText(smsList.get(position).getMsg_snippet());convertView.setTag(holder);return convertView;}public final class ViewHolder {public TextView name;public TextView count;public TextView date;public TextView content;}
}

Activity界面

/Contact_Demo/src/com/suntek/contact/SMSListActivity.java
package com.suntek.contact;import java.util.HashMap;
import java.util.List;
import java.util.Map;import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ListView;import com.suntek.contact.adapter.SMSAdpter;
import com.suntek.contact.model.SMSBean;
import com.suntek.contact.util.BaseIntentUtil;
import com.suntek.contact.util.RexseeSMS;/*** 短信列表* * @author Administrator* */
public class SMSListActivity extends Activity {private ListView smsListView;private SMSAdpter smsAdpter;private RexseeSMS rsms;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.sms_list_view);smsListView = (ListView) findViewById(R.id.sms_list);smsAdpter = new SMSAdpter(SMSListActivity.this);rsms = new RexseeSMS(SMSListActivity.this);List<SMSBean> list_mmt = rsms.getThreadsNum(rsms.getThreads(0));// 注入短信列表数据smsAdpter.assignment(list_mmt);// 填充数据smsListView.setAdapter(smsAdpter);// 短信列表项点击事件smsListView.setOnItemClickListener(new OnItemClickListener() {@Overridepublic void onItemClick(AdapterView<?> parent, View view,int position, long id) {Map<String, String> map = new HashMap<String, String>();SMSBean sb = (SMSBean) smsAdpter.getItem(position);map.put("phoneNumber", sb.getAddress());map.put("threadId", sb.getThread_id());BaseIntentUtil.intentSysDefault(SMSListActivity.this,MessageBoxList.class, map);}});}
}
查询短信的工具类:
/Contact_Demo/src/com/suntek/contact/util/RexseeSMS.java
package com.suntek.contact.util;import java.util.ArrayList;
import java.util.List;import android.content.ContentResolver;
import android.content.Context;
import android.database.Cursor;
import android.net.Uri;import com.suntek.contact.model.SMSBean;public class RexseeSMS {public static final String CONTENT_URI_SMS = "content://sms"; // 短信public static final String CONTENT_URI_SMS_INBOX = "content://sms/inbox";// 收件箱public static final String CONTENT_URI_SMS_SENT = "content://sms/sent"; // 发送public static final String CONTENT_URI_SMS_CONVERSATIONS = "content://sms/conversations";public RexseeSMS(Context mContext) {this.mContext = mContext;// TODO Auto-generated constructor stub}public static String[] SMS_COLUMNS = new String[] { "_id", // 0"thread_id", // 1"address", // 2"person", // 3"date", // 4"body", // 5"read", // 6; 0:not read 1:read; default is 0"type", // 7; 0:all 1:inBox 2:sent 3:draft 4:outBox 5:failed// 6:queued"service_center" // 8};public static String[] THREAD_COLUMNS = new String[] { "thread_id","msg_count", "snippet" };private Context mContext;public String getContentUris() {String rtn = "{";rtn += "\"sms\":\"" + CONTENT_URI_SMS + "\"";rtn += ",\"inbox\":\"" + CONTENT_URI_SMS_INBOX + "\"";rtn += ",\"sent\":\"" + CONTENT_URI_SMS_SENT + "\"";rtn += ",\"conversations\":\"" + CONTENT_URI_SMS_CONVERSATIONS + "\"";rtn += "}";return rtn;}public String get(int number) {return getData(null, number);}public String getUnread(int number) {return getData("type=1 AND read=0", number);}public String getRead(int number) {return getData("type=1 AND read=1", number);}public String getInbox(int number) {return getData("type=1", number);}public String getSent(int number) {return getData("type=2", number);}public String getByThread(int thread) {return getData("thread_id=" + thread, 0);}public String getData(String selection, int number) {Cursor cursor = null;ContentResolver contentResolver = mContext.getContentResolver();try {if (number > 0) {cursor = contentResolver.query(Uri.parse(CONTENT_URI_SMS),SMS_COLUMNS, selection, null, "date desc limit "+ number);} else {cursor = contentResolver.query(Uri.parse(CONTENT_URI_SMS),SMS_COLUMNS, selection, null, "date desc");}if (cursor == null || cursor.getCount() == 0)return "[]";String rtn = "";for (int i = 0; i < cursor.getCount(); i++) {cursor.moveToPosition(i);if (i > 0)rtn += ",";rtn += "{";rtn += "\"_id\":" + cursor.getString(0);rtn += ",\"thread_id\":" + cursor.getString(1);rtn += ",\"address\":\"" + cursor.getString(2) + "\"";rtn += ",\"person\":\""+ ((cursor.getString(3) == null) ? "" : cursor.getString(3)) + "\"";rtn += ",\"date\":" + cursor.getString(4);rtn += ",\"body\":\"" + cursor.getString(5) + "\"";rtn += ",\"read\":"+ ((cursor.getInt(6) == 1) ? "true" : "false");rtn += ",\"type\":" + cursor.getString(7);rtn += ",\"service_center\":" + cursor.getString(8);rtn += "}";}return "[" + rtn + "]";} catch (Exception e) {return "[]";}}public List<SMSBean> getThreads(int number) {Cursor cursor = null;ContentResolver contentResolver = mContext.getContentResolver();List<SMSBean> list = new ArrayList<SMSBean>();try {if (number > 0) {cursor = contentResolver.query(Uri.parse(CONTENT_URI_SMS_CONVERSATIONS),THREAD_COLUMNS, null, null, "thread_id desc limit "+ number);} else {cursor = contentResolver.query(Uri.parse(CONTENT_URI_SMS_CONVERSATIONS),THREAD_COLUMNS, null, null, "date desc");}if (cursor == null || cursor.getCount() == 0)return list;for (int i = 0; i < cursor.getCount(); i++) {cursor.moveToPosition(i);SMSBean mmt = new SMSBean(cursor.getString(0),cursor.getString(1), cursor.getString(2));list.add(mmt);}return list;} catch (Exception e) {return list;}}public List<SMSBean> getThreadsNum(List<SMSBean> ll) {Cursor cursor = null;ContentResolver contentResolver = mContext.getContentResolver();List<SMSBean> list = new ArrayList<SMSBean>();// try {for (SMSBean mmt : ll) {cursor = contentResolver.query(Uri.parse(CONTENT_URI_SMS),SMS_COLUMNS, "thread_id = " + mmt.getThread_id(), null,null);if (cursor == null || cursor.getCount() == 0)return list;cursor.moveToFirst();mmt.setAddress(cursor.getString(2));mmt.setDate(cursor.getLong(4));mmt.setRead(cursor.getString(6));list.add(mmt);}return list;// } catch (Exception e) {// Log.e("getThreadsNum", "getThreadsNum-------------");// return list;// }}
}
上面是短信列表的实现,下面是会话消息的实现
界面布局:
/Contact_Demo/res/layout/message_list_view.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="fill_parent"android:background="#000000" ><ListViewandroid:id="@+id/message_list"android:layout_width="fill_parent"android:layout_height="wrap_content"android:background="#00000000"android:cacheColorHint="#00000000"android:choiceMode="singleChoice"android:soundEffectsEnabled="true" /></RelativeLayout>

/Contact_Demo/res/layout/list_say_he_item.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="fill_parent"android:layout_height="wrap_content"android:gravity="left"android:orientation="horizontal"android:paddingBottom="10dip"android:paddingLeft="5dip"android:paddingRight="50dip"android:paddingTop="10dip" ><LinearLayoutandroid:id="@+id/layout_bj"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="left"android:background="@drawable/incoming"android:gravity="center_vertical"android:orientation="vertical" ><com.suntek.contact.view.CustomTextViewandroid:id="@+id/messagedetail_row_text"android:layout_width="wrap_content"android:layout_height="wrap_content"android:gravity="top|left"android:padding="5dip"android:textColor="#000000" /><TextViewandroid:id="@+id/messagedetail_row_date"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="right"android:textAppearance="?android:attr/textAppearanceSmall"android:textColor="#65879e" /></LinearLayout></LinearLayout>

/Contact_Demo/res/layout/list_say_me_item.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="fill_parent"android:layout_height="wrap_content"android:gravity="right"android:orientation="horizontal"android:paddingBottom="10dip"android:paddingLeft="50dip"android:paddingRight="5dip"android:paddingTop="10dip" ><LinearLayoutandroid:id="@+id/layout_bj"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="right"android:background="@drawable/outgoing"android:gravity="center_vertical"android:orientation="vertical" ><com.suntek.contact.view.CustomTextViewandroid:id="@+id/messagedetail_row_text"android:layout_width="wrap_content"android:layout_height="wrap_content"android:gravity="top|left"android:padding="5dip"android:textColor="#000000" /><TextViewandroid:id="@+id/messagedetail_row_date"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="right"android:textAppearance="?android:attr/textAppearanceSmall"android:textColor="#65879e" /></LinearLayout></LinearLayout>
短信消息实体类:
/Contact_Demo/src/com/suntek/contact/model/MessageBean.java
package com.suntek.contact.model;public class MessageBean {private String name; // 联系人姓名private String date; // 日期private String text; // 文本private int layoutID; // 布局id,区分是发送人还是接收人public MessageBean() {}public MessageBean(String name, String date, String text, int layoutID) {super();this.name = name;this.date = date;this.text = text;this.layoutID = layoutID;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getDate() {return date;}public void setDate(String date) {this.date = date;}public String getText() {return text;}public void setText(String text) {this.text = text;}public int getLayoutID() {return layoutID;}public void setLayoutID(int layoutID) {this.layoutID = layoutID;}
}

消息列表适配器:
/Contact_Demo/src/com/suntek/contact/adapter/MessageBoxListAdapter.java

package com.suntek.contact.adapter;import java.util.List;import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.graphics.Color;
import android.text.ClipboardManager;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnLongClickListener;
import android.view.View.OnTouchListener;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.LinearLayout;
import android.widget.TextView;import com.suntek.contact.R;
import com.suntek.contact.model.MessageBean;/*** 消息列表适配器* * @author Administrator* */
public class MessageBoxListAdapter extends BaseAdapter {private List<MessageBean> mbList;private Context ctx;private LinearLayout layout_father;private LayoutInflater vi;private LinearLayout layout_child;private TextView tvDate;private TextView tvText;public MessageBoxListAdapter(Context context, List<MessageBean> coll) {ctx = context;vi = (LayoutInflater) ctx.getSystemService(Context.LAYOUT_INFLATER_SERVICE);this.mbList = coll;}public int getCount() {return mbList.size();}public Object getItem(int position) {return mbList.get(position);}public long getItemId(int position) {return position;}public View getView(int position, View convertView, ViewGroup parent) {MessageBean mb = mbList.get(position);// 得到布局IDint itemLayout = mb.getLayoutID();layout_father = new LinearLayout(ctx);vi.inflate(itemLayout, layout_father, true);layout_father.setBackgroundColor(Color.TRANSPARENT);layout_child = (LinearLayout) layout_father.findViewById(R.id.layout_bj);tvText = (TextView) layout_father.findViewById(R.id.messagedetail_row_text);tvText.setText(mb.getText());tvDate = (TextView) layout_father.findViewById(R.id.messagedetail_row_date);tvDate.setText(mb.getDate());addListener(tvText, tvDate, layout_child, mb);return layout_father;}public void addListener(final TextView tvText, final TextView tvDate,LinearLayout layout_bj, final MessageBean mb) {layout_bj.setOnClickListener(new OnClickListener() {public void onClick(View v) {}});layout_bj.setOnLongClickListener(new OnLongClickListener() {public boolean onLongClick(View v) {tvText.setTextColor(0xffffffff);showListDialog(newtan, mb);return true;}});layout_bj.setOnTouchListener(new OnTouchListener() {public boolean onTouch(View v, MotionEvent event) {switch (event.getAction()) {case MotionEvent.ACTION_DOWN:case MotionEvent.ACTION_MOVE:tvText.setTextColor(0xffffffff);break;default:tvText.setTextColor(Color.BLACK);break;}return false;}});}private String[] newtan = new String[] { "转发", "复制文本内容", "删除", "查询信息详情" };private void showListDialog(final String[] arg, final MessageBean mb) {new AlertDialog.Builder(ctx).setTitle("信息选项").setItems(arg, new DialogInterface.OnClickListener() {public void onClick(DialogInterface dialog, int which) {switch (which) {case 0:break;case 1:ClipboardManager cmb = (ClipboardManager) ctx.getSystemService(ctx.CLIPBOARD_SERVICE);cmb.setText(mb.getText());break;case 2:break;case 3:break;};}}).show();}
}

/Contact_Demo/src/com/suntek/contact/MessageBoxList.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.widget.ListView;
import android.widget.Toast;import com.suntek.contact.adapter.MessageBoxListAdapter;
import com.suntek.contact.model.MessageBean;/*** 短信消息列表 收发人* * @author Administrator* */
public class MessageBoxList extends Activity {private ListView talkView;private List<MessageBean> messages = null;private AsyncQueryHandler asyncQuery;private String address;private SimpleDateFormat sdf;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.message_list_view);sdf = new SimpleDateFormat("MM-dd HH:mm");String thread = getIntent().getStringExtra("threadId");init(thread);}private void init(String thread) {asyncQuery = new MessageAsynQueryHandler(getContentResolver());talkView = (ListView) findViewById(R.id.message_list);messages = new ArrayList<MessageBean>();Uri uri = Uri.parse("content://sms");String[] projection = new String[] { "date", "address", "person","body", "type" }; // 查询的列asyncQuery.startQuery(0, null, uri, projection,"thread_id = " + thread, null, "date asc");}/*** 异步查询数据库的类* * @author Administrator* */private class MessageAsynQueryHandler extends AsyncQueryHandler {public MessageAsynQueryHandler(ContentResolver cr) {super(cr);}@Overrideprotected void onQueryComplete(int token, Object cookie, Cursor cursor) {if (cursor != null && cursor.getCount() > 0) {cursor.moveToFirst();for (int i = 0; i < cursor.getCount(); i++) {cursor.moveToPosition(i);String date = sdf.format(new Date(cursor.getLong(cursor.getColumnIndex("date"))));if (cursor.getInt(cursor.getColumnIndex("type")) == 1) {// 他说的信息MessageBean d = new MessageBean(cursor.getString(cursor.getColumnIndex("address")),date,cursor.getString(cursor.getColumnIndex("body")),R.layout.list_say_he_item);messages.add(d);} else { // 我说的信息MessageBean d = new MessageBean(cursor.getString(cursor.getColumnIndex("address")),date,cursor.getString(cursor.getColumnIndex("body")),R.layout.list_say_me_item);messages.add(d);}}if (messages.size() > 0) {talkView.setAdapter(new MessageBoxListAdapter(MessageBoxList.this, messages));talkView.setDivider(null);talkView.setSelection(messages.size());} else {Toast.makeText(MessageBoxList.this, "没有短信进行操作",Toast.LENGTH_SHORT).show();}}super.onQueryComplete(token, cookie, cursor);}}
}

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手机拨打电话、手动发送短信与自动拨打电话、自动发送短信(代码很简单哦)

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

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

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

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

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

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

    Android通讯录管理(获取联系人.通话记录.短信消息)(二) 前言:上一篇博客介绍的是获取联系人的实现,本篇博客将介绍通话记录的实现. 同样的,你可以到这里下载源码:http://download ...

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

    前言:前阵子主要是记录了如何对联系人的一些操作,比如搜索,全选.反选和删除等在实际开发中可能需要实现的功能,本篇博客是小巫从一个别人开源的一个项目抽取出来的部分内容,把它给简化出来,可以让需要的朋友清 ...

最新文章

  1. Spring Cloud Alibaba 高级特性 基于 Sleuth+Zipkin 实施链路跟踪体系
  2. html怎么去掉背景颜色,word背景颜色怎么去掉
  3. Apache下的ArrayUtils工具类总结
  4. 老是担心数学学不好?是因为你的数学老师不是爱因斯坦!
  5. c语言中 快速输出字符数组后几位方法
  6. 免费数学神器Mathpix发布移动版,一起来写更快的公式
  7. 3D视觉——基恩士LJ-X系列线激光
  8. 梦断代码最后4章读后感
  9. SegNet安装、训练、测试
  10. excel白屏未响应_Excel中出现无响应的解决方法
  11. xp系统下载U盘安装教程,u盘安装xp系统方法
  12. 自己的网站被劫持跳转时该怎么解决?
  13. TP框架中S函数使用方法
  14. 手机连接电脑热点 显示 连接超时,已解决
  15. 安卓系统网络服务器地址,安卓系统 云服务器地址
  16. 谷歌等大型科技公司对你了解多深,你想知道吗?
  17. 数据结构<1>时空复杂度详解
  18. “转行做程序员”很难?这里有4个建议
  19. ARM9嵌入式Linux开发-内存与IO操作
  20. 镜像网络MW参与“分布式存储赛道新风口”圆桌精彩全览

热门文章

  1. 年级计算机试题五年级,五年级计算机操作测试题.pdf
  2. 10月书讯(上)| 双节同庆,读书正当时
  3. ASRUL智能翻页扫描机器人
  4. 对excel文件区间分类并统计作图
  5. Shell自动化管理 for ORACLE DBA
  6. xcode8注释快捷键
  7. Go速成无压力【二】:包的导入导出与使用
  8. 专利会不会成为小米上市的绊脚石?
  9. 山泽Typec扩展坞M.2移动固态硬盘盒拓展 - 我的硬件配置
  10. 海报在线设计v1.7.2