Osheep

时光不回头,当下最重要。

BroadcastReceiver的一次实践-自动填充验证码

用广播接受者实现自动填充验证码功能

public class SMSReceiver extends BroadcastReceiver {
    //短信回调接口
    private static MessageListener mMessageListener;
    //这个是收到短信的广播action,我怎么知道是哪个action,百度啊
    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();
                //过滤发送者
                if ("10086".equals(sender)){
                    //短信内容
                    String content = smsMessage.getDisplayMessageBody();
                    mMessageListener.onReceived(content);
                }

            }
        }

    }
    //回调接口
    public interface MessageListener {
        void onReceived(String message);
    }

    public void setOnReceivedMessageListener(MessageListener messageListener) {
        this.mMessageListener = messageListener;
    }

}

广播接受者可以在清单文件注册,也可以在代码中动态注册,这里我们选择动态注册,因为我们不需要短信的广播接受者一直运行,只需要在相应的页面运行,接收短信就行.
在这里我们自定义了一个接口MessageListener,该接口就是用来回调短信内容的,我们在需要短信的页面,比如登录页面设置这个监听,就可以获取到短信内容了.

然后看看怎么使用的:

这里我是在fragment中使用的
 @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        receiver = new SMSReceiver();
        //实例化过滤器并设置要过滤的广播
        IntentFilter intentFilter = new IntentFilter(ACTION);
        intentFilter.setPriority(Integer.MAX_VALUE);
        //注册广播
        getActivity().registerReceiver(receiver, intentFilter);
        receiver.setOnReceivedMessageListener(new SMSReceiver.MessageListener() {
            @Override
            public void onReceived(String message) {
                if (message.contains("XXX")) {
                    processMessage(message);
                }
            }
        });
    }

    //具体的处理逻辑根据要求来做
    private void processMessage(String message) {
        //根据短信内容截取验证码
        et_code.setText(message.substring(7, 11));
    }

最后不要忘了注销广播接受者

 @Override
    public void onDestroy() {
        super.onDestroy();
        getActivity().unregisterReceiver(receiver);
    }
点赞