6

我一直在尝试访问我的安卓双卡手机(品牌是 LKD)上的一些功能。我已经设法通过 java 反射获得 TelephonyManager 和 ITelephony 的功能,并让它们运行。但是我想获得两张 sim 卡的信号强度,我看不到通过反射来做到这一点的方法。我可以通过具有 onSignalStrengthsChanged() 函数的 PhoneStateListener 获得插槽 1 中的第一张 sim 卡。

有没有人对此有一些提示?我从反射中得到的功能:

###stanard methods:###
adjustModemRadioPower - boolean: int, int
adjustModemRadioPowerByBand - boolean: int, int
btSimapApduRequest - int: int, java.lang.String, android.telephony.BtSimapOperResponse
btSimapConnectSIM - int: int, android.telephony.BtSimapOperResponse
btSimapDisconnectSIM - int: 
btSimapPowerOffSIM - int: 
btSimapPowerOnSIM - int: int, android.telephony.BtSimapOperResponse
btSimapResetSIM - int: int, android.telephony.BtSimapOperResponse
disableLocationUpdates - void: 
disableLocationUpdatesGemini - void: int
enableLocationUpdates - void: 
enableLocationUpdatesGemini - void: int
equals - boolean: java.lang.Object
from - class android.telephony.TelephonyManager: android.content.Context
getAllCellInfo - interface java.util.List: 
getCallState - int: 
getCallStateGemini - int: int
getCdmaEriIconIndex - int: 
getCdmaEriIconMode - int: 
getCdmaEriText - class java.lang.String: 
getCellLocation - class android.telephony.CellLocation: 
getCellLocationGemini - class android.telephony.CellLocation: int
getClass - class java.lang.Class: 
getCompleteVoiceMailNumber - class java.lang.String: 
getCurrentPhoneType - int: 
getDataActivity - int: 
getDataState - int: 
getDataStateGemini - int: int
getDefault - class android.telephony.TelephonyManager: 
getDeviceId - class java.lang.String: 
getDeviceIdGemini - class java.lang.String: int
getDeviceSoftwareVersion - class java.lang.String: 
getIccCardType - class java.lang.String: 
getIccCardTypeGemini - class java.lang.String: int
getIsimDomain - class java.lang.String: 
getIsimImpi - class java.lang.String: 
getIsimImpu - class [Ljava.lang.String;: 
getLine1AlphaTag - class java.lang.String: 
getLine1AlphaTagGemini - class java.lang.String: int
getLine1Number - class java.lang.String: 
getLine1NumberGemini - class java.lang.String: int
getLteOnCdmaMode - int: 
getLteOnCdmaModeStatic - int: 
getMaxPdpNum - int: int
getMissedCallCount - int: 
getMobileRevisionAndIMEI - void: int, android.os.Message
getMsisdn - class java.lang.String: 
getNeighboringCellInfo - interface java.util.List: 
getNeighboringCellInfoGemini - interface java.util.List: int
getNetworkClass - int: int
getNetworkCountryIso - class java.lang.String: 
getNetworkCountryIsoGemini - class java.lang.String: int
getNetworkOperator - class java.lang.String: 
getNetworkOperatorGemini - class java.lang.String: int
getNetworkOperatorName - class java.lang.String: 
getNetworkOperatorNameGemini - class java.lang.String: int
getNetworkType - int: 
getNetworkTypeGemini - int: int
getNetworkTypeName - class java.lang.String: 
getNetworkTypeName - class java.lang.String: int
getNetworkTypeNameGemini - class java.lang.String: int
getPhoneType - int: 
getPhoneType - int: int
getPhoneTypeGemini - int: int
getRadioType - int: int
getSN - class java.lang.String: 
getSimCountryIso - class java.lang.String: 
getSimCountryIsoGemini - class java.lang.String: int
getSimOperator - class java.lang.String: 
getSimOperatorGemini - class java.lang.String: int
getSimOperatorName - class java.lang.String: 
getSimOperatorNameGemini - class java.lang.String: int
getSimSerialNumber - class java.lang.String: 
getSimSerialNumberGemini - class java.lang.String: int
getSimState - int: 
getSimStateGemini - int: int
getSmsDefaultSim - int: 
getSpNameInEfSpn - class java.lang.String: 
getSpNameInEfSpnGemini - class java.lang.String: int
getSubscriberId - class java.lang.String: 
getSubscriberIdGemini - class java.lang.String: int
getVoiceMailAlphaTag - class java.lang.String: 
getVoiceMailAlphaTagGemini - class java.lang.String: int
getVoiceMailNumber - class java.lang.String: 
getVoiceMailNumberGemini - class java.lang.String: int
getVoiceMessageCount - int: 
getVoiceMessageCountGemini - int: int
hasIccCard - boolean: 
hasIccCardGemini - boolean: int
hashCode - int: 
isIccCardProviderAsMvno - boolean: 
isIccCardProviderAsMvnoGemini - boolean: int
isNetworkRoaming - boolean: 
isNetworkRoamingGemini - boolean: int
isOperatorMvnoForEfPnn - class java.lang.String: 
isOperatorMvnoForEfPnnGemini - class java.lang.String: int
isOperatorMvnoForImsi - class java.lang.String: 
isOperatorMvnoForImsiGemini - class java.lang.String: int
isSmsCapable - boolean: 
isVoiceCapable - boolean: 
listen - void: android.telephony.PhoneStateListener, int
listenGemini - void: android.telephony.PhoneStateListener, int, int
notify - void: 
notifyAll - void: 
simAuth - class java.lang.String: java.lang.String
simAuthGemini - class java.lang.String: java.lang.String, int
toString - class java.lang.String: 
uSimAuth - class java.lang.String: java.lang.String, java.lang.String
uSimAuthGemini - class java.lang.String: java.lang.String, java.lang.String, int
wait - void: 
wait - void: long
wait - void: long, int

###declared methods###
adjustModemRadioPower - boolean: int, int
adjustModemRadioPowerByBand - boolean: int, int
btSimapApduRequest - int: int, java.lang.String, android.telephony.BtSimapOperResponse
btSimapConnectSIM - int: int, android.telephony.BtSimapOperResponse
btSimapDisconnectSIM - int: 
btSimapPowerOffSIM - int: 
btSimapPowerOnSIM - int: int, android.telephony.BtSimapOperResponse
btSimapResetSIM - int: int, android.telephony.BtSimapOperResponse
disableLocationUpdates - void: 
disableLocationUpdatesGemini - void: int
enableLocationUpdates - void: 
enableLocationUpdatesGemini - void: int
getAllCellInfo - interface java.util.List: 
getCallState - int: 
getCallStateGemini - int: int
getCdmaEriIconIndex - int: 
getCdmaEriIconMode - int: 
getCdmaEriText - class java.lang.String: 
getCellLocation - class android.telephony.CellLocation: 
getCellLocationGemini - class android.telephony.CellLocation: int
getCompleteVoiceMailNumber - class java.lang.String: 
getCurrentPhoneType - int: 
getDataActivity - int: 
getDataState - int: 
getDataStateGemini - int: int
getDeviceId - class java.lang.String: 
getDeviceIdGemini - class java.lang.String: int
getDeviceSoftwareVersion - class java.lang.String: 
getIccCardType - class java.lang.String: 
getIccCardTypeGemini - class java.lang.String: int
getIsimDomain - class java.lang.String: 
getIsimImpi - class java.lang.String: 
getIsimImpu - class [Ljava.lang.String;: 
getLine1AlphaTag - class java.lang.String: 
getLine1AlphaTagGemini - class java.lang.String: int
getLine1Number - class java.lang.String: 
getLine1NumberGemini - class java.lang.String: int
getLteOnCdmaMode - int: 
getMissedCallCount - int: 
getMobileRevisionAndIMEI - void: int, android.os.Message
getMsisdn - class java.lang.String: 
getNeighboringCellInfo - interface java.util.List: 
getNeighboringCellInfoGemini - interface java.util.List: int
getNetworkCountryIso - class java.lang.String: 
getNetworkCountryIsoGemini - class java.lang.String: int
getNetworkOperator - class java.lang.String: 
getNetworkOperatorGemini - class java.lang.String: int
getNetworkOperatorName - class java.lang.String: 
getNetworkOperatorNameGemini - class java.lang.String: int
getNetworkType - int: 
getNetworkTypeGemini - int: int
getNetworkTypeName - class java.lang.String: 
getNetworkTypeNameGemini - class java.lang.String: int
getPhoneType - int: 
getPhoneTypeGemini - int: int
getSN - class java.lang.String: 
getSimCountryIso - class java.lang.String: 
getSimCountryIsoGemini - class java.lang.String: int
getSimOperator - class java.lang.String: 
getSimOperatorGemini - class java.lang.String: int
getSimOperatorName - class java.lang.String: 
getSimOperatorNameGemini - class java.lang.String: int
getSimSerialNumber - class java.lang.String: 
getSimSerialNumberGemini - class java.lang.String: int
getSimState - int: 
getSimStateGemini - int: int
getSmsDefaultSim - int: 
getSpNameInEfSpn - class java.lang.String: 
getSpNameInEfSpnGemini - class java.lang.String: int
getSubscriberId - class java.lang.String: 
getSubscriberIdGemini - class java.lang.String: int
getVoiceMailAlphaTag - class java.lang.String: 
getVoiceMailAlphaTagGemini - class java.lang.String: int
getVoiceMailNumber - class java.lang.String: 
getVoiceMailNumberGemini - class java.lang.String: int
getVoiceMessageCount - int: 
getVoiceMessageCountGemini - int: int
hasIccCard - boolean: 
hasIccCardGemini - boolean: int
isIccCardProviderAsMvno - boolean: 
isIccCardProviderAsMvnoGemini - boolean: int
isNetworkRoaming - boolean: 
isNetworkRoamingGemini - boolean: int
isOperatorMvnoForEfPnn - class java.lang.String: 
isOperatorMvnoForEfPnnGemini - class java.lang.String: int
isOperatorMvnoForImsi - class java.lang.String: 
isOperatorMvnoForImsiGemini - class java.lang.String: int
isSmsCapable - boolean: 
isVoiceCapable - boolean: 
listen - void: android.telephony.PhoneStateListener, int
listenGemini - void: android.telephony.PhoneStateListener, int, int
simAuth - class java.lang.String: java.lang.String
simAuthGemini - class java.lang.String: java.lang.String, int
uSimAuth - class java.lang.String: java.lang.String, java.lang.String
uSimAuthGemini - class java.lang.String: java.lang.String, java.lang.String, int
from - class android.telephony.TelephonyManager: android.content.Context
getDefault - class android.telephony.TelephonyManager: 
getDefaultSim - int: 
getITelephony - interface com.android.internal.telephony.ITelephony: 
getLteOnCdmaModeStatic - int: 
getMaxPdpNum - int: int
getNetworkClass - int: int
getNetworkTypeName - class java.lang.String: int
getPhoneType - int: int
getPhoneTypeFromNetworkType - int: 
getPhoneTypeFromProperty - int: 
getProcCmdLine - class java.lang.String: 
getRadioType - int: int
getSubscriberInfo - interface com.android.internal.telephony.IPhoneSubInfo: 
getSubscriberInfo - interface com.android.internal.telephony.IPhoneSubInfo: int

###ITelephony methods###
adjustModemRadioPower - boolean: int, int
adjustModemRadioPowerByBand - boolean: int, int, int
answerRingingCall - void: 
answerRingingCallGemini - void: int
aquire3GSwitchLock - int: 
asBinder - interface android.os.IBinder: 
btSimapApduRequest - int: int, java.lang.String, android.telephony.BtSimapOperResponse
btSimapConnectSIM - int: int, android.telephony.BtSimapOperResponse
btSimapDisconnectSIM - int: 
btSimapPowerOffSIM - int: 
btSimapPowerOnSIM - int: int, android.telephony.BtSimapOperResponse
btSimapResetSIM - int: int, android.telephony.BtSimapOperResponse
call - void: java.lang.String
callGemini - void: java.lang.String, int
cancelMissedCallsNotification - void: 
cancelMissedCallsNotificationGemini - void: int
cleanupApnTypeGemini - int: java.lang.String, int
closeIccLogicalChannel - boolean: int
closeIccLogicalChannelGemini - boolean: int, int
dial - void: java.lang.String
dialGemini - void: java.lang.String, int
disableApnType - int: java.lang.String
disableApnTypeGemini - int: java.lang.String, int
disableDataConnectivity - boolean: 
disableDataConnectivityGemini - int: int
disableLocationUpdates - void: 
disableLocationUpdatesGemini - void: int
enableApnType - int: java.lang.String
enableApnTypeGemini - int: java.lang.String, int
enableDataConnectivity - boolean: 
enableDataConnectivityGemini - int: int
enableLocationUpdates - void: 
enableLocationUpdatesGemini - void: int
endCall - boolean: 
endCallGemini - boolean: int
equals - boolean: java.lang.Object
get3GCapabilitySIM - int: 
get3GSwitchAllowed3GSlots - int: 
getActivePhoneType - int: 
getActivePhoneTypeGemini - int: int
getAdnStorageInfo - class [I: int
getAllCellInfo - interface java.util.List: 
getCallState - int: 
getCallStateGemini - int: int
getCdmaEriIconIndex - int: 
getCdmaEriIconMode - int: 
getCdmaEriText - class java.lang.String: 
getCellLocation - class android.os.Bundle: 
getCellLocationGemini - class android.os.Bundle: int
getClass - class java.lang.Class: 
getDataActivity - int: 
getDataActivityGemini - int: int
getDataState - int: 
getDataStateGemini - int: int
getGateway - class java.lang.String: java.lang.String
getGatewayGemini - class java.lang.String: java.lang.String, int
getIccATR - class java.lang.String: 
getIccATRGemini - class java.lang.String: int
getIccCardType - class java.lang.String: 
getIccCardTypeGemini - class java.lang.String: int
getInterfaceDescriptor - class java.lang.String: 
getInterfaceName - class java.lang.String: java.lang.String
getInterfaceNameGemini - class java.lang.String: java.lang.String, int
getIpAddress - class java.lang.String: java.lang.String
getIpAddressGemini - class java.lang.String: java.lang.String, int
getLastError - int: 
getLastErrorGemini - int: int
getLine1AlphaTag - class java.lang.String: int
getLine1Number - class java.lang.String: int
getLteOnCdmaMode - int: 
getMissedCallCount - int: 
getMobileRevisionAndIMEI - void: int, android.os.Message
getNeighboringCellInfo - interface java.util.List: 
getNeighboringCellInfoGemini - interface java.util.List: int
getNetworkCountryIsoGemini - class java.lang.String: int
getNetworkOperatorGemini - class java.lang.String: int
getNetworkOperatorNameGemini - class java.lang.String: int
getNetworkType - int: 
getNetworkTypeGemini - int: int
getPendingMmiCodesGemini - int: int
getPreciseCallState - int: 
getSN - class java.lang.String: 
getScAddressGemini - class java.lang.String: int
getServiceState - class android.os.Bundle: 
getServiceStateGemini - class android.os.Bundle: int
getSimCountryIso - class java.lang.String: int
getSimIndicatorState - int: 
getSimIndicatorStateGemini - int: int
getSimOperator - class java.lang.String: int
getSimOperatorName - class java.lang.String: int
getSimSerialNumber - class java.lang.String: int
getSimState - int: int
getSmsDefaultSim - int: 
getSpNameInEfSpn - class java.lang.String: 
getSpNameInEfSpnGemini - class java.lang.String: int
getSubscriberId - class java.lang.String: int
getSubscriberInfo - interface com.android.internal.telephony.IPhoneSubInfo: int
getVoiceMailAlphaTag - class java.lang.String: int
getVoiceMailNumber - class java.lang.String: int
getVoiceMessageCount - int: 
getVoiceMessageCountGemini - int: int
handlePinMmi - boolean: java.lang.String
handlePinMmiGemini - boolean: java.lang.String, int
hasIccCard - boolean: 
hasIccCardGemini - boolean: int
hashCode - int: 
is3GSwitchLocked - boolean: 
is3GSwitchManualChange3GAllowed - boolean: 
is3GSwitchManualEnabled - boolean: 
isDataConnectivityPossible - boolean: 
isDataConnectivityPossibleGemini - boolean: int
isFDNEnabled - boolean: 
isFDNEnabledGemini - boolean: int
isIccCardProviderAsMvno - boolean: 
isIccCardProviderAsMvnoGemini - boolean: int
isIdle - boolean: 
isIdleGemini - boolean: int
isNetworkRoamingGemini - boolean: int
isOffhook - boolean: 
isOffhookGemini - boolean: int
isOperatorMvnoForEfPnn - class java.lang.String: 
isOperatorMvnoForEfPnnGemini - class java.lang.String: int
isOperatorMvnoForImsi - class java.lang.String: 
isOperatorMvnoForImsiGemini - class java.lang.String: int
isPhbReady - boolean: 
isPhbReadyGemini - boolean: int
isRadioOn - boolean: 
isRadioOnGemini - boolean: int
isRinging - boolean: 
isRingingGemini - boolean: int
isSimInsert - boolean: int
isSimPinEnabled - boolean: 
isTestIccCard - boolean: 
isTestIccCardGemini - boolean: int
isVTIdle - boolean: 
isVoiceIdle - boolean: 
needsOtaServiceProvisioning - boolean: 
notify - void: 
notifyAll - void: 
openIccLogicalChannel - int: java.lang.String
openIccLogicalChannelGemini - int: java.lang.String, int
openIccLogicalChannelWithSw - class [B: java.lang.String
openIccLogicalChannelWithSwGemini - class [B: java.lang.String, int
registerForSimModeChange - void: android.os.IBinder, int
release3GSwitchLock - boolean: int
set3GCapabilitySIM - boolean: int
setDataRoamingEnabledGemini - void: boolean, int
setDefaultPhone - void: int
setGprsConnType - void: int, int
setGprsTransferType - void: int
setGprsTransferTypeGemini - void: int, int
setRadio - boolean: boolean
setRadioOff - boolean: 
setRoamingIndicatorNeddedProperty - void: boolean, boolean
setScAddressGemini - void: java.lang.String, int
showCallScreen - boolean: 
showCallScreenGemini - boolean: int
showCallScreenWithDialpad - boolean: boolean
showCallScreenWithDialpadGemini - boolean: boolean, int
silenceRinger - void: 
silenceRingerGemini - void: int
simAuth - class java.lang.String: java.lang.String
simAuthGemini - class java.lang.String: java.lang.String, int
supplyPin - boolean: java.lang.String
supplyPinGemini - boolean: java.lang.String, int
supplyPuk - boolean: java.lang.String, java.lang.String
supplyPukGemini - boolean: java.lang.String, java.lang.String, int
toString - class java.lang.String: 
toggleRadioOnOff - void: 
transmitIccBasicChannel - class java.lang.String: int, int, int, int, int, java.lang.String
transmitIccBasicChannelGemini - class java.lang.String: int, int, int, int, int, java.lang.String, int
transmitIccLogicalChannel - class java.lang.String: int, int, int, int, int, int, java.lang.String
transmitIccLogicalChannelGemini - class java.lang.String: int, int, int, int, int, int, java.lang.String, int
transmitIccSimIO - class [B: int, int, int, int, int, java.lang.String
transmitIccSimIOGemini - class [B: int, int, int, int, int, java.lang.String, int
uSimAuth - class java.lang.String: java.lang.String, java.lang.String
uSimAuthGemini - class java.lang.String: java.lang.String, java.lang.String, int
unregisterForSimModeChange - void: android.os.IBinder
updateServiceLocation - void: 
updateServiceLocationGemini - void: int
wait - void: 
wait - void: long
wait - void: long, int

顺便说一句,似乎两张 sim 卡同时处于活动状态(无需在 sim 卡之间切换),因为我可以使用两个电话号码拨打电话,而无需在手机上切换 sim 卡。

谢谢!

4

4 回答 4

2

对于这个特定版本的 TelephonyManager,而不是使用

TelephonyManager.listen (phoneStateListener, state)

仅在默认 SIM 上侦听,您可以尝试使用您的 PhoneStateListener 的 2 个实例,然后调用

TelephonyManager.listenGemini (phoneStateListener1, state, 0)对于第一个 SIM 卡,以及

TelephonyManager.listenGemini (phoneStateListener2, state, 1)对于第二张 SIM 卡,

其中第三个参数listenGemini是 SIM 号码。

于 2015-06-05T12:05:14.310 回答
2

感谢您的回答!我没有尝试过您的解决方案,但我发现我自己的解决方案有效。

可以为 TelephonyManager 使用不同的构造函数,您可以在其中传递要控制的 sim 卡插槽:

    MultiSimClass = Class.forName("android.telephony.MultiSimTelephonyManager");

    for (Constructor<?> constructor : MultiSimClass.getConstructors()){
         if (constructor.getParameterTypes().length == 2){
              try {
                   multiSimTelephonyManager1 = constructor.newInstance(context,0);
                   multiSimTelephonyManager2 = constructor.newInstance(context,1);
             }
         }
     }
于 2015-06-06T14:23:48.277 回答
1

为了获取两个 sim 卡的 sim 信号强度,我们必须使用电话管理器

telephonyManager = context.getSystemService(Context.TELEPHONY_SERVICE) as TelephonyManager?
            val cellInfos = telephonyManager?.allCellInfo as ArrayList
            val subManager = context.getSystemService(Context.TELEPHONY_SUBSCRIPTION_SERVICE) as SubscriptionManager?

现在通过我们需要获取已注册的单元格信息,这将给出单元格信息列表

/* Function to get registered cell info
    *  @param cellinfo - all cell info for sim
    *  @return registered cell info correspond to cell info
    */
    fun getRegisteredCellInfo(cellInfos: MutableList<CellInfo>): ArrayList<CellInfo> {
        val registeredCellInfos = ArrayList<CellInfo>()
        if (cellInfos != null && cellInfos.isNotEmpty()) {
            for (i in cellInfos.indices) {
                if (cellInfos[i].isRegistered) {
                    registeredCellInfos.add(cellInfos[i])
                }
            }
        }
        return registeredCellInfos
    }

通过注册单元,您将获得设备中存在的 sim 信息列表现在通过我粘贴在下面的代码,您将根据您的网络类型获得信号强度,无论是 gsm、CDMA 还是 LTE。这也需要访问手机状态和粗略位置的运行时权限,因此请相应地添加它们,注册的手机信息索引是设备中存在的 sim 1 和 sim 2 的索引。Sim 1 是 0 索引,sim 2 是 1 索引,您必须通过。

(registeredCellInfos.get(registeredCellInfoIndex) is CellInfoWcdma) -> {
                        val cellInfoWcdma = registeredCellInfos.get(registeredCellInfoIndex) as CellInfoWcdma
                        signalStrength = "${cellInfoWcdma.cellSignalStrength.dbm}"
                    }
                    (registeredCellInfos.get(registeredCellInfoIndex) is CellInfoGsm) -> {
                        val cellInfogsm = registeredCellInfos.get(registeredCellInfoIndex) as CellInfoGsm
                        signalStrength = "${cellInfogsm.cellSignalStrength.dbm}"
                    }
                    (registeredCellInfos.get(registeredCellInfoIndex) is CellInfoLte) -> {
                        val cellInfoLte = registeredCellInfos.get(registeredCellInfoIndex) as CellInfoLte
                        signalStrength = "${cellInfoLte.cellSignalStrength.dbm}"
                    }
于 2018-10-30T12:07:14.747 回答
0

这里的解决方案 Kotlin 注意:Android Pie 及以上信号仅在位置打开时才会获取,为什么我不知道

    fun getRegisteredCellInfo(cellInfos: MutableList<CellInfo>): ArrayList<CellInfo> {
    val registeredCellInfos = ArrayList<CellInfo>()
    if (cellInfos.isNotEmpty()) {
        for (i in cellInfos.indices) {
            if (cellInfos[i].isRegistered) {
                registeredCellInfos.add(cellInfos[i])
            }
        }
    }
    return registeredCellInfos
}


fun getNetworkStrength(): Pair<Int, Int> {

    var strength1 = -1
    var strength2 = -1


    val manager = getSystemService(Context.TELEPHONY_SUBSCRIPTION_SERVICE) as SubscriptionManager


    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {

        val telephonyManager = applicationContext.getSystemService(Context.TELEPHONY_SERVICE) as TelephonyManager


        if (telephonyManager.allCellInfo != null) {


            val allCellinfo = telephonyManager.allCellInfo
            val activeSubscriptionInfoList = manager.activeSubscriptionInfoList

           val regCellInfo= getRegisteredCellInfo(allCellinfo)

                activeSubscriptionInfoList.forEachIndexed { Subindex, subs ->

                    if (activeSubscriptionInfoList.size >= 2) {

                        if (regCellInfo.size >= 2) {

                            if (subs.simSlotIndex == 0) {

                                if (subs.carrierName != "No service") {


                                    strength1 = when (val info1 = regCellInfo[0]) {
                                        is CellInfoLte -> info1.cellSignalStrength.dbm
                                        is CellInfoGsm -> info1.cellSignalStrength.dbm
                                        is CellInfoCdma -> info1.cellSignalStrength.dbm
                                        is CellInfoWcdma -> info1.cellSignalStrength.dbm
                                        else -> 0
                                    }

                                    Timber.i("subs $subs")

                                    Timber.i("sim1   ${subs.carrierName}  ${subs.mnc}  $strength1")
                                } else {

                                    strength1 = -1
                                }

                            } else if (subs.simSlotIndex == 1) {

                                if (subs.carrierName != "No service") {

                                    strength2 = when (val info2 = regCellInfo[1]) {
                                        is CellInfoLte -> info2.cellSignalStrength.dbm
                                        is CellInfoGsm -> info2.cellSignalStrength.dbm
                                        is CellInfoCdma -> info2.cellSignalStrength.dbm
                                        is CellInfoWcdma -> info2.cellSignalStrength.dbm
                                        else -> 0
                                    }

                                    Timber.i("sim2   ${subs.carrierName}  $strength2")
                                } else {

                                    strength2 = -1
                                }

                            }

                        }
                    }else if(activeSubscriptionInfoList.size == 1)
                    {

                        if(regCellInfo.size >= 1) {

                            if (subs.simSlotIndex == 0) {

                                if (subs.carrierName != "No service") {


                                    strength1 = when (val info1 = regCellInfo[0]) {
                                        is CellInfoLte -> info1.cellSignalStrength.level
                                        is CellInfoGsm -> info1.cellSignalStrength.level
                                        is CellInfoCdma -> info1.cellSignalStrength.level
                                        is CellInfoWcdma -> info1.cellSignalStrength.level
                                        else -> 0
                                    }

                                    Timber.i("subs $subs")

                                    Timber.i("sim1   ${subs.carrierName}  ${subs.mnc}  $strength1")
                                } else {

                                    strength1 = -1
                                }

                            }
                        }

                        strength2 = -2

                    }
                }

            }
        }

    Timber.i("final strenght   sim1 $strength1  sim2 $strength2")

    return Pair(strength1, strength2)
}
于 2019-11-08T05:12:36.570 回答