SMS检索API如何检索SMS发件人号码

时间:2019-02-15 04:59:07

标签: android

是否可以获取我在android中收到的短信的手机号码?我们正在尝试通过发送SMS并从运营商处获取用户的手机号码来进行身份验证,但是下一步涉及通过读取SMS进行身份验证。我们面临的问题是,如果我从其他任何移动设备发送相同的消息,则无法验证原始SMS号码。它盲目地阅读SMS。

2 个答案:

答案 0 :(得分:5)

为了避免错误的SMS检索,使用SMS Retriever API获取发件人的手机号码将是一个不错的选择。但是很遗憾,到目前为止,您无法获取使用此API检索的SMS的发件人手机号码。将来的版本中可能会提供此功能。

但是,如果您已经拥有OTP验证机制,则无需担心,因为...

  1. SMS检索器API已经具有某种授权机制,可以减少此类错误的SMS检索案例的可能性。 例如,使用SMS Retrieval API读取的所有SMS都有一个11个字符的哈希字符串,用于标识您的应用。并非所有人都知道您的应用程序的哈希字符串,因此获取未经授权的SMS的可能性非常低。
  2. 即使您收到由未经授权的方发送的虚假短信,您从中获得的OTP也将无效,因此也就没有未经授权的验证的可能性。

奖励

Google还发布了一个名为SMS用户同意API的新API,该API具有通过“一键式”自动填充OTP的功能。幸运的是,该API还提供了发件人的手机号码过滤功能。意思是,如果您的SMS提供商从特定的手机号码向您发送SMS,则可以在代码中进行指定,并且它只会读取从该手机号码收到的SMS。

参考:

SMS检索器API:https://developers.google.com/identity/sms-retriever/overview

SMS用户同意API:https://developers.google.com/identity/sms-retriever/user-consent/overview

答案 1 :(得分:0)

我实际上在我的项目中实现了它。

.xml(清单)中有一个广播接收器->

    android:name=".messaging.SmsReceiver"
    android:enabled="true"
    android:exported="true"
    android:permission="android.permission.BROADCAST_SMS">
    <intent-filter android:priority="999">
        <action android:name="android.provider.Telephony.SMS_RECEIVED"/>
    </intent-filter>
</receiver>

and you can get it doing this in the onReceive method:

String format = "";
List<String> contents = new ArrayList<>();
for (int i = 0; i < pdus.length; i++) {
    SmsMessage message;
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        format = bundle.getString("format");
        message = getFromPdu(pdus, format, i);
    } else {
        message = getFromPdu(pdus, i);
    }
  contents.add(Strings.emptyToNull(CharMatcher.whitespace().trimFrom(message.getMessageBody())));
    sourceNumber = message.getDisplayOriginatingAddress();
}