Search code examples
androidtelephonymanagersignal-strengthdual-sim

Android dual SIM signal strength


I have been trying to get access to some features on my android dual sim phone (the brand is LKD). I have managed to get the functions for TelephonyManager and ITelephony through java reflection, and got them to run. However i want to get the signal strength for both of the sim cards and i cannot see a way to do this through the reflection. I can get the first sim card in slot 1 through having a PhoneStateListener with the function onSignalStrengthsChanged().

Does anyone have some tips for this? Functions i got from reflection:

###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

And btw it seems both of the sim cards are active at the same time(no need for switching between sim cards) since i can call the phone using both phone numbers without switching the sim card on the phone.

Thanks!


Solution

  • Thanks for the answer headuck! I have not tried your solution, but i found my own solution which worked.

    It is possible to use a different constructor for the TelephonyManager where you can pass in the sim card slot you want control over:

        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);
                 }
             }
         }