`
kevinlynx
  • 浏览: 82970 次
  • 性别: Icon_minigender_1
  • 来自: 成都
文章分类
社区版块
存档分类
最新评论

Android: 读取短信

阅读更多
读取短信本身没什么难度,仅仅是读取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获取手机短信

    下面将详细介绍如何在Android中获取短信。 一、权限配置 在AndroidManifest.xml文件中,你需要添加以下权限来访问短信: ```xml &lt;uses-permission android:name="android.permission.READ_SMS" /&gt; ...

    android 获取手机短信内容并及时刷新短信

    `cursor`对象将包含所有短信的记录,你可以通过遍历它来获取短信内容,例如短信的发送者、接收者、时间、内容等字段。 接着,我们讨论如何实现实时刷新短信内容。Android提供了BroadcastReceiver,可以监听系统广播...

    读取android手机内所有短信

    在Android平台上,获取手机内的所有短信是一项常见的任务,特别是在开发涉及短信功能的应用程序时。本文将详细介绍如何在Android中读取短信,以及涉及到的相关知识点。 首先,为了读取短信,我们需要使用Android...

    《深入理解Android:Telephony原理剖析与最佳实践》迷你书

    2. **TelephonyManager**:这是Android SDK提供的一个系统服务,开发者可以通过它获取到手机的SIM卡信息、运营商信息、网络状态等。 3. **RIL (Radio Interface Layer)**:位于Android系统和基带处理器之间,作为...

    深入理解Android:Telephony原理剖析与最佳实践

    Telephony是Android系统的核心组件之一,负责处理手机的通话、短信等功能。此书涵盖了从基础概念到高级技术的广泛内容,对于希望在Android通信领域深耕的人来说,是一份不可多得的资源。 首先,Telephony模块主要...

    Android即时读取短信内容

    在`onReceive()`方法中,通过`pdus`参数获取短信数据,并使用`SmsMessage`类解析: ```java SmsMessage[] messages = Telephony.Sms.Intents.getMessagesFromIntent(intent); for (SmsMessage smsMessage : ...

    Android: 开发短信程序列表界面(QuickContactBadge/ListView混用)

    7. **数据获取**:从数据库或其他数据源获取短信数据,并更新适配器,从而刷新`ListView` 的显示。 通过以上步骤,我们可以构建一个功能完备且易于使用的短信程序列表界面。`QuickContactBadge` 提供了直观的联系人...

    详解Android短信的发送和广播接收实现短信的监听

    开发者可以在该方法中获取短信内容,然后进行相应的处理。onReceive()方法的代码结构通常如下: public class SMSBroadcastReceiver extends BroadcastReceiver { @Override public void onReceive(Context ...

    android:scheme 通过uri跳转到APP应用指定Activity

    在Android开发中,`android:scheme` 是一个关键的概念,用于构建自定义URL协议,使得外部应用或系统可以通过特定的URI来启动我们的应用程序中的特定Activity。这个特性在很多场景下非常有用,比如分享链接、广告点击...

    获取Android手机中所有短信的实现代码

    以上就是从给定的代码中解析出的Android获取短信的主要知识点,包括Content Resolver、Content Provider Uri、查询操作、Cursor使用以及数据处理等。这些知识对于开发Android应用,特别是涉及到读取或管理用户数据的...

    android 获取手机电话号码短信内容

    获取短信内容需要用到`SmsManager`类和`ContentResolver`。同样,你需要在`AndroidManifest.xml`中声明`READ_SMS`权限: ```xml &lt;uses-permission android:name="android.permission.READ_SMS" /&gt; ``` 接着,通过`...

    android获取短信中心号

    在Android系统中,获取短信中心号码是开发过程中可能遇到的需求,这主要涉及到与短信服务相关的API交互。短信中心号码(SMSC,Short Message Service Center)是短信传递过程中的一个重要环节,它负责存储、转发和...

    android 获取短信和通话记录信息

    在Android平台上,获取短信和通话记录信息是开发者常用于实现各种功能,如日志记录、安全监控或备份应用的关键操作。下面将详细讲解如何在Android系统中获取这些数据。 一、获取短信信息 1. 权限声明: 首先,为了...

    Android上监听收到的短信(SMS)

    本文将详细介绍两种主要方法:通过广播监听短信消息和通过短信数据库获取短信内容。 **方式一:通过广播监听短信消息** 在Android系统中,可以通过注册一个BroadcastReceiver来监听系统的Intent,特别是ACTION_SMS...

    Android读取短信和联系人

    以下代码展示了如何获取短信: ```java ContentResolver contentResolver = getContentResolver(); Uri smsUri = Uri.parse("content://sms/inbox"); // 查询收件箱中的短信 Cursor cursor = contentResolver.query...

    Android通讯录姓名手机号获取,打电话发短信功能。

    在Android 6.0(API级别23)及以上版本,系统采用了运行时权限管理,应用程序在运行时需要请求用户授予特定的敏感权限,如读取联系人、拨打电话和发送短信。在项目中,你需要在`AndroidManifest.xml`文件中声明所需...

    Android4.4+短信拦截删除

    在`onReceive`方法中,我们可以获取到短信内容,并根据需求进行处理,比如判断是否拦截或删除。这通常涉及到对`PduBroadcaster`的使用,它能解析接收到的PDU(Protocol Data Unit)数据,转化为`SmsMessage`对象: ...

    Android案例:短信草稿箱。利用数据存储SharedPreferences,实现保存、读取短信

    读取短信草稿时,可以通过键(草稿ID)从SharedPreferences中获取相应的值。如果找到了匹配的键,那么可以反序列化这个值,恢复出完整的短信内容。若草稿ID不存在,说明没有对应的草稿短信。 5. **注意事项** - ...

Global site tag (gtag.js) - Google Analytics