在上一次的学习中,我们读取了手机联系人并将其显示在短信界面上,而接下来,我们将开始读取手机短信了,下面先来看一下最终运行效果图吧。
首先看一下手机短信数据库,访问路径是:/data/data/com.android.providers.telephony/databases/mmssms.db,用SQLiteExpertPers打开后可以看到数据库中的表,下面我们来看一下其中的sms表,threads表和canonical_addresses表。
1.sms表:
thread_id:与threads表的_id相对应
address:短信会话人号码
body:短信内容
person:通过SQLiteExpert工具查看,发现无论是否是联系人该列都为null
contact_name:通过SQLiteExpert工具查看,结果为:号码+空格+联系人名称(若为联系人)
status:-1表示短信已接受
read:0为未读,1为已读
type:1表示收到的短信,通过SQLiteExpert工具查看此数据库时发出的信息type值为6
2.threads表
recipient_ids:指向canonical_addresses表的_id字段,通过canonical_addresses表的address字段
可获取联系人号码
snippest:最后收到/发出的信息
message_count:该会话的消息数量
3.canonical_addresses表
_id:与thread表的recipient_ids相对应
address:电话号码
相对于上一个版本,这次工程新增了SMSInfo类作为短信数据库表对应的实体类,在适配器类MessageListAdapter 中,定义新方法getSMSInfo()来获取sms表中的短信记录,并在 MainActivity中调用该方法。另外,在实际读取短信记录时,发现之前的页面布局显示有问题,如在短信列表页面,当某条短信内容较长时,应该采用单行显示,超过一行的部分应该被隐藏,因此对主布局文件activity_main.xml和列表项布局文件list_item.xml也做了修改,如下文所示。另外,与读取联系人一样,读取短信同样需要AndroidManifest.xml文件中配置手机短信读取权限,在文件中增加如下声明:
<uses-permission android:name="android.permission.READ_SMS"/>
在MessageListAdapter中进行查询时,使用了query方法,我们来看一下这个方法的用法中各参数含义。
query(Uri uri,String[] project,String selection,String selectionArgs,String sortOrder):
uri:要读取数据对应的Uri
projection:需要读取的字段
selection:数据检索的条件
selectionArgs:数据检索条件的参数
sortOrder:对查询结果排序所依据的字段
最后给出程序代码如下:
1.MainActivity.java
<span style="font-size:14px;">package com.example.mymessageproject;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.widget.ListView;
public class MainActivity extends Activity {
private ListView messageListView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
messageListView = (ListView)this.findViewById(R.id.messageListView);
MessageListAdapter adapter =