监听手机接收短信——模拟获取短信的验证码

Manifest.xml添加相应的权限:

<uses-permission android:name="android.permission.RECEIVE_SMS" />
        <uses-permission android:name="android.permission.READ_SMS" />


创建一个BroadcastReceiver来监听短信提醒


import java.text.SimpleDateFormat;
import java.util.Date;


import android.annotation.SuppressLint;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.telephony.SmsMessage;
import android.util.Log;


public class MessageReceiver extends BroadcastReceiver {


private static OnMessageClickListener mlistener;


public MessageReceiver() {
super();
}


@SuppressLint("SimpleDateFormat")
@Override
public void onReceive(Context context, Intent intent) {


Object[] pdus = (Object[]) intent.getExtras().get("pdus");
for (Object pdu : pdus) {
SmsMessage smsMessage = SmsMessage.createFromPdu((byte[]) pdu);
String sender = smsMessage.getDisplayOriginatingAddress();// 获取发送者地址
String content = smsMessage.getMessageBody();// 获取消息体
long date = smsMessage.getTimestampMillis();// 获取短信时间
Date timeDate = new Date(date);
SimpleDateFormat f = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String str = f.format(timeDate);


Log.i("tag", "短信来自:" + sender);
Log.i("tag", "短信内容:" + content);
Log.i("tag", "短信时间:" + str);


mlistener.OnMessageClick(content, sender, str);
// 过滤信息(如果短信来自5556,不再往下传递,一般此号码可以作为短信平台的号码。)
if ("5556".equals(sender)) {
Log.i("tag", "abort");
abortBroadcast();
}
}
}


// 定义一个回调接口
public interface OnMessageClickListener {
void OnMessageClick(String message, String sender, String time);
}


// 获取监听的实例的方法
@SuppressWarnings("static-access")
public void setOnMessageClickListener(OnMessageClickListener listener) {
this.mlistener = listener;
}
}

Manifest.xml注册

<receiver android:name="com.blhcn.listenermessagedome.receiver.MessageReceiver" >
            <intent-filter android:priority="1000" >
                <action android:name="android.provider.Telephony.SMS_RECEIVED" />
            </intent-filter>
        </receiver>


MainActivity中来展示接收到的一些短信信息

import java.util.regex.Matcher;
import java.util.regex.Pattern;


import com.blhcn.listenermessagedome.receiver.MessageReceiver;
import com.blhcn.listenermessagedome.receiver.MessageReceiver.OnMessageClickListener;


import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.widget.EditText;
import android.widget.TextView;


/**
 * 监听获取短信消息
 * 
 * @author 990
 * 
 */
public class MainActivity extends Activity {


private TextView messageTxtv, messageSender, messageTime;
private EditText pwd;


@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);


initView();
}


/**
* 实例化控件,及把监听到的信息展示再TextView上
*/
private void initView() {
messageTxtv = (TextView) findViewById(R.id.message_txtv);
messageSender = (TextView) findViewById(R.id.message_sender);
messageTime = (TextView) findViewById(R.id.message_time);
pwd = (EditText) findViewById(R.id.pwd_edit);
MessageReceiver mReceiver = new MessageReceiver();
mReceiver.setOnMessageClickListener(new OnMessageClickListener() {


@Override
public void OnMessageClick(String message, String sender,
String time) {


messageSender.setText(sender);
messageTxtv.setText(message);
messageTime.setText(time);


// 获取验证码
pwd.setText("您的验证码是:" + getDynamicPwd(message));
}
});
}


/**
* 截取六位动态码 从字符串中截取连续6位数字组合 ([0-9]{" + 6 + "})截取六位数字 进行前后断言不能出现数字
* 用于从短信中获取动态密码

* @param pwd
* @return
*/
private String getDynamicPwd(String pwd) {


Pattern pattern = Pattern.compile("(?<![0-9])([0-9]{" + 6
+ "})(?![0-9])");
Matcher matcher = pattern.matcher(pwd);
String dPwd = null;
while (matcher.find()) {
Log.i("tag", matcher.group());
dPwd = matcher.group();
}
return dPwd;
}
}

布局文件

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >


    <TextView
        android:id="@+id/message_sender"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginLeft="20dp"
        android:text="联系人" />


    <TextView
        android:id="@+id/message_txtv"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@+id/message_sender"
        android:layout_marginLeft="20dp"
        android:layout_marginTop="20dp"
        android:text="接收到的短信消息" />


    <TextView
        android:id="@+id/message_time"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@+id/message_txtv"
        android:layout_marginLeft="20dp"
        android:layout_marginTop="20dp"
        android:text="消息时间" />


    <EditText
        android:id="@+id/pwd_edit"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_below="@+id/message_time"
        android:layout_marginLeft="20dp"
        android:layout_marginTop="20dp"
        android:text="验证码"
        android:textColor="#00ff00" />


</RelativeLayout>



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值