android飞信短信箱程序源码讲解!
一、程序演示
图1.进入程序后的第1页面,头部的新消息提示在任意页面都会弹出。
图2.未读消息数量提示,任意页面。
图3.点击新建短信,(或者会话中的转发选项)需要输入接收者手机号码
图4.点击上图接收者输入框右侧的“+”按钮,弹出联系人选择列表,选择一个联系人后,该联系人的手机号码就会自动添在新建短信的输入框内。
图5.点击清空全部短信的menu后的2次确认,所有删除操作都有2次确认,包括清空该人,清空该条等选项。
图6.长按短信列表上的某条记录弹出的选项。查看对话直接进入短信会话页面,呼叫是直接拨打该联系人的电话,呼叫前编辑是到系统拨号盘页面,清空该人即删除该联系人全部短信。
图7.从系统通知栏查看新短信通知,点击后可进入短信会话页面。
图8.短信会话页面,头部为对方信息。
图9.长按某条短信弹出的信息选项,提取号码,回拨电话,浏览网址,是根据当前短信是否含有电话号码,和URL而自动显示的。
图10.点击提取号码,回拨电话,浏览网址而弹出的电话,URL的选项。
图11.短信会话页面的menu。
图12.插入表情MENU,的表情选项
图13.常用短语的选项。
图14.插入表情,常用短语选择后会自动添加到对话框中。
二、程序框架讲解
三、图15.程序包,类视图
1.activity 包:页面的类。
1.1AbstractBaseActivity 页面对象的父类
1.2ConversationActivity 会话页面
1.3SMSListActivity 短信主列表页面
2.adapter包:列表的数据适配器。
2.1ContactsListAdapter 联系人列表数据适配器
2.2ConversationAdapter 短信会话 数据适配器
2.3SimpleListAdapter 一种简单的列表形式的数据适配器
2.4SmileyListAdapter 表情列表数据适配器
2.5SMSListAdapter 短信列表数据适配器
3.common包:常量及工具。
3.1Constants 数值常量
3.2PhoneBookOperate 手机通讯录操作方法集
3.3RichTextParser 富文本显示方法
3.4SMSOperate 短信操作方法集
3.5Utility 公用方法集
4.core包:核心方法,主要用于异步处理。
4.1LogicSet 核心方法调用入口
4.2Request 异步处理线程
4.3RequestContent 异步处理方法接口
5.GIF包:解析GIF动画
5.1GIFDecode gif动画解析类
6.interfaces包:接口类
6.1DataViewListener 核心回调页面的数据接口
6.2DialogListener 对话框接口
6.3SimpleListViewDrawable简单数据列表的显示接口
7.model包: 数据实体类
7.1Contact 手机通讯录数据
7.2SMS 短信数据
7.3SMSGroup 短信组数据
8.services包:系统消息处理类
8.1SMSreceiver_bak 监听系统短信箱
8.2SMSreceiver 截获系统短信
9.textParsing包:富文本解析类
9.1AutoMachine
9.2DefineRichText
9.3ModeString
9.4Node
9.5RichText
9.6RichTextMark
9.7TestMain
三、数据库操作
1.增加数据
m_context.getContentResolver()
.insert(Uri url, ContentValues values)
2.删除数据
m_context.getContentResolver()
.delete(Uri url, String where, String[] selectionArgs);
3.修改数据
m_context.getContentResolver()
.update(Uri uri, ContentValues values,
String where, String[] selectionArgs);
4.查询数据
m_context.getContentResolver()
.query( Uri uri, String[] projection,
String selection, String[] selectionArgs,
String sortOrder);
代码示例:
1.写短信箱操作
2.删除短信操作
3.修改短信为已读
4.根据手机号码查找联系人
四、数据库字段介绍
1.短信数据库,URI = "content://sms"
字段 | 值 | 意义 |
_id | 48 | 短消息在短信数据库里的序号 |
thread_id | 16 | 对话的序号 |
address | +8613411884805 | 对方手机号 |
person | null | 对方在联系人数据库里的ID,null为不在联系人数据库里 |
date | 1256539465022 | 日期 long型,想得到具体日期自己转换吧! |
protocol | 0 | 协议 |
read | 1 | 已读状态 |
status | -1 | 状态 |
type | 1 | 类型 1是接收到的,2是发出的,0是编辑好,尚未发出的 |
reply_path_present | 0 |
|
subject | null | 会话主题 |
body | 您好 | 消息内容 |
service_center | +8613800755500 | 短信服务中心号码编号,可以得知该短信是从哪里发过来的 |
2.联系人数据库
strColumnName = _sync_id strColumnValue=null
strColumnName = primary_organization strColumnValue=null
strColumnName = notes strColumnValue=null
strColumnName = primary_phone strColumnValue=1
strColumnName = status strColumnValue=null
strColumnName = im_handle strColumnValue=null
strColumnName = _sync_local_id strColumnValue=null
strColumnName = im_account strColumnValue=null
strColumnName = _sync_time strColumnValue=null
strColumnName = im_protocol strColumnValue=null
strColumnName = mode strColumnValue=null
strColumnName = label strColumnValue=null
strColumnName = times_contacted strColumnValue=0
strColumnName = name strColumnValue=é??è?3
strColumnName = send_to_voicemail strColumnValue=null
strColumnName = primary_email strColumnValue=null
strColumnName = custom_ringtone strColumnValue=null
strColumnName = sort_string strColumnValue=í?¤í2?í??ío3à?
strColumnName = _sync_version strColumnValue=null
strColumnName = last_time_contacted strColumnValue=null
strColumnName = _sync_account strColumnValue=null
strColumnName = display_name strColumnValue=é??è?3
strColumnName = number_key strColumnValue=77681111831
strColumnName = number strColumnValue=13811118677
strColumnName = phonetic_name strColumnValue=null
strColumnName = _id strColumnValue=1
strColumnName = type strColumnValue=2
strColumnName = _sync_dirty strColumnValue=1
strColumnName = starred strColumnValue=0
4.其他数据库
//Available Uri string
content://contacts/people //本地联系人列表信息
content://contacts/phones //本地联系人列表信息
content://call_log/calls/ //本地通话记录
content://mms 彩信
content://mms-sms/threadID
content://mms-sms/conversations
content://mms-sms/messages/byphone
content://mms-sms/undelivered
content://mms-sms/draft
String strUriInbox = "content://sms/inbox"; //SMS_INBOX:1
String strUriFailed = "content://sms/failed"; //SMS_FAILED:2
String strUriQueued = "content://sms/queued"; //SMS_QUEUED:3
String strUriSent = "content://sms/sent"; //SMS_SENT:4
String strUriDraft = "content://sms/draft"; //SMS_DRAFT:5
String strUriOutbox = "content://sms/outbox"; //SMS_OUTBOX:6
String strUriUndelivered = "content://sms/undelivered"; //SMS_UNDELIVERED
String strUriAll = "content://sms/all"; //SMS_ALL
String strUriConversations= "content://sms/conversations";//you can delete one conversation by thread_id
String strUriAll = "content://sms" //you can delete one message by _id
五、其他方法
1.获取联系人头像代码
//获取联系人头像
Uri peopleUri = Uri.parse( "content://contacts/people/"+contactItem.getId() );
Bitmap bitmap = People.loadContactPhoto(m_Context, peopleUri, R.drawable.ic_contact_picture, null);
2.编辑已经存在的联系人跳转到系统编辑界面
public boolean editExitedContact(Context context, String contactId)
{
try
{
Uri editContact = null;
editContact = ContentUris.withAppendedId(People.CONTENT_URI, Integer.parseInt(contactId));
Intent insertIntent = new Intent(Intent.ACTION_EDIT, editContact);
Activity activity = (Activity) context;
activity.startActivityForResult(insertIntent, Constants.REQUEST_GET_CONTACT_INFO);
}
catch (Exception e)
{
return false;
}
return true;
}
3.跳转到浏览器
public static void skipUrl(Context from,String url)
{
Uri uri = Uri.parse(url);
Intent intent = new Intent(Intent.ACTION_VIEW, uri);
from.startActivity(intent);
}
4.拨打电话
* 直接拨打一个电话,号码为callNumber
* isAction true=直接播出,false=调用拨打界面
if( isAction )
{
action=Intent.ACTION_CALL; //直接播出
}
else
{
action=Intent.ACTION_DIAL; //调用界面
}
Intent intent = new Intent(action, Uri.parse("tel://" + callNumber));
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(intent);
5.复制文本
private void copy2ClipboardManager(String text)
{
ClipboardManager clipboard = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
clipboard.setText( text );
}