Android通訊錄管理(獲取聯系人、通話記錄、短信消息)(三)

Android通訊錄管理(獲取聯系人、通話記錄、短信消息)(三)

這是通訊錄管理的最後一篇,前面兩篇已經把獲取聯系人和通話記錄解決瞭,短息消息就相對來說要稍微復雜那麼一點。我們先來看看效果圖:


首先顯示短信列表,每個列表會顯示發送人號碼,日期還有短信的內容概要,點擊列表之後進入穿查看會話的短信消息,這裡為瞭簡單起見就沒有把發送消息的功能加進去瞭。

佈局界面:
/Contact_Demo喎?/kf/ware/vc/” target=”_blank” class=”keylink”>vcmVzL2xheW91dC9zbXNfbGlzdF92aWV3LnhtbDxicj4KCjxwcmUgY2xhc3M9″brush:java;”>

/Contact_Demo/res/layout/sms_list_item.xml



    

    

        

        
    

    

    

短息實體類:

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

package com.suntek.contact.model;

public class SMSBean {

	private String thread_id; // 線程id
	private 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 smsList;
	private Date date;
	private SimpleDateFormat sdf;

	public SMSAdpter(Context context) {
		mInflater = LayoutInflater.from(context);
		this.smsList = new ArrayList();
		this.date = new Date();
		this.sdf = new SimpleDateFormat("MM/dd HH:mm");
	}

	public void assignment(List smsList) {
		this.smsList = smsList;
	}

	public void add(SMSBean bean) {
		smsList.add(bean);
	}

	public void remove(int position) {
		smsList.remove(position);
	}

	@Override
	public int getCount() {
		return smsList.size();
	}

	@Override
	public Object getItem(int position) {
		return smsList.get(position);
	}

	@Override
	public long getItemId(int position) {
		return position;
	}

	@Override
	public 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;

	@Override
	protected 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 list_mmt = rsms.getThreadsNum(rsms.getThreads(0));
		// 註入短信列表數據
		smsAdpter.assignment(list_mmt);
		// 填充數據
		smsListView.setAdapter(smsAdpter);
		// 短信列表項點擊事件
		smsListView.setOnItemClickListener(new OnItemClickListener() {

			@Override
			public void onItemClick(AdapterView parent, View view,
					int position, long id) {
				Map map = new HashMap();
				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  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 getThreads(int number) {
		Cursor cursor = null;
		ContentResolver contentResolver = mContext.getContentResolver();
		List list = new ArrayList();
		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 getThreadsNum(List ll) {

		Cursor cursor = null;
		ContentResolver contentResolver = mContext.getContentResolver();
		List list = new ArrayList();
		// 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



    

/Contact_Demo/res/layout/list_say_he_item.xml



    

        

        
    

/Contact_Demo/res/layout/list_say_me_item.xml



    

        

        
    

短信消息實體類:
/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 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 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);
		// 得到佈局ID
		int 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 messages = null;
	private AsyncQueryHandler asyncQuery;
	private String address;
	private SimpleDateFormat sdf;

	@Override
	protected 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();

		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);
		}

		@Override
		protected void onQueryComplete(int token, Object cookie, Cursor cursor) {
			if (cursor != null && cursor.getCount() > 0) {
				cursor.moveToFirst();
				for (int i = 0; i  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);
		}
	}
}

發佈留言