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