How to know Location Area Code and Cell ID in android phone

前端 未结 5 2079
醉梦人生
醉梦人生 2020-12-15 10:29

I would like to know Location Area Code and Cell ID saved in sim card.

How to get Location Area Code and Cell ID in android phone.

best regards.

相关标签:
5条回答
  • 2020-12-15 11:04

    Values are base 16. Use it like:

    String cellId = Integer.toHexString(location.getCid());
    String cellLac = Integer.toHexString(location.getLac());
    
    0 讨论(0)
  • 2020-12-15 11:12

    Type in *#*#4636#*#* into the dialer and that might be what you're looking for.

    0 讨论(0)
  • 2020-12-15 11:15

    I don't know if you can acces that information. The location data of which I know you can acces it is this

    From the Android Developers guide on d.android.com

    "You can look up the locale using the Context object that Android makes available:

    String locale = context.getResources().getConfiguration().locale.getDisplayName();
    

    "

    EDIT: Oh what for do you need it? Because if you only want to make different resources for it, you don't need to acces the information, as Android does that for you. Read about it on the d.android.com dev guide in the chapter localization.

    0 讨论(0)
  • 2020-12-15 11:21

    This Is not easier, because you must know what you are dealing with. First u must be know what is this. Like android documentation say..

    I TRANSLATED SOME KOTLIN SCRIPTS TO JAVA BUT NOT ALL. DON'T WORRY, JAVA IS EASY TO TRANSLATE TO KOTLIN AND MAKE REVERSE.

    TelephonyManager Provides access to information about the telephony services on the device. Applications can use the methods in this class to determine telephony services and states, as well as to access some types of subscriber information. Applications can also register a listener to receive notification of telephony state changes.

    This will take you to TELEPHONY_SERVICE

    Use with getSystemService(String) to retrieve a TelephonyManager for handling management the telephony features of the device.*

    Kotlin

    val telephonyManager = getSystemService(Context.TELEPHONY_SERVICE) as TelephonyManager
    

    java

       final TelephonyManager telephony = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
    

    After that you find this

    Kotlin

    val cellLocation = telephonyManager.allCellInfo
    

    java

       List<CellInfo> cellLocation = telephonyManager.getAllCellInfo();
    

    getAllCellInfo

    Returns all observed cell information from all radios on the device including the primary and neighboring cells. Calling this method does not trigger a call to onCellInfoChanged(), or change the rate at which onCellInfoChanged() is called.

    The list can include one or more CellInfoGsm, CellInfoCdma, CellInfoLte, and CellInfoWcdma objects, in any combination.

    The information says that you can obtain the respective type of network in which your device and / or sim card belong

    Kotlin

       if (cellLocation != null) {  //verify if is'nt null
            for (info in cellLocation) {    // Loop for go through Muteablelist
                if (info is CellInfoGsm) {  //verify if Network is Gsm type
    
                    // val gsm = (info as CellInfoGsm).cellSignalStrength  //get the cell Signal strength  
                    val identityGsm = (info as CellInfoGsm).cellIdentity   //get the cellIdentity data 
                    val defineTextLAC = getString(R.string.lac, "lola"+identityGsm.lac)  //get the LAC(LOCATION AREA CODE) string
                    lacLabel.text = defineTextLAC   //set the xml text in element textview
    
                }else if(info is CellInfoCdma){     //verify if Network is Cdma type
    
                    val identityCdma = info.cellIdentity    //get the cellIdentity data 
                    val defineTextLAC = getString(R.string.lac, "lola"+identityCdma.basestationId)   //get the (basestationId) string
                    lacLabel.text = defineTextLAC   //set the xml text in element textview      //get the LAC(LOCATION AREA CODE) string
    
                }else if(info is CellInfoLte){       //verify if Network is LTE type
    
                    val identityLte = info.cellIdentity     //get the cellIdentity data
                    val defineTextLAC = getString(R.string.lac, "pop"+identityLte.ci)       //get the CI(CellIdentity) string
                    lacLabel.text = defineTextLAC  //set the xml text in element textview
    
                }else if  (lCurrentApiVersion >= Build.VERSION_CODES.JELLY_BEAN_MR2 && info is CellInfoWcdma) { //verify if Network is Wcdma and version SFK match with te network type
    
                    val identityWcdma = info.cellIdentity       //get the cellIdentity data
                    val defineTextLAC = getString(R.string.lac, "lola"+identityWcdma.cid) //  get the Cid(CellIdentity) string  
                    lacLabel.text = defineTextLAC  //set the xml text in element textview
    
                }
            }
        }
    

    As you can see you can obtain diferent propieties for respective network type for example GSM

    java

       getCid(), getLac(), getMccString(), getBsic(), getMncString()
    

    or for LTE

    java

     getEarfcn(), getMccString(), getMncString(), getCi(), getPci(), getTac() 
    

    Now, that's right! The problem is when in the LOG you begin to see MAX_VALUES Int data type in this case 2147483647. In the documentation say "16-bit Tracking Area Code, Integer.MAX_VALUE if unknown" Then the app say 2147483647 and we jump out of the window.

    But, if we think deeping we're doing this just one time. we're get the property network one time. We should update when the status network proprietary change, and this is named Listener

    Kotlin

    private var signalStrengthListener: SignalStrengthListener? = null
    
           signalStrengthListener = SignalStrengthListener()
    
       (getSystemService(Context.TELEPHONY_SERVICE) as TelephonyManager).listen(signalStrengthListener, 
      PhoneStateListener.LISTEN_SIGNAL_STRENGTHS)
    
        tm = getSystemService(Context.TELEPHONY_SERVICE) as TelephonyManager
    

    to make class and extend PhoneStateListener class

    Kotlin

       private inner class SignalStrengthListener() : PhoneStateListener() {
    
    
    
        override fun onSignalStrengthsChanged(signalStrength: android.telephony.SignalStrength) {
    
       **//to do in listener... in the below link**
    
       }
     }
    

    This is the java example for make the listener content and other function to help our

    The next code is some simple and silly because the listener is working, Listen. And the network proprietary data type change so fast that we can't see that. But the only thing to do is the next script

      if(cellInfo.cellIdentity.tac != 2147483647){   //2147483647 is the MAX_VALUE INT DATA TYPE
                cellTac =  cellInfo.cellIdentity.tac  //tac is a propiety network (TRACKING AREA CODE**strong text**
       }
    

    so, it only changes when you get a known value

    I leave some links to know most about it

    Example of app in prod

    Java examples android

    Java example android

    0 讨论(0)
  • 2020-12-15 11:24
    final TelephonyManager telephony = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
    if (telephony.getPhoneType() == TelephonyManager.PHONE_TYPE_GSM) {
        final GsmCellLocation location = (GsmCellLocation) telephony.getCellLocation();
        if (location != null) {
            msg.setText("LAC: " + location.getLac() + " CID: " + location.getCid());
        }
    }
    

    Don't forget to set ACCESS_COARSE_LOCATION or ACCESS_FINE_LOCATION or you'll get SecurityExceptions.

    For example add the following to your <manifest> element in the app manifest:

    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
    
    0 讨论(0)
提交回复
热议问题