既然写了发送短信,那么接收短信肯定也是一定要写的了。
接收短信主要是广播的接收,每当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