访问短信内容需要配置的权限:
<uses-permission android:name
=
"android.permission.RECEIVE_SMS"/>
<uses-permission android:name="android.permission.READ_SMS" />
--Heart-result--:{"code":400,"message":"Access token deny"}
第一步:继承BroadcastReceiver,并重写onReceive()方法。
public class IncomingSMSReceiver extends BroadcastReceiver {
@Override public void onReceive(Context context, Intent intent) {
}
}
第二步:订阅感兴趣的广播Intent,订阅方法有两种:
第一种:使用代码进行订阅
<!-- android.provider.Telephony.SMS_RECEIVED 是短信广播-- >
IntentFilter filter = new IntentFilter("android.provider.Telephony.SMS_RECEIVED");
IncomingSMSReceiver receiver = new IncomingSMSReceiver();
registerReceiver(receiver, filter);
第二种:在AndroidManifest.xml文件中的<application>节点里进行订阅:
<receiver android:name=".IncomingSMSReceiver">
<intent-filter>
<action android:name="android.provider.Telephony.SMS_RECEIVED"/>
</intent-filter>
</receiver>
方式一:通过广播监听短信消息
(注意:这种方式只对新收到的短消息有效,运行代码,并不会读取收件箱中已读或未读的消息,只有当收到新来的短消息时,才会执行onChange方法)
缺点:通过设置priority的数值,其实有时是不管用的,现在在一些定制的系统或是有安全软件的情况下,往往短消息都被截取到,并被干掉。
方式二:通过短信数据库获取短信内容
新起一个线程进行读取短信
number:106901407187 body:您提交了重置应用rkwatch的用户密码,验证码:808220,请妥善保管,并及时提交重置密码。【rkwatch】 time:1455801191000
substring(int1,int2)取原字符串中从左往右第int1到int2个字符组成的字符串
protocol:协议0 SMS_RPOTO短信,1 MMS_PROTO彩信
content://sms/ 所有短信
content://sms/inbox 收件箱
content://sms/sent 已发送
content://sms/draft 草稿
content://sms/outbox 发件箱
content://sms/failed 发送失败
content://sms/queued 待发送列表
观察者模式实现短信内容读取:
private SmsObserver smsObserver;
smsObserver = new SmsObserver(ResetPwd.this,mHandler);
getContentResolver().registerContentObserver(SMS_INBOX, true,smsObserver);
class
SmsObserver
extends
ContentObserver {
public SmsObserver(Context context, Handler handler) {
super(handler);
}
@Override
public void onChange(boolean selfChange) {
super.onChange(selfChange);
//每当有新短信到来时,使用我们获取短消息的方法
getSmsFromPhone();
}
}
public
void
getSmsFromPhone() {
ContentResolver cr = getContentResolver();
String[] projection = new String[] { "body" };//"_id", "address", "person",, "date", "type
String where = " date > "
+ (System.currentTimeMillis() - 60*1000);
Cursor cur = cr.query(SMS_INBOX, projection, where, null, "date desc");
//查询参数 条件 where group by order by
if (null == cur)
return;
if (cur.moveToNext()) {
// String number = cur.getString(cur.getColumnIndex("address"));
//手机号 使用时需要在
projection初始化才行
// String name = cur.getString(cur.getColumnIndex("person"));//联系人姓名列表
String body = cur.getString(cur.getColumnIndex("body"));
Log.i("lzx","--body-"+body+"-subString-"+body.substring(25,31));
mvalidcode.setText(body.substring(25,31));
}
}