gpt4 book ai didi

android - 使用双 SIM 卡功能时如何获取 PhoneStateListener

转载 作者:行者123 更新时间:2023-12-02 21:02:10 26 4
gpt4 key购买 nike

所以我目前正在 Android 中为双 SIM 卡设备实现调用转移功能。为了读取 SIM 卡调用转接的当前状态(启用/禁用),我执行以下操作:

  1. 我创建一个 TelephonyManager 对象:

val telephonyManager = getSystemService(TELEPHONY_SERVICE) 作为 TelephonyManager

  • 我创建一个 PhoneStateListener 对象并重写 onCallForwardingIndicatorChanged 方法:

    val myPhoneStateListener = object: PhoneStateListener() {
    override fun onCallForwardingIndicatorChanged(isCallForwardingEnabled: Boolean) {
    if(isCallForwardingEnabled) println("Call forwarding enabled!")
    else println("Call forwarding disabled!")
    }
    }
  • 我注册了PhoneStateListener:

  • telephonyManager.listen(myPhoneStateListener, LISTEN_CALL_FORWARDING_INDICATOR)

    这对于主(第一张)SIM 卡来说效果非常好。

    但我在对第二张 SIM 卡执行同样的操作时遇到困难。我正在尝试这样做:

    1. 我使用 SubscriptionManager 对象来检索第二张 SIM 卡的 subscriptionId:

      val subscriptionManager = getSystemService(TELEPHONY_SUBSCRIPTION_SERVICE) as SubscriptionManager
      val subscriptionIdOfSimCard2 = subscriptionManager.getActiveSubscriptionInfoForSimSlotIndex(1).subscriptionId
    2. 我为第二张 SIM 卡创建一个单独的 TelephonyManager,并使用正确的 subscriptionId:

      val secondTelephonyManager = (getSystemService(TELEPHONY_SERVICE) as TelephonyManager).createForSubscriptionId(subscriptionIdOfSimCard2)
    3. 我创建了第二个 PhoneStateListener,就像第一个 SIM 卡的那样,我们将其命名为 mySecondPhoneStateListener 并将其注册到第二个 TelephonyManager :

      secondTelephonyManager.listen(mySecondPhoneStateListener, LISTEN_CALL_FORWARDING_INDICATOR)

    现在的问题是,在 mySecondPhoneStateListener 中,我没有收到第二张 SIM 卡的回调,但仍然收到第一张主要卡的回调。在深入研究 Android 源代码后,我发现了原因:在 TelephonyManagerlisten(PhoneStateListenerlistener, int events) 方法中,使用了错误的 subscriptionId,即不是 TelephonyManager 中设置的,而是 PhoneStateListener 对象中设置的,默认为第一张 SIM 卡的 subscriptionId:

    public void listen(PhoneStateListener listener, int events) {
    if (mContext == null) return;
    try {
    Boolean notifyNow = (getITelephony() != null);
    sRegistry.listenForSubscriber(listener.mSubId, */ HERE: listener.mSubId is used instead of this.mSubId */
    getOpPackageName(), listener.callback, events, notifyNow);
    } catch (RemoteException ex) {
    // system process dead
    } catch (NullPointerException ex) {
    // system process dead
    }
    }

    这个问题可以通过为 PhoneStateListener 对象设置正确的 subscriptionId 来解决,但是适当的构造函数被隐藏了:

    /**
    * Create a PhoneStateListener for the Phone using the specified subscription.
    * This class requires Looper.myLooper() not return null. To supply your
    * own non-null Looper use PhoneStateListener(int subId, Looper looper) below.
    * @hide */<-- HIDDEN, NOT ACCESSIBLE*/
    */
    public PhoneStateListener(int subId) {
    this(subId, Looper.myLooper());
    }

    我能够通过反射“解决”这个问题,方法是将 PhoneStateListener 对象的 mSubId 字段设置为第二张 SIM 卡的相应 subscriptionId。

    但是必须有更好的方法来做到这一点,我错过了什么吗?

    最佳答案

    我用 Listeners 制作了简单的 ArrayList,它对我来说很好用(顺便说一句,它是 Kotlin)

    在我的 Activity 中:

    override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.sim_selector)
    checkForForwarding()
    }

    fun getSimsCount(): Int {
    val subscriptionManager = SubscriptionManager.from(this)
    val activeSubscriptionInfoList = subscriptionManager.activeSubscriptionInfoList
    return activeSubscriptionInfoList.size
    }

    class SimForwardListeners{
    var subscriptionId: Int = 0
    lateinit var manager: TelephonyManager
    lateinit var phoneStateListener: MyPhoneStateListener
    }

    private val simsForwardListeners: ArrayList<SimForwardListeners> = arrayListOf()

    fun checkForForwarding() {
    val subscriptionManager = getSystemService(TELEPHONY_SUBSCRIPTION_SERVICE) as SubscriptionManager

    for (slotIndex in 0 until getSimsCount()) {
    val z = SimForwardListeners()
    z.phoneStateListener = MyPhoneStateListener(slotIndex)
    z.phoneStateListener.setView(this)
    z.subscriptionId = subscriptionManager.getActiveSubscriptionInfoForSimSlotIndex(slotIndex).subscriptionId
    z.manager = (getSystemService(TELEPHONY_SERVICE) as TelephonyManager).createForSubscriptionId(z.subscriptionId)
    z.manager.listen(z.phoneStateListener, PhoneStateListener.LISTEN_CALL_FORWARDING_INDICATOR)
    simsForwardListeners.add(z)
    }
    }

    关于android - 使用双 SIM 卡功能时如何获取 PhoneStateListener,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47352840/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com