PhoneStateListener перестает работать через некоторое время - PullRequest
0 голосов
/ 05 июня 2019

У меня есть служба переднего плана, где я регистрирую слушателей для двух сим-карт, и все работает нормально, но только в течение некоторого времени.Через несколько часов MultiSimListener прекращает получать трансляции для первого или второго сим-слота.Я думал, что это вызвано режимом дремоты, поэтому я включил его с помощью adb, но безрезультатно - приложение работало как надо.

Протестировано на Samsung S10E с android 9.

Есть идеи, чтоэто причина?

class AppService : Service() {
    private lateinit var multiSimListener: MutableList<MultiSimListener>
    private lateinit var telephonyManagerSub: MutableList<TelephonyManager>

    ...

    private fun myStartForegroundService() {

        ...

        val defaultTelephonyManager = getSystemService(Context.TELEPHONY_SERVICE) as TelephonyManager
        val subscriptionManager = getSystemService(Context.TELEPHONY_SUBSCRIPTION_SERVICE) as SubscriptionManager
        var i = 0
        telephonyManagerSub = mutableListOf()
        multiSimListener = mutableListOf()
        for (subscriptionInfo in subscriptionManager.activeSubscriptionInfoList) {
            telephonyManagerSub.add(defaultTelephonyManager.createForSubscriptionId(subscriptionInfo.subscriptionId))
            multiSimListener.add(MultiSimListener(subscriptionInfo, telephonyManagerSub[i]))
            telephonyManagerSub[i].listen(multiSimListener[i], PhoneStateListener.LISTEN_CALL_STATE)
            Log.i(TAG, "Listening for calls on subscription $subscriptionInfo")
            telephonyManagerSub[i].listen(multiSimListener[i], PhoneStateListener.LISTEN_CALL_STATE)
            i++
        }

        ...

        // Create notification, etc.

public class MultiSimListener extends PhoneStateListener {

    private final SubscriptionInfo subscriptionInfo;
    private final TelephonyManager telephonyManagerSub;

    public MultiSimListener(SubscriptionInfo subscriptionInfo, TelephonyManager telephonyManagerSub) {
        super();
        this.subscriptionInfo = subscriptionInfo;
        this.telephonyManagerSub = telephonyManagerSub;
    }

    @Override
    public void onCallStateChanged(int state, String incomingNumber) {
        super.onCallStateChanged(state, incomingNumber);
        switch(state){
            case TelephonyManager.CALL_STATE_RINGING:
                Log.i(TAG, "Incoming call on SIM " + subscriptionInfo.getSimSlotIndex() + " from " + incomingNumber + ", call state=" + telephonyManagerSub.getCallState());

                CurrentSIMCard.setSim(subscriptionInfo.getSimSlotIndex());

                break;
            case TelephonyManager.CALL_STATE_OFFHOOK:
                break;
            case TelephonyManager.CALL_STATE_IDLE:
                break;

        }
    };
}
...