Android: 读取短信

读取短信本身没什么难度,仅仅是读取SQLite数据库而已。
[code]
public Uri SMS_INBOX = Uri.parse("content://sms/inbox");
private void fillListView() {
ListView view = (ListView) findViewById(R.id.sms_list);
ArrayList<HashMap<String, String>> list = readAllSMS();
SimpleAdapter listItemAdapter = new SimpleAdapter(this, list,
android.R.layout.simple_list_item_2,
new String[] {"addr","body"},
new int[] {android.R.id.text1, android.R.id.text2}
);
view.setAdapter(listItemAdapter);
}

private ArrayList<HashMap<String, String>> readAllSMS() {
Cursor cursor = managedQuery(SMS_INBOX, new String[] { "address", "person", "body" },
null, null, null );
ArrayList<HashMap<String, String>> list = new ArrayList<HashMap<String, String>> ();
if(cursor.moveToFirst()) {
int addrIdx = cursor.getColumnIndex("address");
int personIdx = cursor.getColumnIndex("person");
int bodyIdx = cursor.getColumnIndex("body");
do {
String addr = cursor.getString(addrIdx);
String person = cursor.getString(personIdx);
String body = cursor.getString(bodyIdx);

HashMap<String, String> item = new HashMap<String, String>();
item.put("addr", addr);
item.put("person", person);
item.put("body", body);
list.add(item);
} while(cursor.moveToNext());
}
return list;
}
[/code]
Activity::managedQuery函数基本上是一个接收SQL查询的接口,参数分别为:
[code]
Parameters
uri The URI of the content provider to query.
projection List of columns to return.
selection SQL WHERE clause.
selectionArgs The arguments to selection, if any ?s are pesent
sortOrder SQL ORDER BY clause.
[/code]
要读取短信,需要加入权限:
[code]
<uses-permission android:name="android.permission.READ_SMS"></uses-permission>
[/code]
关于content://sms/inbox表,大致包含的域有:
_id | 短消息序号 如100
thread_id | 对话的序号 如100
address | 发件人地址,手机号.如+8613811810000
person | 发件人,返回一个数字就是联系人列表里的序号,陌生人为null
date | 日期 long型。如1256539465022
protocol | 协议 0 SMS_RPOTO, 1 MMS_PROTO
read | 是否阅读 0未读, 1已读
status | 状态 -1接收,0 complete, 64 pending, 128 failed
type | 类型 1是接收到的,2是已发出
body | 短消息内容
service_center | 短信服务中心号码编号。如+8613800755500

关于短信相关的应用,大致还包括:监听短信数据库(可用于监听短信的到来)、发送短信。使用起来基本上还算简单。



12.16.2010 updated

上面罗列了短信表的字段名,但是没有给出数据类型。在调用Cursor.getString时,该函数会将对应的值转换为字符串(如果不是字符串的话)。要查看SMS表的字段,可以用DDMS把/data/data/com.android.providers.telephony/databases/mmssms.db这个文件,即数据库文件导出,然后找一个SQLite数据库的浏览软件,即可获取出。

sms表大部分都是INTEGER类型,对应到JAVA里也就是long型数据。基本上我只关注以下字段:
[code]
public String mAddress;
public String mBody;
public String mSubject;
public long mID;
public long mThreadID;
public long mDate;
public long mRead;
public long mPerson;
[/code]

person字段取出的值如果该短信是联系人发来的,则指定了联系人表里_id字段的值,例如1、2、3,否则就是0。所以,我们可以通过继续查询联系人数据库表里的内容来取得该短信是谁发来的:
[code]
class ContactItem {
public String mName;
}

ContactItem getContact(Activity activity, final SMSItem sms) {
if(sms.mPerson == 0) return null;
Cursor cur = activity.managedQuery(ContactsContract.Contacts.CONTENT_URI,
new String[] {PhoneLookup.DISPLAY_NAME},
" _id=?",
new String[] {String.valueOf(sms.mPerson)}, null);
if(cur != null &&
cur.moveToFirst()) {
int idx = cur.getColumnIndex(PhoneLookup.DISPLAY_NAME);
ContactItem item = new ContactItem();
item.mName = cur.getString(idx);
return item;
}
return null;
}
[/code]

以上代码可能会有BUG,因为在我的手机上测试,moveToFirst经常会失败,继续person字段非0,也取不出联系人信息。这个问题改日再研究。

放上我的测试程序
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
智慧校园整体解决方案是响应国家教育信息化政策,结合教育改革和技术创新的产物。该方案以物联网、大数据、人工智能和移动互联技术为基础,旨在打造一个安全、高效、互动且环保的教育环境。方案强调从数字化校园向智慧校园的转变,通过自动数据采集、智能分析和按需服务,实现校园业务的智能化管理。 方案的总体设计原则包括应用至上、分层设计和互联互通,确保系统能够满足不同用户角色的需求,并实现数据和资源的整合与共享。框架设计涵盖了校园安全、管理、教学、环境等多个方面,构建了一个全面的校园应用生态系统。这包括智慧安全系统、校园身份识别、智能排课及选课系统、智慧学习系统、精品录播教室方案等,以支持个性化学习和教学评估。 建设内容突出了智慧安全和智慧管理的重要性。智慧安全管理通过分布式录播系统和紧急预案一键启动功能,增强校园安全预警和事件响应能力。智慧管理系统则利用物联网技术,实现人员和设备的智能管理,提高校园运营效率。 智慧教学部分,方案提供了智慧学习系统和精品录播教室方案,支持专业级学习硬件和智能化网络管理,促进个性化学习和教学资源的高效利用。同时,教学质量评估中心和资源应用平台的建设,旨在提升教学评估的科学性和教育资源的共享性。 智慧环境建设则侧重于基于物联网的设备管理,通过智慧教室管理系统实现教室环境的智能控制和能效管理,打造绿色、节能的校园环境。电子班牌和校园信息发布系统的建设,将作为智慧校园的核心和入口,提供教务、一卡通、图书馆等系统的集成信息。 总体而言,智慧校园整体解决方案通过集成先进技术,不仅提升了校园的信息化水平,而且优化了教学和管理流程,为学生、教师和家长提供了更加便捷、个性化的教育体验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值