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

所属分类: 软件编程 / Android 阅读数: 999
收藏 0 赞 0 分享

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);
      }
    });
  }

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

更多精彩内容其他人还在看

老生常谈Android HapticFeedback(震动反馈)

下面小编就为大家带来一篇老生常谈Android HapticFeedback(震动反馈)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
收藏 0 赞 0 分享

详谈OnTouchListener与OnGestureListener的区别

下面小编就为大家带来一篇详谈OnTouchListener与OnGestureListener的区别。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
收藏 0 赞 0 分享

Android仿知乎悬浮功能按钮FloatingActionButton效果

前段时间在看属性动画,恰巧这个按钮的效果可以用属性动画实现,下面通过本文给大家分享adroid仿知乎悬浮功能按钮FloatingActionButton效果,需要的朋友参考下吧
收藏 0 赞 0 分享

解决Android V7后自定义Toolbar、ActionBar左侧有空白问题

这篇文章主要介绍的Android V7后自定义Toolbar、ActionBar左侧有空白问题的解决方法,需要的朋友可以参考下
收藏 0 赞 0 分享

Android常见控件使用详解

这篇文章主要为大家详细介绍了Android常见控件的使用方法,包括ProgressBar进度条控件、AlertDialog对话框控件等,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

Android实现简洁的APP更新dialog数字进度条

这篇文章主要为大家详细介绍了Android实现简洁的APP更新dialog数字进度条,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

Android 判断当前语言环境是否是中文环境

本文主要介绍了Android 判断当前语言环境是否是中文环境的方法。具有很好的参考价值。下面跟着小编一起来看下吧
收藏 0 赞 0 分享

详谈Android中Matrix的set、pre、post的区别

下面小编就为大家带来一篇详谈Android中Matrix的set、pre、post的区别。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
收藏 0 赞 0 分享

Android实现登录界面记住密码的存储

这篇文章主要为大家详细介绍了Android SharedPreferrences实现登录界面记住密码的存储,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

Android 使用SharedPreferrences储存密码登录界面记住密码功能

Android存储方式有很多种,在这里所用的存储方式是SharedPreferrences, 其采用了Map数据结构来存储数据,以键值的方式存储,可以简单的读取与写入,下面通过实例代码给大家讲解下,需要的朋友参考下吧
收藏 0 赞 0 分享
查看更多