项目需要,我在网上查了些资料,把自动获取短信验证码的功能实现了,自己记性不好,写此博客以便日后查询
第一种实现方式,用监听广播的形式实现(此方法兼容性不好,有部分手机不能自动填充)
首先实现一个广播监听器:
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.telephony.SmsMessage;
/**
* 短信监听
* @author
*/
public class SMSReceiver extends BroadcastReceiver {
private static MessageListener mMessageListener;
public static final String SMS_RECEIVED_ACTION = "android.provider.Telephony.SMS_RECEIVED";
@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();// 短信内容
//我们公司的短信内容模板如下:"【XXXX】您正在发起提现申请,验证码:539611(为了您的帐号安全,请勿将验证码告知他人)"
if( content.indexOf("XXXX") != -1){//短信内容中存在XXXX标记
int index = content.indexOf("验证码:");
index += 4;
mMessageListener.onReceived( content.substring( index, index+6 ) );
//abortBroadcast();//中断广播
}
}
}
}
// 回调接口
public interface MessageListener {
public void onReceived(String message);
}
public void setOnReceivedMessageListener(MessageListener messageListener) {
this.mMessageListener = messageListener;
}
}需要添加权限:
<uses-permission android:name="android.permission.RECEIVE_SMS"></uses-permission>
<uses-permission android:name="android.permission.READ_SMS"/>在需要监听的地方注册监听器:
import android.app.Activity;
import android.content.IntentFilter;
import android.os.Bundle;
import android.widget.EditText;
public class MainActivity extends Activity {
EditText et;
private SMSReceiver mSMSReceiver;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
et = (EditText) findViewById(R.id.editText1);
// 生成广播处理
mSMSReceiver = new SMSReceiver();
// 实例化过滤器并设置要过滤的广播
IntentFilter intentFilter = new IntentFilter(SMSReceiver.SMS_RECEIVED_ACTION);
intentFilter.setPriority(Integer.MAX_VALUE);
// 注册广播
this.registerReceiver(mSMSReceiver, intentFilter);
mSMSReceiver.setOnReceivedMessageListener(new SMSReceiver.MessageListener() {
@Override
public void onReceived(String message) {
et.setText(message);
}
});
}
@Override
protected void onDestroy() {
super.onDestroy();
// 注销短信监听广播
this.unregisterReceiver(mSMSReceiver);
}
}
第二种实现方式,通过观察短信数据的变化实现
首先实现一个观察者类
public class SmsObserver extends ContentObserver {
Handler handler = null;
public SmsObserver(Context context, Handler handler) {
super(handler);
this.handler = handler;
}
@Override
public void onChange(boolean selfChange) {
super.onChange(selfChange);
//有短信来时,发送消息通知activity
Message message = handler.obtainMessage();
message.arg1 = Contants.SMS_HANDLER_MSG;
handler.sendMessage(message);
}
}
需要添加权限:
<uses-permission android:name="android.permission.RECEIVE_SMS"></uses-permission>
<uses-permission android:name="android.permission.READ_SMS"/>需要自动填充的activitypublic class MainActivity extends Activity {
EditText et;
/**短信数据观察者*/
private SmsObserver smsObserver = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
et = (EditText) findViewById(R.id.editText1);
smsObserver = new SmsObserver(getApplicationContext(),smsHandler);
//注册SmsObserver
getContentResolver().registerContentObserver(SMS_INBOX, true, smsObserver);
}
private Uri SMS_INBOX = Uri.parse("content://sms/");
/**收到新短信时用来查找短信内容并自动填充验证码*/
public Handler smsHandler = new Handler() {
public void handleMessage(Message msg) {
//Contants.SMS_HANDLER_MSG 为在别处定义的静态常量
if( msg.arg1 == Contants.SMS_HANDLER_MSG ){
ContentResolver cr = getContentResolver();
String[] projection = new String[] { "body","address","person"};// "_id", "address",
// "person",, "date",// "type
String where = " 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 body = cur.getString(cur.getColumnIndex("body"));
if( body.indexOf("XXXX") != -1){//短信内容中存在XXXX标记,根据自己项目的情况而定
int index = body.indexOf("验证码:");
index += 4;
String message = body.substring( index, index+6 );
//判断截取的是否都是数字,防止将来短信模板变化了把错误的字符填充在验证码输入框
Pattern pattern = Pattern.compile("[0-9]{6}");
Matcher matcher = pattern.matcher(message);
if (matcher.find()) {
et.setText(message);//填充验证码
}
}
}
}
}
};
}

1340

被折叠的 条评论
为什么被折叠?



