第一步:短信广播接收器
public class SMSReceiver extends BroadcastReceiver{
public static final String SMS_RECEIVED_ACTION = "android.provider.Telephony.SMS_RECEIVED";
private MessageListener mMessageListener;
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(SMS_RECEIVED_ACTION)) {
Object[] pdus = (Object[]) intent.getExtras().get("pdus");
for(Object pdu:pdus) {
SmsMessage smsMessage = SmsMessage.createFromPdu((byte [])pdu);
String sender = smsMessage.getDisplayOriginatingAddress(); //短信发送者
//短信内容
String content = smsMessage.getDisplayMessageBody();
long date = smsMessage.getTimestampMillis();
Date tiemDate = new Date(date);
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String time = simpleDateFormat.format(tiemDate); //短信发送时间
/*
* 在此可以通过发送的号码和发送的内容以及发送时间来筛选要获取的手机号
* 一般发送验证码都会带有产品标识,通过标识来获取
* 例如:
*/
if(content.contains("【手机淘宝】")){
mMessageListener.onReceived(content);
}
// abortBroadcast(); //不要加这句,因为获取自动获取手机短信的权限是最大值,如果被我获取到了,那么有的手机的短信箱就会收不到了
}
}
}
//回调接口
public interface MessageListener {
public void onReceived(String message);
}
public void setOnReceivedMessageListener(MessageListener messageListener) {
this.mMessageListener = messageListener;
}
}
第二步:在清单配置文件中加入访问权限和注册广播接收器
<pre name="code" class="java"><!-- 读取短信验证码 -->
<receiver android:name="com.example.verifycode.SMSReceiver" android:exported="false">
<intent-filter android:priority="2147483647">
<action android:name="android.provider.Telephony.SMS_RECEIVED" />
</intent-filter>
</receiver>
</application>
<uses-permission android:name="android.permission.READ_SMS" />
<uses-permission android:name="android.permission.WRITE_SMS" />
<uses-permission android:name="android.permission.SEND_SMS" />
<uses-permission android:name="android.permission.RECEIVE_SMS" />
第三步:在activity中写逻辑代码
public class MainActivity extends Activity {
private SMSReceiver mSMSReceiver;
private int second = 0;
private Timer timer=null;
private TimerTask task=null;
private String code;
private TextView getCodeTv;
private EditText codeEt;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
getCodeTv=(TextView) findViewById(R.id.getCodeTv);
codeEt=(EditText) findViewById(R.id.codeEt);
getCodeTv.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
//调用获取验证码的接口
//获取成功之后
getCodeOnClick();
}
});
}
/*
* 截取短信中的验证码(这里不是取的六位数字,而是取到数字组,然后取组里的一个)
* 如,你收到的短信:【手机淘宝】:您的验证码是 845938,如需退订请回复0000.
*/
private String getVerifyCode(String smsContent) {
Pattern numberPattern = Pattern.compile("[0-9\\.]+");
Matcher m = numberPattern.matcher(smsContent);
String verifyCode = "";
List<String> codes=new ArrayList<String>();
while (m.find()) {
codes.add(m.group());
}
if(codes.size()!=0){
verifyCode=codes.get(0);
}
return verifyCode;
}
/*
* 自动获取短信验证码并且自动填写
*/
private void getCodeOnClick() {
// 生成广播处理
mSMSReceiver = new SMSReceiver();
// 实例化过滤器并设置要过滤的广播
IntentFilter intentFilter = new IntentFilter(
SMSReceiver.SMS_RECEIVED_ACTION);
intentFilter.setPriority(Integer.MAX_VALUE);
// 注册广播
registerReceiver(mSMSReceiver, intentFilter);
try {
mSMSReceiver
.setOnReceivedMessageListener(new SMSReceiver.MessageListener() {
@Override
public void onReceived(String message) {
if (message.contains("【***】")) {
code = getVerifyCode( message);
}
try {
if (code != null) {
codeEt.setText(message);
}
} catch (Exception e) {
// TODO: handle exception
}
}
});
} catch (Exception e) {
// TODO: handle exception
}
timer = new Timer();
// 启动计时器
second = 90;
task = new TimerTask() {
@Override
public void run() {
second--;
runOnUiThread(new Runnable() {
@Override
public void run() {
getCodeTv.setBackgroundColor(Color.parseColor("#583945"));
getCodeTv.setText(second + "秒后获取");
getCodeTv.setEnabled(false);
if (second <= 0) {
getCodeTv
.setBackgroundColor(Color.parseColor("#123456"));
getCodeTv.setText("获取验证码");
getCodeTv.setEnabled(true);
if (timer != null) {
timer.cancel();
timer = null;
task = null;
}
}
}
});
}
};
timer.schedule(task, 20, 1000);
}
}