我已经基于this和this等示例在 Xamarin Android 上实现了SMS Retriever。一切正常,除了我假设被BroadcastReceiver类拦截的消息(见下文)也显示在Messages应用程序中(显示 SMS 消息的位置)。
- 我将Attributes与BroadcastReceiver类(见下文)一起使用,而不是在AndroidManifest.xml中执行等效操作。
SmsRetriever 对象在MainActivity Create()
var smsRetriever = SmsRetriever.GetClient(this.ApplicationContext);
方法中初始化并激活为smsRetriever.StartSmsRetriever();
我的应用程序正在使用Twilio的可编程 SMS API 发送 OTP 代码,该代码以新行上的 App Hash 字符串终止,如 SMS Retriever API 所指定的那样。除了消息应用程序中显示的 SMS 消息外,这按预期工作。
我还使用另一部手机发送代码,它的工作方式与上面的 Twilio 服务器完全相同。
问题:消息是否按预期显示在消息应用程序中,因此是不可避免的,还是我错过了在消息应用程序中抑制 SMS 消息的内容?
我假设检测到 App Hash String 的 SMS Retriever API只会将 SMS 消息转发到 BroadcastReceiver 而不会转发到Messages应用程序(充其量在此处显示毫无意义)。
[BroadcastReceiver(Enabled = true, Exported = true)] [IntentFilter(new[] { SmsRetriever.SmsRetrievedAction })]
public class SmsBroadcastReceiver : BroadcastReceiver
{
public SmsBroadcastReceiver() { }
public override void OnReceive(Context context, Intent intent)
{
if (intent.Action != SmsRetriever.SmsRetrievedAction) return;
var extrasBundleundle = intent.Extras;
if (extrasBundleundle == null) return;
var status = (Statuses)extrasBundleundle.Get(SmsRetriever.ExtraStatus);
switch (status.StatusCode)
{
case CommonStatusCodes.Success:
// Get SMS message contents
var messageContent = (string)extrasBundleundle.Get(SmsRetriever.ExtraSmsMessage);
// Extract one-time code from the message and complete verification
// by sending the code back to your server.
...
break;
case CommonStatusCodes.Timeout:
...
break;
case CommonStatusCodes.NetworkError:
...
break;
case CommonStatusCodes.Interrupted:
...
break;
case CommonStatusCodes.InternalError:
...
break;
default:
...
break;
}
}