标签:
第一种是通过BroadcastReciver
<uses-permission android:name="android.permission.RECEIVE_SMS"/> <!-- 拦截短信(就是接受短些的权限) --> <receiver android:name="com.demo.artshell.broadcastreceiverdemo.InterceptReceiver"> <!-- 这里没有设置android:enable和android:exported属性,<a href="http://developer.android.com/guide/topics/manifest/receiver-element.html" target="_blank" rel="nofollow">参考官方文档</a> --> <!--这里的优先级为1000,假定你手机中没有安装其他第三方短信拦截软件,如360等,否则其他第三方软件拦截权限过高导致你都应用程序拦截不到短信--> <intent-filter android:priority="1000"> <action android:name="android.provider.Telephony.SMS_RECEIVED"/> </intent-filter> </receiver
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.telephony.SmsMessage;
import android.util.Log;
import android.widget.Toast;
import java.text.SimpleDateFormat;
import java.util.Date;
public class InterceptReceiver extends BroadcastReceiver {
public static final String TAG = "InterceptReceiver";
public static final String ACTION_SMS_RECEIVED = "android.provider.Telephony.SMS_RECEIVED";
public InterceptReceiver() {}
@Override
public void onReceive(Context context, Intent intent) {
Log.i(TAG,"---------------InterceptReceiver onReceive()----------------");
if (ACTION_SMS_RECEIVED.equals(intent.getAction())) {
Bundle carryContent = intent.getExtras();
if (carryContent != null) {
StringBuilder sb = new StringBuilder();
// 通过pdus获取接收到的所有短信息,获取短信内容
Object[] pdus = (Object[]) carryContent.get("pdus");
// 构建短信对象数组
SmsMessage[] mges = new SmsMessage[pdus.length];
for (int i = 0, len = pdus.length; i < len; i++) {
// 获取单条短信内容,以pdu格式存,并生成短信对象
mges[i] = SmsMessage.createFromPdu((byte[]) pdus[i]);
}
for (SmsMessage mge : mges) {
sb.append("短信来自:" ).append(mge.getDisplayOriginatingAddress()).append("\n")
.append("短信内容:").append(mge.getMessageBody()).append("\n");
Date sendDate = new Date(mge.getTimestampMillis());
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
sb.append("短信发送时间:").append(format.format(sendDate));
}
Log.i(TAG,sb.toString()); // 打印日志记录
Toast.makeText(context,sb.toString(),Toast.LENGTH_LONG).show();
this.abortBroadcast(); // 不再往下传播
}
}
}
}
第二种通过ContentObserver
content://sms/inbox 收件箱
content://sms/sent 已发送
content://sms/draft 草稿
content://sms/outbox 发件箱
content://sms/failed 发送失败
content://sms/queued 待发送列表
private SmsObserver smsObserver;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.app_login);
smsObserver = new SmsObserver(this, null);
getContentResolver().registerContentObserver(SMS_INBOX, true,
smsObserver);
}
protected void onstop()
{
super.onstop();
//必须解除注册,否则Activity不能销毁
getContentResolver().unregisterContentObserver(smsObserver);
}
class SmsObserver extends ContentObserver {
public SmsObserver(Context context, Handler handler) {
super(handler);
}
@Override
public void onChange(boolean selfChange) {
super.onChange(selfChange);
//每当有新短信到来时,使用我们获取短消息的方法
getSmsFromPhone();
}
}
查询数据库
private Uri SMS_INBOX = Uri.parse("content://sms/inbox");
public void getSmsFromPhone() {
ContentResolver cr = getContentResolver();
String[] projection = new String[] { "body" };//"_id", "address", "person",, "date", "type
String where = " address = ‘1066321332‘ AND date > "
+ (System.currentTimeMillis() - 10 * 60 * 1000);
Cursor cur = cr.query(SMS_INBOX, projection, where, null, "date desc");
if (null == cur)
return;
if (cur.moveToNext()) {
String number = cur.getString(cur.getColumnIndex("address"));//手机号
String name = cur.getString(cur.getColumnIndex("person"));//联系人姓名列表
String body = cur.getString(cur.getColumnIndex("body"));
//这里我是要获取自己短信服务号码中的验证码~~
Pattern pattern = Pattern.compile(" [a-zA-Z0-9]{10}");
Matcher matcher = pattern.matcher(body);
if (matcher.find()) {
String res = matcher.group().substring(1, 11);
mobileText.setText(res);
}
}
}
sms主要结构:
_id:短信序号,如100 thread_id:对话的序号,如100,与同一个手机号互发的短信,其序号是相同的 address:发件人地址,即手机号,如+86138138000 person:发件人,如果发件人在通讯录中则为具体姓名,陌生人为null date:日期,long型,如1346988516,可以对日期显示格式进行设置 protocol:协议0SMS_RPOTO短信,1MMS_PROTO彩信 read:是否阅读0未读,1已读 status:短信状态-1接收,0complete,64pending,128failed type:短信类型1是接收到的,2是已发出 body:短信具体内容 service_center:短信服务中心号码编号,如+8613800755500
Android4.4方案有些问题,看这里
------------------------------------------------
推荐博客:
标签:
原文地址:http://my.oschina.net/ososchina/blog/501874