Приемник вещания не всегда вызывается, когда приложение находится в фоновом режиме - PullRequest
0 голосов
/ 30 декабря 2018

Я сделал приложение, которое должно регистрировать входящие звонки с других телефонов, и оно должно работать в фоновом режиме.Я создал свой 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"
    }
}

Так чего мне не хватает?(Все разрешения предоставлены)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...