SMS broadcast receivers don’t work after phone restart

2

We are trying to build our autoresponder app with SDK 26 as a target version.

We have 2 PhoneStateReceivers in our app (see code below).

Also we are requesting permissions:

android.permission.READ_SMS
android.permission.READ_PHONE_STATE 

and user accept it.

But after phone restart and before the user unlocks the device (lock screen) both SMS broadcast receivers don’t work.

Relevant AndroidManifest.xml part:

<receiver android:name="com.lemi.callsautoresponder.callreceiver.DynamicPhoneStateReceiver" android:directBootAware="true" android:enabled="true" android:exported="true" />
<receiver android:name="com.lemi.callsautoresponder.callreceiver.PhoneStateReceiver" android:directBootAware="true" android:enabled="true" android:exported="true">
          <intent-filter android:priority="2147483647">
              <action android:name="android.intent.action.PHONE_STATE"/>
              <action android:name="android.provider.Telephony.SMS_DELIVER"/>
              <action android:name="android.provider.Telephony.SMS_RECEIVED"/>
          </intent-filter>
          <intent-filter android:priority="2147483647">
              <action android:name="android.provider.Telephony.GSM_SMS_RECEIVED"/>
              <category android:name="android.intent.category.DEFAULT"/>
          </intent-filter>
          <intent-filter android:priority="2147483647">                 
              <action android:name="android.provider.Telephony.WAP_PUSH_RECEIVED"/>
              <data android:mimeType="application/vnd.wap.sic"/>
          </intent-filter>        
</receiver>

Relevant part in Application.java

public void registerPhoneStateReceiver() {
   Log.i(TAG, "register PhoneState receiver");
   _phoneReceiver = new DynamicPhoneStateReceiver();
   IntentFilter intentFilter1 = new IntentFilter();
   //intentFilter.addAction(PhoneStateReceiver.SMS_RECEIVED);
   intentFilter1.addAction(TelephonyManager.ACTION_PHONE_STATE_CHANGED);
   intentFilter1.addAction("android.intent.action.BOOT_COMPLETED");
   intentFilter1.setPriority(0x7fffffff);
   intentFilter1.addCategory("android.intent.category.DEFAULT");
   appContext.registerReceiver(_phoneReceiver, intentFilter1);

       IntentFilter intentFilter2 = new IntentFilter("android.provider.Telephony.SMS_RECEIVED");
       intentFilter2.setPriority(0x7fffffff);
       intentFilter2.addCategory("android.intent.category.DEFAULT");
       appContext.registerReceiver(_phoneReceiver, intentFilter2, "android.permission.BROADCAST_SMS", null);

       IntentFilter intentFilter3 = new IntentFilter("android.provider.Telephony.GSM_SMS_RECEIVED");
       intentFilter3.setPriority(0x7fffffff);
       intentFilter3.addCategory("android.intent.category.DEFAULT");
       appContext.registerReceiver(_phoneReceiver, intentFilter3, "android.permission.BROADCAST_SMS", null);

}

public class PhoneStateReceiver extends BroadcastReceiver {

  @Override
  public void onReceive(Context context, Intent intent) {

    Log.info(TAG, "received sms");

  }
}

public class DynamicPhoneStateReceiver extends BroadcastReceiver { 

  @Override
  public void onReceive(Context context, Intent intent) {

    Log.info(TAG, "received sms");

  }
}
java
android
android-intent
asked on Stack Overflow Jan 14, 2018 by M.Gin • edited Jan 14, 2018 by Gholamali-Irani

2 Answers

0

You have to add the below permission in AndroidManifest.xml file.

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />

You have to register a receiver for boot completed with two actions.

LOCKED_BOOT_COMPLETED action for Nougat and upper devices.

BOOT_COMPLETED action for Below Nougat devices.

<receiver android:name=".BootCompletedReceiver">
    <intent-filter>
        <action android:name="android.intent.action.LOCKED_BOOT_COMPLETED" />
        <action android:name="android.intent.action.BOOT_COMPLETED"/>
    </intent-filter>
 </receiver>

This BootCompletedReceiver will fire when the phone reboots. Within this BootCompletedReceiver class, you have to register all of your Broadcast Receivers programmatically. So that, all the broadcast receivers start working.

answered on Stack Overflow Jan 14, 2018 by Avijit Karmakar • edited Jan 14, 2018 by Avijit Karmakar
0

AndroidManifest.xml add this line into intent filter.

<receiver android:name=".MyReceiver" android:enabled="true" android:exported="false">
        <intent-filter>
            <action android:name="android.intent.action.BOOT_COMPLETED"/>
        </intent-filter>
    </receiver>
answered on Stack Overflow Jan 14, 2018 by Mortuza Shahariar

User contributions licensed under CC BY-SA 3.0