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

   public static void requestPermissionForReadSMS(Fragment fragment) {
    //        if (fragment.shouldShowRequestPermissionRationale(Manifest.permission.READ_SMS)) {
    //            Helpers.showRequestPermissionAlertDialog(fragment, fragment.getString(R.string.read_sms_permission), fragment.getString(R.string.permission_request));

    //        } else {
            fragment.requestPermissions(new String[]{Manifest.permission.RECEIVE_SMS},
                    Constants.READ_SMS_PERMISSION);
   // }

        }

For me this Works:

private int MY_PERMISSIONS_REQUEST_SMS_RECEIVE = 10;
ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.RECEIVE_SMS},
        MY_PERMISSIONS_REQUEST_SMS_RECEIVE);

Mention that above code in your main activity after permission granted. After that override this :

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] 
            permissions, @NonNull int[] grantResults) {
            super.onRequestPermissionsResult(requestCode, permissions, grantResults);
            if (requestCode == MY_PERMISSIONS_REQUEST_SMS_RECEIVE) {
                Log.d("TAG", "My permission request sms received successfully");
            }
 }

thats all. So now no need to Turned SMS permission off and on after some seconds manually.


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