An app I'm working on allows the user to allow the app to read the contents of a confirmation SMS to input the verification code on its own. For all devices using an OS earlier than Oreo (API 26), the implementation of the BroadcastReceiver works correctly and allows a proper reception of the SMS. By this implementation I mean placing the receiver object in the AndroidManifest.
<receiver android:name=".SmsReceiver">
<intent-filter>
<action android:name="android.provider.Telephony.SMS_RECEIVED"/>
</intent-filter>
</receiver>
However, starting with Oreo, one must explicitly register BroadcastReceivers to the appropriate context. I have implemented this as follows:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
smsReceiver = new SmsReceiver();
IntentFilter intentFilter = new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION);
intentFilter.addAction(Telephony.Sms.Intents.DATA_SMS_RECEIVED_ACTION);
this.registerReceiver(smsReceiver, intentFilter);
}
This block of code is executed upon receiving permission for Manifest.permission.READ_SMS. The SmsReceiver class extends BroadcastReceiver and overrides its onReceive() method.
Here, I have several questions:
I have tested this implementation and have set breakpoints on my onReceive() method in my SmsReceiver. When an SMS arrives, the app never enters the onReceive() method. Why can this be?
I instantiated my IntentFilter in the way it is described on the Android Developer website, i.e. with the ConnectivityManager.CONNECTIVITY_ACTION action. I know the SmsReceiver works, because the break point in onReceive() is always hit upon registration of the receiver. However, the action is merely the CONNECTIVITY_ACTION. The SMS_RECEIVED_ACTION is never caught by the receiver. Is it absolutely necessary to instantiate the IntentFilter with this action or can one leave this out?
Is there something else I'm missing that could lead to my receiver not catching the arriving SMS?
The answer given by @rohit sharma worked for me initially, but then i also tested my app on various devices like oneplus,mi,oppo and vivo and found that
1.On vivo,oppo and mi (having miui) devices there is something called as autostart which is disabled by default so the SMS_RECIEVED_ACTION doesnt work (here by work i mean launching the app or running any service in background on sms_recieved) even being whitelisted from the list of recent implicit ban given .
2.On oneplus devices there is battery optimization feature and if your app is listed for battery optimization (which is yes by default) then the SMS_RECIEVED_ACTION will work only when your app is in foreground or background ,if your app is killed or after a phone reboot the broadcast receiver wont work. For the SMS_RECIEVD_ACTION to work you will have to remove the app from the battery optimizatons.For more information on this you can follow this thread here
For me this Works:
Mention that above code in your main activity after permission granted. After that override this :
thats all. So now no need to Turned SMS permission off and on after some seconds manually.
Just add
to the receiver tag in Manifest .
So ideal manifest registered broadcast receiver :-
Previously I was requesting for -Manifest.permission.READ_SMS which didn't worked then I changed the permissions to - Manifest.permission.RECEIVE_SMS then it started working in oreo and I also specified the receiver in manifest I don't know whether that helped or not but this made the day for me