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

}

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<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 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

<?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” >

<ListView

android: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” />

/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” >

<LinearLayout

android: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.CustomTextView

android: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” />

<TextView

android: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” />

/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” >

<LinearLayout

android: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.CustomTextView

android: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” />

<TextView

android: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” />

短信消息实体类:

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

}

最后

其实Android开发的知识点就那么多,面试问来问去还是那么点东西。所以面试没有其他的诀窍,只看你对这些知识点准备的充分程度。so,出去面试时先看看自己复习到了哪个阶段就好。

当然我也为你们整理好了百度、阿里、腾讯、字节跳动等等互联网超级大厂的历年面试真题集锦。这也是我这些年来养成的习惯,一定要学会把好的东西,归纳整理,然后系统的消化吸收,这样才能极大的提高学习效率和成长进阶。碎片、零散化的东西,我觉得最没有价值的。就好比你给我一张扑克牌,我只会觉得它是一张废纸,但如果你给我一副扑克牌,它便有了它的价值。这和我们收集资料就要收集那些系统化的,是一个道理。

网上学习 Android的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。希望这份系统化的技术体系对大家有一个方向参考。
《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》点击传送门,即可获取!

}

@Override

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

}

最后

其实Android开发的知识点就那么多,面试问来问去还是那么点东西。所以面试没有其他的诀窍,只看你对这些知识点准备的充分程度。so,出去面试时先看看自己复习到了哪个阶段就好。

当然我也为你们整理好了百度、阿里、腾讯、字节跳动等等互联网超级大厂的历年面试真题集锦。这也是我这些年来养成的习惯,一定要学会把好的东西,归纳整理,然后系统的消化吸收,这样才能极大的提高学习效率和成长进阶。碎片、零散化的东西,我觉得最没有价值的。就好比你给我一张扑克牌,我只会觉得它是一张废纸,但如果你给我一副扑克牌,它便有了它的价值。这和我们收集资料就要收集那些系统化的,是一个道理。

[外链图片转存中…(img-cYAnZ7xg-1714875793559)]

网上学习 Android的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。希望这份系统化的技术体系对大家有一个方向参考。
《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》点击传送门,即可获取!

  • 14
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值