【问题标题】:How to Filter/Extract Code from SMS (Android)如何从 SMS 中过滤/提取代码 (Android)
【发布时间】:2016-08-29 10:18:15
【问题描述】:

所以我正在开发一个类似 WhatsApp 的验证系统,用户输入通过短信接收的代码,然后将代码发送回服务器..yada yada ..所有基本的东西。

我的困境是我收到并正确阅读了短信。我如何过滤正文,以便它自动将号码(不是电话号码,而是验证码)传递给 editText。我试图避免用户手动输入验证码。让我在下面显示一些代码。

public void processReceive(Context context, Intent intent){

    Bundle bundle = intent.getExtras();
    if(bundle == null){
        return;
    }

    Object[] objectArray = (Object[])bundle.get("pdus");

    for(int i = 0; i < objectArray.length; i++){
        SmsMessage smsMsg = SmsMessage.createFromPdu((byte[])objectArray[i]);
        String smsBody = smsMsg.getMessageBody();

        Toast.makeText(context, smsBody, Toast.LENGTH_SHORT).show();
    }

}

//在上面的代码中,我的广播接收器接收到短信,我可以在吐司中显示正文。短信内容如下:“您的验证码:12345”。

我如何只从短信中获取代码并将其值发送到并像 WhatsApp 一样以编程方式编辑文本。

number = (EditText) findViewById(R.id.number);

谢谢。非常感谢您的意见

【问题讨论】:

  • 如果你有邮件内容,只需获取最后5个字符的子字符串。
  • 我担心超时短信格式可能会改变,验证码的位置也会改变。
  • 您始终可以扫描字符串中的 5 个连续数字。这样,如果验证码移动,您就会被覆盖。但是,如果代码的长度发生变化,这并不包括您。
  • 感谢大家的所有回答,他们也非常棒。我选择了@MedAmine.Rihane 的解决方案,因为它使用起来最简单、最快捷。随着项目的扩展,我将重新审视其他答案。谢谢

标签: java android android-edittext sms


【解决方案1】:

试试这个可能对你有帮助

public static String GENERAL_OTP_TEMPLATE = "Your verification code: (.*).";

SmsMessage[] message = new SmsMessage[objectArray.length];
for (int i = 0; i < objectArray.length; i++) {
    message[i] = SmsMessage.createFromPdu((byte[]) objectArray[i]);

}
Pattern generalOtpPattern = Pattern.compile(GENERAL_OTP_TEMPLATE);
Matcher generalOtpMatcher = generalOtpPattern.matcher(message[0].getMessageBody().toString());

if (generalOtpMatcher.find()) {
       String otp = generalOtpMatcher.group(1);
       number.setText(otp);
}

【讨论】:

  • 查找短信模式并根据该查找码
  • 谢谢,这是一个更好的答案,因为如果它不是像@Med's 那样的预期短信,它不会使应用程序崩溃......
  • wc @MueyiwaMosesIkomi,这是从 SMS 中获取 OTP 的标准方法
  • 我注意到@Abhishek Patel 的一件事,当应用程序是后台并且短信来时,它不会正确复制所有代码。每次错过最后一位数字。我该如何防御。无法判断它是否只是模拟器,或者它会在实时设备上执行此操作。
  • preference 中制作商店代码并使用localbroadcast 进行显示
【解决方案2】:

您可以使用拆分功能来获取您的最后 5 个数字:

String[] splited = body.split(":");
String mylastnum= splited[1];
number.settext(mylastnum); 

希望对您有所帮助!

【讨论】:

    【解决方案3】:
    1. 使用下面提到的代码在 android 清单中注册广播接收器。

      <!-- SMS Receiver -->
      <receiver android:name=".receiver.SmsReceiver">
          <intent-filter android:priority="99999">
              <action android:name="android.provider.Telephony.SMS_RECEIVED"/>
          </intent-filter>
      </receiver>
      
    2. 使用下面提到的代码创建广播接收器。

      @覆盖 public void onReceive(Context context, Intent intent) {

      final Bundle bundle = intent.getExtras();
      try {
          if (bundle != null) {
              Object[] pdusObj = (Object[]) bundle.get("pdus");
              for (Object aPdusObj : pdusObj) {
                  SmsMessage currentMessage = SmsMessage.createFromPdu((byte[]) aPdusObj);
                  String senderAddress = currentMessage.getDisplayOriginatingAddress();
                  String message = currentMessage.getDisplayMessageBody();
      
                  Log.e(TAG, "Received SMS: " + message + ", Sender: " + senderAddress);
      
                  // if the SMS is not from our gateway, ignore the message
                  if (!senderAddress.toLowerCase().contains(Config.SMS_ORIGIN.toLowerCase())) {
                      Log.e(TAG, "SMS is not for our app!");
                      return;
                  }
      
                  // verification code from sms
                  String verificationCode = getVerificationCode(message);
      
                  Log.e(TAG, "OTP received: " + verificationCode);
      
                  Intent hhtpIntent = new Intent(context, HttpService.class);
                  hhtpIntent.putExtra("otp", verificationCode);
                  context.startService(hhtpIntent);
              }
          }
      } catch (Exception e) {
          Log.e(TAG, "Exception: " + e.getMessage());
      }
      

      }

    3. 解析短信验证码。

      私有字符串 getVerificationCode(字符串消息) { 字符串代码=空; int index = message.indexOf(Config.OTP_DELIMITER);

      if (index != -1) {
          int start = index + 2;
          int length = 6;
          code = message.substring(start, start + length);
          return code;
      }
      
      return code;
      

      }

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-03-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-25
      • 2011-08-09
      • 2019-03-23
      相关资源
      最近更新 更多