读取短信本身没什么难度,仅仅是读取SQLite数据库而已。
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;
}
Activity::managedQuery函数基本上是一个接收SQL查询的接口,参数分别为:
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.
要读取短信,需要加入权限:
<uses-permission android:name="android.permission.READ_SMS"></uses-permission>
关于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型数据。基本上我只关注以下字段:
public String mAddress;
public String mBody;
public String mSubject;
public long mID;
public long mThreadID;
public long mDate;
public long mRead;
public long mPerson;
person字段取出的值如果该短信是联系人发来的,则指定了联系人表里_id字段的值,例如1、2、3,否则就是0。所以,我们可以通过继续查询联系人数据库表里的内容来取得该短信是谁发来的:
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;
}
以上代码可能会有BUG,因为在我的手机上测试,moveToFirst经常会失败,继续person字段非0,也取不出联系人信息。这个问题改日再研究。
放上我的测试程序
分享到:
相关推荐
Android获取手机短信
及时刷新短信内容,获取手机短信信息。让我可以上传短信给后台
该代码已经通过测试,可直接在模拟器上运行,读取手机内所有短信
获取短信,从本地数据库或SIM卡匹配发件人的姓名 android获取短信并匹配姓名 android获取短信并匹配姓名
android获取短信中心号
主要介绍了获取Android手机中所有短信的实现代码,需要的朋友可以参考下
当我们注册一个app时会有短信发过来,然后把短信直接读取到登录界面的账号和密码。这样用户可以直接点击登录就好。这个Demo是我在准备这个功能时参考网络上的博客写出来的小demo。希望能对大家有所帮助。
利用数据存储的SharedPreferences开发技术,实现了一个简易的短信草稿箱,其功能模块包括保存短信、读取短信等。
Android读取短信和联系人
本篇文章主要介绍了Android MIUI通知类短信权限的坑,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
android读取短信验证码自动填入,简单的实现
当系统收到短信时,会发出一个action名称为android.provider.Telephony.SMS_RECEIVED的广播Intent,该Intent存放了接收到的短信内容,使用名称“pdus”即可从Intent中获取短信内容。最好使用动态注册的方法,去注册...
android中获取手机短信短信和删除短信功能
android 获取手机短信和通话记录信息
该app用于将误删除的短信恢复。以txt的形式保存在手机里
获取手机电话号码和手机短信内容。
Android通讯录管理(获取联系人、通话记录、短信消息),需要的打包带走
用于与博客匹配的资源,简单学习Android 中读取通讯录的操作,方便大家进行学习和思考。仅用于学习参考,谢谢