Android接收短信

  既然写了发送短信,那么接收短信肯定也是一定要写的了。

  接收短信主要是广播的接收,每当Andorid接收到一条新短信时都会产生一个广播,我们的程序通过捕获这个广播,就能获取短信了。

  依旧是权限问题:<uses-permission android:name="android.permission.RECEIVE_SMS" />。

  我自己的广播类:

 1 public class myBroadCast extends BroadcastReceiver
 2 {
 3     private String SMS_MSG = "android.provider.Telephony.SMS_RECEIVED";
 4 
 5     @Override
 6     public void onReceive(Context context, Intent intent)
 7     {
 8         if (SMS_MSG.equals(intent.getAction()))
 9         {
10             Object[] msg = (Object[]) intent.getExtras().get("pdus");
11             SmsMessage[] sms = new SmsMessage[msg.length];
12 
13             for (int i = 0; i < msg.length; i++)
14             {
15                 sms[i] = SmsMessage.createFromPdu((byte[]) msg[i]);
16 
17                 String time = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date(sms[i].getTimestampMillis()));
18 
19                 Log.i("信息", "第" + i + "条");
20                 Log.i("信息", "时间:" + time);
21                 Log.i("信息", "发送者:" + sms[i].getOriginatingAddress());
22                 Log.i("信息", "内容:" + sms[i].getMessageBody());
23             }
24         }
25     }
26 }

 

  在注册广播时,需要添加action:

1 <receiver android:name=".myBroadCast" >
2     <intent-filter>
3         <action android:name="android.provider.Telephony.SMS_RECEIVED" />
4     </intent-filter>
5 </receiver>

   上面代码测试的结果是,即使发送者发送的信息过程被拆成了多条发送,接收方依然会把每一条短信都当成单独的短信来对待,i的值永远都是0。

 

  我们除了可以获取当前接收到的短信信息,也可以获取一些已经存在手机中的短信信息,比如说:收件箱,发送箱,草稿箱之类的。

  首先依旧是权限问题,需要添加权限:<uses-permission android:name="android.permission.READ_SMS"/>。添加这个权限之后,我们才能查询SMS收件箱,查询是通过访问URI方式实现的,在这里我只实现了查询收件箱的功能,如果想查询其他,可以通过修改URI来实现。

 1 Uri uri = Uri.parse("content://sms/inbox");
 2 Cursor c = getContentResolver().query(uri, null, null, null, null);
 3 
 4 startManagingCursor(c);
 5 
 6 int columnCount = c.getColumnCount();
 7 
 8 for (c.moveToFirst(); !c.isAfterLast(); c.moveToNext())
 9 {
10     for (int j = 0; j < columnCount; j++)
11     {
12         String name = c.getColumnName(j);
13         String value = c.getString(j);
14         /*因为value有时会是null,为了防止Log类的异常,所以进行字符串拼接处理*/
15         Log.i(name, value + "");
16     }
17     Log.i("", "-------------------偶是分割线------------------------");
18 }

  cursor中共有16个字段,一般我们比较感兴趣的是:

  • address(发送者)
  • date(时间,可以通过new Date(date)的方式获取真正的时间)
  • body(信息内容)
  • read(是否已读,已读值为1,未读值为0)

  下面是SMS文件夹列表以及每一个文件夹的URI:

  • 所有文件夹:content://sms/all
  • 收件箱:content://sms/inbox
  • 已发送:content://sms/sent
  • 草稿:content://sms/draft
  • 发件箱:content://sms/outbox
  • 发送失败:content://sms/failed
  • 队列信息:content://sms/queued
  • 未送达:content://sms/undelivered
  • 对话:content://sms/conversations
posted @ 2012-10-24 14:38  猪圈里的猪  阅读(271)  评论(0编辑  收藏  举报