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");
}
}
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.
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>
User contributions licensed under CC BY-SA 3.0