Android采取BroadcastReceiver方式自动获取验证码
Android自动获取验证码的两种方式分别是BroadcastReceiver及ContentObserver,两种方式都需要进行注册、取消注册两个步骤
记得添加权限,本文先介绍其中一种。
<uses-permissionandroid:name="android.permission.RECEIVE_SMS"/>
<uses-permissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permissionandroid:name="android.permission.READ_SMS"/>
方式一:BroadcastReceiver自定义广播
/**
*Createdbyweifeiyangon2016/7/290029.
*/
importandroid.annotation.TargetApi;
importandroid.content.BroadcastReceiver;
importandroid.content.Context;
importandroid.content.Intent;
importandroid.content.SharedPreferences;
importandroid.os.Build;
importandroid.telephony.SmsMessage;
importandroid.util.Log;
/**
*短信监听
*
*@author
*/
publicclassSMSBroadcastReceiverextendsBroadcastReceiver{
privatestaticMessageListenermMessageListener;
publicstaticfinalStringSMS_RECEIVED_ACTION="android.provider.Telephony.SMS_RECEIVED";//只要注册声明权限即可收到、阻断
@TargetApi(Build.VERSION_CODES.M)
@Override
publicvoidonReceive(Contextcontext,Intentintent){
if(intent.getAction().equals(SMS_RECEIVED_ACTION)){
//获得短信数据
Object[]pdus=(Object[])intent.getExtras().get("pdus");
//短信的类型,GSM与CDMA短信的解码方式不同
Stringformat=intent.getStringExtra("format");
if(null!=pdus){
for(Objectpdu:pdus){
Log.e("pdu","format"+format);
//23以上版本显示createFromPdu过时,多加一个format参数即可
SmsMessagesmsMessage=SmsMessage.createFromPdu((byte[])pdu,format);
//发送号码-可以过滤需要读取的短信的发送号码
Stringsender=smsMessage.getDisplayOriginatingAddress();
//短信内容
Stringcontent=smsMessage.getDisplayMessageBody();
if(content.contains("你从服务器上获取到的验证码")){
mMessageListener.onReceived(content);
abortBroadcast();//中断广播的继续传递,防止优先级低的获取到
}
}
}
}
}
//回调接口
publicinterfaceMessageListener{
publicvoidonReceived(Stringmessage);
}
publicvoidsetOnReceivedMessageListener(MessageListenermessageListener){
this.mMessageListener=messageListener;
}
}
其中关于format的解释如下,3GPP与3GPP2扫盲
3GPP
    3GPP是针对GSM手机,扩展名为.3gp。第三代合作伙伴计划(3rdGenerationPartnershipProject,即3GPP)是一个成立于1998年12月的标准化机构。目前其成员包括欧洲的ETSI、日本的ARIB和TTC、中国的CCSA、韩国的TTA和北美的ATIS。
   3GPP的目标是在ITU的IMT-2000计划范围内制订和实现全球性的(第三代)行动电话系统规范。它致力于GSM到UMTS(WCDMA)的演化,虽然GSM到WCDMA空中接口差别很大,但是其核心网采用了GPRS的框架,因此仍然保持延续性。
3GPP2
  3GPP2是针对CDMA手机,扩展名为.3g2。第三代合作伙伴计划2(3rdGenerationPartnershipProject2,即3GPP2)建立于1998年12月,成员包括:TIA(北美)、CCSA(中国)、ARIB/TTC(日本)和TTA(韩国)。
   3GPP2致力于使ITU的IMT-2000计划中的(3G)行动电话系统规范在全球的发展,实际上它是从2G的CDMAOne或者IS-95发展而来的CDMA2000标准体系的标准化机构,它受到拥有多项CDMA关键技术专利的高通公司的较多支持。
   3GPP和3GPP2两者实际上存在一定竞争关系,3GPP2致力于以IS-95(在北美和韩国应用广泛的CDMA标准,联通CDMA与之兼容)向3G过渡,和高通公司关系更加紧密。与之对应的3GPP致力于从GSM向WCDMA(UMTS)过渡,因此两个机构存在一定竞争。
广播有了后就可以使用了,在activity或者fragment的onCreate方法中调用initSMSBroadcastReceiver()进行注册,在onDestroy()中通过
//注销短信监听广播
this.unregisterReceiver(mSMSBroadcastReceiver);取消注册
/**
*初始化短信监听广播
*/
privatevoidinitSMSBroadcastReceiver(){
//生成广播处理
mSMSBroadcastReceiver=newSMSBroadcastReceiver(mContent);
//实例化过滤器并设置要过滤的广播
IntentFilterintentFilter=newIntentFilter(SMSBroadcastReceiver.SMS_RECEIVED_ACTION);
//优先级最高
intentFilter.setPriority(Integer.MAX_VALUE);
//注册广播
this.registerReceiver(mSMSBroadcastReceiver,intentFilter);
mSMSBroadcastReceiver.setOnReceivedMessageListener(newSMSBroadcastReceiver.MessageListener(){
@Override
publicvoidonReceived(Stringmessage){
TLog.error("message"+message);
Stringcode=ReadSmsContent.getDynamicPassword(message);
seCodeEditText.setText(code);
}
});
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。