添加權限
<uses-permission android:name="android.permission.RECEIVE_SMS" /> <!-- 接收短信權限 -->
<uses-permission android:name="android.permission.READ_SMS" /> <!-- 讀取短信權限 -->
Android6.0獲取手機短信動態(tài)權限
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (ContextCompat.checkSelfPermission(getBaseActivity(), Manifest.permission.READ_SMS)
!= PackageManager.PERMISSION_GRANTED)
requestPermissions(new String[]{Manifest.permission.READ_SMS}, 1002);
}
獲取權限回調(diào)
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
switch (requestCode) {
case 1001:
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
}
break;
}
}
讀取短信工具
public class SMSUtils {
private final static String sms = "content://sms/";//所有短信
private final static String inbox = "content://sms/inbox";//收件箱
private final static String sent = "content://sms/sent";//已發(fā)送
private final static String draft = "content://sms/draft";//草稿
private final static String outbox = "content://sms/outbox";//發(fā)件箱
private final static String failed = "content://sms/failed";//發(fā)送失敗
private final static String queued = "content://sms/queued";//待發(fā)送列表
public static List<SMSInfo> smsQuery(Context context) {
List<SMSInfo> smsInfoList = new ArrayList<>();
Uri uri = Uri.parse(sms);
ContentResolver resolver = context.getContentResolver();
String[] projection = new String[]{"address", "body", "date", "type"};
Cursor cursor = resolver.query(uri, projection, null, null, "date desc");
if (cursor != null)
while (cursor.moveToNext()) {
SMSInfo smsInfo = new SMSInfo();
smsInfo.setAddress(cursor.getString(0));
smsInfo.setBody(cursor.getString(1));
smsInfo.setDate(cursor.getString(2));
smsInfo.setType(cursor.getInt(3));
smsInfoList.add(smsInfo);
}
return smsInfoList;
}
}
攔截廣播監(jiān)聽短信
public class SmsReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Bundle bundle = intent.getExtras();
SmsMessage msg = null;
if (null != bundle) {
Object[] smsObj = (Object[]) bundle.get("pdus");
for (Object object : smsObj) {
msg = SmsMessage.createFromPdu((byte[]) object);
Date date = new Date(msg.getTimestampMillis());// 時間
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String receiveTime = format.format(date);
msg.getOriginatingAddress();
msg.getDisplayMessageBody();
msg.getTimestampMillis();
}
}
}
}
注冊廣播
<receiver android:name="sms.SmsReceiver"
android:permission="android.permission.BROADCAST_SMS">
<intent-filter android:priority="2147483647">
<action android:name="android.provider.Telephony.SMS_DELIVER" />
<action android:name="android.provider.Telephony.SMS_RECEIVED" />
</intent-filter>
</receiver>
應用觀察者模式監(jiān)聽短信數(shù)據(jù)庫
public class SMSCodeObserver extends ContentObserver {
private Handler handler;
public SMSCodeObserver(Handler handler) {
super(handler);
this.handler = handler;
}
@Override
public void onChange(boolean selfChange) {
super.onChange(selfChange);
handler.obtainMessage(1, "SMS Received").sendToTarget();
}
}
接收處理發(fā)送的消息
private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case 1:
setSmsCode();
break;
}
}
};
獲取當前短信的驗證碼
private void setSmsCode() {
Cursor cursor = null;
cursor = getBaseActivity().getContentResolver().query(Uri.parse("content://sms/inbox"),
new String[]{"_id", "address", "read", "body", "date"},
null, null, "date desc");
if (cursor != null) {
String body = "";
while (cursor.moveToNext()) {
body = cursor.getString(cursor.getColumnIndex("body"));// 在這里獲取短信信息
long smsDate = Long.parseLong(cursor.getString(cursor.getColumnIndex("date")));
long nowDate = System.currentTimeMillis();
// 如果當前時間和短信時間間隔超過60秒,認為這條短信無效
if (nowDate - smsDate > 60 * 1000) {
break;
}
Pattern pattern = Pattern.compile("\\d{6}");
Matcher matcher = pattern.matcher(body);
if (matcher.find()) {
String smsCodeStr = matcher.group(0);
break;
}
}
}
}