【问题标题】:Read sms only for OTP仅为 OTP 读取短信
【发布时间】:2017-08-05 01:42:37
【问题描述】:

在我的 android 应用程序中,我正在从 SMS 实现自动填充 OTP,我从这个链接中了解到 http://androiddhina.blogspot.in/2015/06/reading-incoming-message-automatically-to-verify-OTP.html

我的疑问是BroadcastReceiver 会读取用户收到的每条短信,我们可以停止吗?我需要在特定时间阅读短信示例:只有在用户点击发送 OTP 按钮之后,我才应该停止阅读短信。

请帮助我如何在特定时间段内启动和停止BroadcastReceiver

【问题讨论】:

  • 以编程方式注册和注销您的接收器。
  • 您可以在 sen OTP 上注册接收器并在获得 OTP 后取消注册接收器。或者您可以阅读特定号码的短信。
  • 我知道,请提供一些例子以便更好地理解。谢谢你:)
  • 你可以在你的短信上运行一个正则表达式来检查它是否包含短信 otp 并获取它
  • 伙计,我正在阅读每条短信,对吗??看到它有条件读取该 otp 的链接,那不是我的问题我需要停止 BroadcastReceiver @SaravInfern

标签: android broadcastreceiver


【解决方案1】:

试试这个。

private BroadcastReceiver SmsListener = new BroadcastReceiver() {

        @SuppressWarnings("deprecation")
        @Override
        public void onReceive(Context context, Intent intent) {
            if (intent.getAction().equals(
                    "android.provider.Telephony.SMS_RECEIVED")) {
                Bundle bundle = intent.getExtras(); // ---get the SMS message
                                                    // passed in---
                SmsMessage[] msgs = null;
                // String msg_from;
                if (bundle != null) {
                    // ---retrieve the SMS message received---
                    try {
                        Object[] pdus = (Object[]) bundle.get("pdus");
                        msgs = new SmsMessage[pdus.length];
                        for (int i = 0; i < msgs.length; i++) {
                            msgs[i] = SmsMessage
                                    .createFromPdu((byte[]) pdus[i]);
                            // msg_from = msgs[i].getOriginatingAddress();
                            String msgBody = msgs[i].getMessageBody();
                            // do your stuff
                        }
                    } catch (Exception e) {
                        // Log.d("Exception caught",e.getMessage());
                    }
                }
            }
        }
    };

和我一样

@Override
protected void onPause() {
    super.onPause();
    YourActivity.this.unregisterReceiver(SmsListener);
};

@Override
protected void onResume() {
    super.onResume();
    IntentFilter i = new IntentFilter(
            "android.provider.Telephony.SMS_RECEIVED");
    YourActivity.this.registerReceiver(SmsListener, i);
}

但正如其他人建议的那样,您可以在请求 OTP 后注册 BroadcastReceiver 并在获得 OTP 后取消注册。

快乐编码。

【讨论】:

  • 谢谢你,我根据我的使用修改了你的代码:)
【解决方案2】:

您可以随时启用和禁用接收器。试试下面的,

用于启用接收器

public void enableSMSReceiver(Context context){
    ComponentName component = new ComponentName(context, YOUR_RECEIVER.class);
    PackageManager pm = context.getPackageManager();
    pm.setComponentEnabledSetting(
            component,
            PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
            PackageManager.DONT_KILL_APP);
}

用于禁用接收器

public static void disableSMSReceiver(Context context){
ComponentName component = new ComponentName(context, YOUR_RECEIVER.class);
PackageManager pm = context.getPackageManager();
pm.setComponentEnabledSetting(
        component,
        PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
        PackageManager.DONT_KILL_APP);
}

【讨论】:

    【解决方案3】:

    现在还有其他选项可以自动读取 OTP SMS,您的应用仅读取您的 OTP SMS,这不需要用户授予任何权限。

    1.在 Google Play 服务中使用 SMS Retriever API:

    https://developers.google.com/identity/sms-retriever/overview

    https://www.youtube.com/watch?v=jzWYv8y2v1c

    但这需要对 OTP SMS 格式进行一些服务器级别的更改。而且这只适用于安装了 Play 服务的设备。

    2。在 SmsManager 类中使用 createAppSpecificSmsToken(仅限 Android O):

    https://developer.android.com/reference/android/telephony/SmsManager.html#createAppSpecificSmsToken(android.app.PendingIntent

    https://code.tutsplus.com/tutorials/android-o-phone-number-verification-with-sms-token--cms-29141

    到目前为止,这仅适用于 Android O。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-11-01
      • 2020-05-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多