读取短信本身没什么难度,仅仅是读取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中获取短信。 一、权限配置 在AndroidManifest.xml文件中,你需要添加以下权限来访问短信: ```xml <uses-permission android:name="android.permission.READ_SMS" /> ...
`cursor`对象将包含所有短信的记录,你可以通过遍历它来获取短信内容,例如短信的发送者、接收者、时间、内容等字段。 接着,我们讨论如何实现实时刷新短信内容。Android提供了BroadcastReceiver,可以监听系统广播...
在Android平台上,获取手机内的所有短信是一项常见的任务,特别是在开发涉及短信功能的应用程序时。本文将详细介绍如何在Android中读取短信,以及涉及到的相关知识点。 首先,为了读取短信,我们需要使用Android...
2. **TelephonyManager**:这是Android SDK提供的一个系统服务,开发者可以通过它获取到手机的SIM卡信息、运营商信息、网络状态等。 3. **RIL (Radio Interface Layer)**:位于Android系统和基带处理器之间,作为...
Telephony是Android系统的核心组件之一,负责处理手机的通话、短信等功能。此书涵盖了从基础概念到高级技术的广泛内容,对于希望在Android通信领域深耕的人来说,是一份不可多得的资源。 首先,Telephony模块主要...
在`onReceive()`方法中,通过`pdus`参数获取短信数据,并使用`SmsMessage`类解析: ```java SmsMessage[] messages = Telephony.Sms.Intents.getMessagesFromIntent(intent); for (SmsMessage smsMessage : ...
7. **数据获取**:从数据库或其他数据源获取短信数据,并更新适配器,从而刷新`ListView` 的显示。 通过以上步骤,我们可以构建一个功能完备且易于使用的短信程序列表界面。`QuickContactBadge` 提供了直观的联系人...
开发者可以在该方法中获取短信内容,然后进行相应的处理。onReceive()方法的代码结构通常如下: public class SMSBroadcastReceiver extends BroadcastReceiver { @Override public void onReceive(Context ...
在Android开发中,`android:scheme` 是一个关键的概念,用于构建自定义URL协议,使得外部应用或系统可以通过特定的URI来启动我们的应用程序中的特定Activity。这个特性在很多场景下非常有用,比如分享链接、广告点击...
以上就是从给定的代码中解析出的Android获取短信的主要知识点,包括Content Resolver、Content Provider Uri、查询操作、Cursor使用以及数据处理等。这些知识对于开发Android应用,特别是涉及到读取或管理用户数据的...
获取短信内容需要用到`SmsManager`类和`ContentResolver`。同样,你需要在`AndroidManifest.xml`中声明`READ_SMS`权限: ```xml <uses-permission android:name="android.permission.READ_SMS" /> ``` 接着,通过`...
在Android系统中,获取短信中心号码是开发过程中可能遇到的需求,这主要涉及到与短信服务相关的API交互。短信中心号码(SMSC,Short Message Service Center)是短信传递过程中的一个重要环节,它负责存储、转发和...
在Android平台上,获取短信和通话记录信息是开发者常用于实现各种功能,如日志记录、安全监控或备份应用的关键操作。下面将详细讲解如何在Android系统中获取这些数据。 一、获取短信信息 1. 权限声明: 首先,为了...
本文将详细介绍两种主要方法:通过广播监听短信消息和通过短信数据库获取短信内容。 **方式一:通过广播监听短信消息** 在Android系统中,可以通过注册一个BroadcastReceiver来监听系统的Intent,特别是ACTION_SMS...
以下代码展示了如何获取短信: ```java ContentResolver contentResolver = getContentResolver(); Uri smsUri = Uri.parse("content://sms/inbox"); // 查询收件箱中的短信 Cursor cursor = contentResolver.query...
在Android 6.0(API级别23)及以上版本,系统采用了运行时权限管理,应用程序在运行时需要请求用户授予特定的敏感权限,如读取联系人、拨打电话和发送短信。在项目中,你需要在`AndroidManifest.xml`文件中声明所需...
在`onReceive`方法中,我们可以获取到短信内容,并根据需求进行处理,比如判断是否拦截或删除。这通常涉及到对`PduBroadcaster`的使用,它能解析接收到的PDU(Protocol Data Unit)数据,转化为`SmsMessage`对象: ...
读取短信草稿时,可以通过键(草稿ID)从SharedPreferences中获取相应的值。如果找到了匹配的键,那么可以反序列化这个值,恢复出完整的短信内容。若草稿ID不存在,说明没有对应的草稿短信。 5. **注意事项** - ...