欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android采取BroadcastReceiver方式自动获取验证码

程序员文章站 2024-03-06 17:52:32
android 自动获取验证码的两种方式分别是broadcastreceiver及contentobserver,两种方式都需要进行注册、取消注册两个步骤 记得添加权限...

android 自动获取验证码的两种方式分别是broadcastreceiver及contentobserver,两种方式都需要进行注册、取消注册两个步骤
记得添加权限,本文先介绍其中一种。

<uses-permission android:name="android.permission.receive_sms"/>
<uses-permission android:name="android.permission.write_external_storage"/>
<uses-permission android:name="android.permission.read_sms"/>

方式一:broadcastreceiver 自定义广播

/**
 * created by weifeiyang on 2016/7/29 0029.
 */

import android.annotation.targetapi;
import android.content.broadcastreceiver;
import android.content.context;
import android.content.intent;
import android.content.sharedpreferences;
import android.os.build;
import android.telephony.smsmessage;
import android.util.log;

/**
 * 短信监听
 *
 * @author
 */
public class smsbroadcastreceiver extends broadcastreceiver {

  private static messagelistener mmessagelistener;
  public static final string sms_received_action = "android.provider.telephony.sms_received";//只要注册声明权限即可收到、阻断

  @targetapi(build.version_codes.m)
  @override
  public void onreceive(context context, intent intent) {
    if (intent.getaction().equals(sms_received_action)) {
      //获得短信数据
      object[] pdus = (object[]) intent.getextras().get("pdus");
      //短信的类型, gsm与cdma短信的解码方式不同
      string format = intent.getstringextra("format");

      if (null != pdus) {
        for (object pdu : pdus) {
          log.e("pdu", "format" + format);
          //23以上版本显示 createfrompdu过时,多加一个format参数即可
          smsmessage smsmessage = smsmessage.createfrompdu((byte[]) pdu, format);
          //发送号码-可以过滤需要读取的短信的发送号码
          string sender = smsmessage.getdisplayoriginatingaddress();
          //短信内容
          string content = smsmessage.getdisplaymessagebody();
          if (content.contains("你从服务器上获取到的验证码")){
            mmessagelistener.onreceived(content);
            abortbroadcast();//中断广播的继续传递,防止优先级低的获取到
          }
        }
      }

    }

  }

  //回调接口
  public interface messagelistener {
    public void onreceived(string message);
  }

  public void setonreceivedmessagelistener(messagelistener messagelistener) {
    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);取消注册

/**
   * 初始化短信监听广播
   */
  private void initsmsbroadcastreceiver() {
    //生成广播处理
    msmsbroadcastreceiver = new smsbroadcastreceiver(mcontent);
    //实例化过滤器并设置要过滤的广播
    intentfilter intentfilter = new intentfilter(smsbroadcastreceiver.sms_received_action);
    //优先级最高
    intentfilter.setpriority(integer.max_value);
    //注册广播
    this.registerreceiver(msmsbroadcastreceiver, intentfilter);
    msmsbroadcastreceiver.setonreceivedmessagelistener(new smsbroadcastreceiver.messagelistener() {
      @override
      public void onreceived(string message) {
        tlog.error("message" + message);
        string code = readsmscontent.getdynamicpassword(message);
        secodeedittext.settext(code);
      }
    });
  }

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。