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

}
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

img

img

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)

结尾

最后小编想说:不论以后选择什么方向发展,目前重要的是把Android方面的技术学好,毕竟其实对于程序员来说,要学习的知识内容、技术有太多太多,要想不被环境淘汰就只有不断提升自己,从来都是我们去适应环境,而不是环境来适应我们!

当程序员容易,当一个优秀的程序员是需要不断学习的,从初级程序员到高级程序员,从初级架构师到资深架构师,或者走向管理,从技术经理到技术总监,每个阶段都需要掌握不同的能力。早早确定自己的职业方向,才能在工作和能力提升中甩开同龄人。

想要拿高薪实现技术提升薪水得到质的飞跃。最快捷的方式,就是有人可以带着你一起分析,这样学习起来最为高效,所以为了大家能够顺利进阶中高级、架构师,我特地为大家准备了一套高手学习的源码和框架视频等精品Android架构师教程,保证你学了以后保证薪资上升一个台阶。

当你有了学习线路,学习哪些内容,也知道以后的路怎么走了,理论看多了总要实践的。

高级UI,自定义View

UI这块知识是现今使用者最多的。当年火爆一时的Android入门培训,学会这小块知识就能随便找到不错的工作了。

不过很显然现在远远不够了,拒绝无休止的CV,亲自去项目实战,读源码,研究原理吧!

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!**

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

[外链图片转存中…(img-3PEbtmxj-1713285015059)]

[外链图片转存中…(img-mxVyXOsl-1713285015061)]

[外链图片转存中…(img-0IZROjD8-1713285015061)]

[外链图片转存中…(img-LLpyqbp6-1713285015062)]

[外链图片转存中…(img-5yPFmyoB-1713285015063)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)

结尾

最后小编想说:不论以后选择什么方向发展,目前重要的是把Android方面的技术学好,毕竟其实对于程序员来说,要学习的知识内容、技术有太多太多,要想不被环境淘汰就只有不断提升自己,从来都是我们去适应环境,而不是环境来适应我们!

当程序员容易,当一个优秀的程序员是需要不断学习的,从初级程序员到高级程序员,从初级架构师到资深架构师,或者走向管理,从技术经理到技术总监,每个阶段都需要掌握不同的能力。早早确定自己的职业方向,才能在工作和能力提升中甩开同龄人。

想要拿高薪实现技术提升薪水得到质的飞跃。最快捷的方式,就是有人可以带着你一起分析,这样学习起来最为高效,所以为了大家能够顺利进阶中高级、架构师,我特地为大家准备了一套高手学习的源码和框架视频等精品Android架构师教程,保证你学了以后保证薪资上升一个台阶。

当你有了学习线路,学习哪些内容,也知道以后的路怎么走了,理论看多了总要实践的。

[外链图片转存中…(img-NZ9oFMZI-1713285015064)]

高级UI,自定义View

UI这块知识是现今使用者最多的。当年火爆一时的Android入门培训,学会这小块知识就能随便找到不错的工作了。

不过很显然现在远远不够了,拒绝无休止的CV,亲自去项目实战,读源码,研究原理吧!

[外链图片转存中…(img-t0MKg0zy-1713285015065)]

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值