只读取 OTP 的短信

Read sms only for OTP

在我的 android 应用程序中,我从短信中实现了自动填充 OTP,我从中学到了 link http://androiddhina.blogspot.in/2015/06/reading-incoming-message-automatically-to-verify-OTP.html

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

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

试试这个。

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 后取消注册。

编码愉快。

您可以随时启用和禁用接收器。尝试以下操作,

用于启用接收器

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

现在有其他选项可以自动读取 OTP 短信,您的应用程序只读取您的 OTP 短信,不需要用户授予任何权限。

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

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

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

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

2。在 SmsManager class 中使用 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。