android 短信管理(获取接受到短信的消息)

这几天在弄短信的东东,主要是想做一个用户使用短信支付的接口,殊不知国内省份不一样,接口众多呀!感叹国家地域的辽阔和房价的高不可攀的矛盾。。。。

接口不是重点,重点是关于获取接受短信的消息,当然最熟悉的还是BroadcastReceiver来监听,这是一般的模式,网上一大把!

其实还有另一种方式,就是观察者模式(其实说是监听更好理解一些),无非是观察(或者说是监听)短信的数据库的变化!这个在android上是支持的,但是要声明获取权限


<uses-permission android:name="android.permission.READ_SMS"/>

<uses-permission android:name="android.permission.WRITE_SMS"/>


下面要做的就是自定义一个观察类,声明它观察的事件


/**
	 * 监听数据库内容改变,根据具体的号码来删除短信
	 */
	private class SMSContent extends ContentObserver
	{
		private Cursor cursor = null;

		public SMSContent(Handler handler)
		{
			super(handler);
			// TODO Auto-generated constructor stub
		}

		/* (non-Javadoc)
		 * @see android.database.ContentObserver#onChange(boolean)
		 */
		@Override
		public void onChange(boolean selfChange)
		{
			// TODO Auto-generated method stub
			super.onChange(selfChange);
			
			System.out.println("Change...");
			
                        /**
                        * 数据库查询,具体各个字段的表示的含义下面有解释
                        */
			cursor = managedQuery(Uri.parse("content://sms/inbox"), 
					new String[]{"_id", "address", "read"}, 
					"address=? and read=?", 
					new String[]{"125201510100x00y", "0"}, 
					"date desc");
			
			if(cursor != null)
			{
				System.out.println(cursor.getCount());;
				ContentValues values = new ContentValues();
				values.put("read", 1);
				cursor.moveToFirst();
				while(cursor.isLast())
				{
					System.out.println(cursor.getString(1));
					getContentResolver().update(Uri.parse("content://sms/inbox"), 
							values, 
							"_id=?", 
							new String[]{"" + cursor.getInt(0)});
					cursor.moveToNext();
				}
			}
		}
		
	}


这个观察类很简单,就是在onChange()方法中写好要过滤到的数据条目(也就是短信)我这里是判断的是来自1252015101006007,并且“未读”(read=0)的短信,我的初衷是将收到的符合上述类型的短信标记为“已读”,可是最后却不能成功,因为我的手机刷的是小米的系统,系统做了深度定制,比较系统的优先级要大于你程序的优先级,所以系统会先处理你收到短信的消息,但是你确实是也可以收到短信的消息的,这个很重要(因为有些省份的短信扣费需要二次确认,所以你要监听你第二条短信收到的消息)。


在任何你想要用到这个观察类的地方,实例化,注册,就ok了。


SMSContent smsContent = new SMSContent(new Handler());
		//注册短信数据库修改监听
		getContentResolver().registerContentObserver(Uri.parse("content://sms/"), 
				true, smsContent);


短信数据库中各字段的含义总结如下:

_id:自增的唯一ID,主键

thread_id:同一号码的短信这个值是相同的

address:发送者的号码

person:发送者在你通讯录中的标记

read:未读和已读(0未读,1已读,上面的例子用到了)

date:日期

status:有4种(发送成功,失败,发送中)

type:收到或者发送的(1收到的,2发送的)

body:短信内容

这个总结网上很多,当然也可以下载一个SQLite Brower自己来看!


PS:我认为小米系统是不能拦截到短信的,不知道高手们有什么高招,望指点!

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值