Я сделал приложение, которое должно регистрировать входящие звонки с других телефонов, и оно должно работать в фоновом режиме.Я создал свой BroadcastReceiver
, где я просто запускаю передний план IntentService
, который должен отправить некоторую информацию на мой сервер.Проблема в том, что широковещательный приемник не всегда срабатывает, когда мое приложение работает в фоновом режиме.Я тестирую это приложение с Android 8 Oreo.Вот часть моего manifest
файла
<receiver
android:name=".receiver.CallReceiver"
android:enabled="true">
<intent-filter android:priority="99">
<action android:name="android.intent.action.PHONE_STATE"/>
</intent-filter>
<intent-filter android:priority="100">
<action android:name="android.intent.action.NEW_OUTGOING_CALL"/>
</intent-filter>
</receiver>
<service
android:name=".ForegrounCustomService"
android:enabled="true"
android:exported="true">
</service>
Вот класс abstarct PhoneCallReceiver
abstract class PhoneCallReceiver: BroadcastReceiver() {
@SuppressLint("MissingPermission")
override fun onReceive(context: Context?, intent: Intent?) {
if (intent == null || context == null) return
if (intent.action != Intent.ACTION_NEW_OUTGOING_CALL) {
val stateString = intent.extras?.getString(TelephonyManager.EXTRA_STATE) ?: return
val number = intent.extras?.getString(TelephonyManager.EXTRA_INCOMING_NUMBER) ?: return
val state = when (stateString) {
TelephonyManager.EXTRA_STATE_IDLE -> TelephonyManager.CALL_STATE_IDLE
TelephonyManager.EXTRA_STATE_OFFHOOK -> TelephonyManager.CALL_STATE_OFFHOOK
TelephonyManager.EXTRA_STATE_RINGING -> TelephonyManager.CALL_STATE_RINGING
else -> TelephonyManager.CALL_STATE_IDLE
}
onCallStateChanged(context, state, number)
}
}
private fun onCallStateChanged(context: Context, state: Int, number: String) {
when (state) {
TelephonyManager.CALL_STATE_RINGING -> isIncommingCall = true
TelephonyManager.CALL_STATE_OFFHOOK -> {
isIncommingCall = lastState == TelephonyManager.CALL_STATE_RINGING
if (isIncommingCall && !SharedPreferencesManager.wasCallAnswered) {
SharedPreferencesManager.wasCallAnswered = true
onIncomingCallAnswered(context, number)
}
}
TelephonyManager.CALL_STATE_IDLE -> {
if (SharedPreferencesManager.wasCallAnswered) {
SharedPreferencesManager.wasCallAnswered = false
onIncomingCallEnded(context, number)
}
}
}
lastState = state
}
protected abstract fun onIncomingCallAnswered(context: Context, number: String)
protected abstract fun onIncomingCallEnded(context: Context, number: String)
companion object {
private var isIncommingCall = false
private var lastState = TelephonyManager.CALL_STATE_IDLE
}
}
и вот CallReceiver
class CallReceiver: PhoneCallReceiver() {
override fun onIncomingCallAnswered(context: Context, number: String) {
ContextCompat.startForegroundService(context, ForegrounCustomService.createIntent(context, number, START))
}
override fun onIncomingCallEnded(context: Context, number: String) {
ContextCompat.startForegroundService(context, ForegrounCustomService.createIntent(context, number, STOP))
}
companion object {
const val START = "start"
const val STOP = "stop"
}
}
Так чего мне не хватает?(Все разрешения предоставлены)