Search code examples
androidandroid-broadcastreceiversmsmanager

SMS received broadcastReceiver is not called when app is not running


I am using a broadcastReceiver to listen SMS received even when app is not running. It is working fine on Kitkat even app is removed from recent Apps, But not on Lollipop and higher devices.

In Manifest It is defined like this.

 <receiver
        android:name=".receivers.MxSMSReceiver"
        android:enabled="true"
        android:exported="true"
        android:permission="android.permission.BROADCAST_SMS">
        <intent-filter android:priority="5822">
            <action android:name="android.provider.Telephony.SMS_RECEIVED" />
            <action android:name="android.provider.Telephony.SMS_SENT" />
        </intent-filter>
    </receiver>

Receiver code:

public class MxSMSReceiver extends BroadcastReceiver {
@Override
public void onReceive(final Context context, final Intent intent) {

    if (intent.getAction().equals("android.provider.Telephony.SMS_RECEIVED") || intent.getAction().equals("android.provider.Telephony.SMS_SENT")) {

   }
  }
 }

I don't know what is the problem. Any help is appreciated


Solution

  • Full working demo Runtime Permissions

    Change the permission name which you want to get at runtime.

    private String permission = Manifest.permission.RECEIVE_SMS;

    Those permssions which you want to get at runtime should also be declared in manifest too.

    public class MainActivity extends AppCompatActivity {
    
        private Context context;
        private Button button;
        private static final int REQUEST_RUNTIME_PERMISSION = 123;
        private String permission = Manifest.permission.RECEIVE_SMS;
    
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            button = (Button) findViewById(R.id.button);
            button.setOnClickListener(new View.OnClickListener() {
                @Override
    
                public void onClick(View v) {
                    if (CheckPermission(MainActivity.this, permission)) {
                        // you have permission go ahead
                        YouCanReadContactNow();
                    } else {
                        // you do not have permission go request runtime permissions
                        RequestPermission(MainActivity.this, permission, REQUEST_RUNTIME_PERMISSION);
                    }
                }
            });
        }
    
        private void YouCanReadContactNow() {
        }
    
    
        @Override
        public void onRequestPermissionsResult(int permsRequestCode, String[] permissions, int[] grantResults) {
    
            switch (permsRequestCode) {
                case REQUEST_RUNTIME_PERMISSION: {
                    if (grantResults.length > 0
                            && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                        // you have permission go ahead
                        YouCanReadContactNow();
                    } else {
                        // you do not have permission show toast.
                    }
                    return;
                }
            }
        }
    
        public void RequestPermission(Activity thisActivity, String Permission, int Code) {
            if (ContextCompat.checkSelfPermission(thisActivity,
                    Permission)
                    != PackageManager.PERMISSION_GRANTED) {
                if (ActivityCompat.shouldShowRequestPermissionRationale(thisActivity,
                        Permission)) {
                } else {
                    ActivityCompat.requestPermissions(thisActivity,
                            new String[]{Permission},
                            Code);
                }
            }
        }
    
        public boolean CheckPermission(Context context, String Permission) {
            if (ContextCompat.checkSelfPermission(context,
                    Permission) == PackageManager.PERMISSION_GRANTED) {
                return true;
            } else {
                return false;
            }
        }
    }
    

    layout

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/base"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@color/white"
        android:orientation="horizontal">
    
    
        <Button
            android:id="@+id/button"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentTop="true"
            android:layout_centerHorizontal="true"
            android:layout_margin="10dp"
            android:text="Request contact permissions"
            android:textSize="20dp" />
    
    </RelativeLayout>