仅为OTP

时间:2016-07-27 05:30:32

标签: android broadcastreceiver

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

我怀疑是BroadcastReceiver读取用户收到的每个短信,我们可以阻止这个吗?我需要在特定时间读取短信例如:只有在用户点击发送OTP按钮后才能停止读取短信。

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

3 个答案:

答案 0 :(得分: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后注册。

快乐编码。

答案 1 :(得分:1)

您可以随时启用和禁用接收器。请尝试以下方法,

用于启用接收器

class DefaultTest{  
int id;  
String name;  

void display(){System.out.println(id+" "+name);}  

public static void main(String args[]){  
DefaultTest s1=new DefaultTest();  
DefaultTest s2=new DefaultTest();  
s1.display();  
s2.display();  
}  
}  

用于解除接收器

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

答案 2 :(得分:1)

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

<强> 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,截至目前。