Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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!

like image 374
dag roger stokland rui Avatar asked Jan 04 '15 15:01

dag roger stokland rui


People also ask

Does dual SIM affect signal strength?

Cause: This is caused by the fact that the two SIM cards use different radio frequencies and the signal strength may be affected by the phone's position, its angle or the way you hold it.

Which SIM signal strength is best?

Signal strengths can range from approximately -30 dBm to -110 dBm. The closer that number is to 0, the stronger the cell signal. In general, anything better than -85 decibels is considered a usable signal.

How can I get signal strength in Android?

Settings –> About Phone –> Status (or Network) On this screen, view Signal Strength (or Network Type and Strength).

Does dual SIM affect network?

No. Phones come with switchable network bands on a particular slot. So, if you put a 4G SIM in any one of the slot and if you select that SIM slot for data connection, you won't get any speed change.


2 Answers

For this particular version of TelephonyManager, instead of using

TelephonyManager.listen (phoneStateListener, state)

which only listens on the default SIM, you may try using 2 instances of your PhoneStateListener, and call

TelephonyManager.listenGemini (phoneStateListener1, state, 0) for the 1st SIM, and

TelephonyManager.listenGemini (phoneStateListener2, state, 1) for the 2nd SIM,

where the third parameter for listenGemini is the SIM number.

like image 119
headuck Avatar answered Oct 08 '22 18:10

headuck


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);
             }
         }
     }
like image 26
dag roger stokland rui Avatar answered Oct 08 '22 18:10

dag roger stokland rui