如何知道Android手机中的位置区号和小区ID

时间:2010-11-11 08:00:42

标签: android

我想知道SIM卡中保存的位置区号和小区ID。

如何在Android手机中获取位置区号和小区ID。

最好的问候。

5 个答案:

答案 0 :(得分:16)

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

不要忘记设置ACCESS_COARSE_LOCATION或ACCESS_FINE_LOCATION,否则您将获得SecurityExceptions。

例如,将以下内容添加到< manifest> app清单中的元素:

<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>

答案 1 :(得分:12)

在拨号器中键入*#*#4636#*#*,这可能就是您要找的内容。

答案 2 :(得分:2)

这并不容易,因为您必须知道要处理的内容。 首先,您必须知道这是什么。就像android文档说的..

我将某些科特琳脚本转换为JAVA,但并非全部。不用担心,JAVA易于转换为科特林并可以逆转。

TelephonyManager 提供对有关设备上电话服务信息的访问。应用程序可以使用此类中的方法确定电话服务和状态,以及访问某些类型的订户信息。应用程序还可以注册一个侦听器,以接收电话状态更改的通知。

这将带您进入 TELEPHONY_SERVICE

与getSystemService(String)一起使用以检索TelephonyManager来管理设备的电话功能。*

科特林

val telephonyManager = getSystemService(Context.TELEPHONY_SERVICE) as TelephonyManager

java

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

在那之后你找到这个

科特林

val cellLocation = telephonyManager.allCellInfo

java

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

getAllCellInfo

从设备上的所有无线电(包括主小区和相邻小区)返回所有观察到的小区信息。调用此方法不会触发对onCellInfoChanged()的调用,也不会更改onCellInfoChanged()的调用速率。

该列表可以包含任意组合的一个或多个CellInfoGsm,CellInfoCdma,CellInfoLte和CellInfoWcdma对象。

信息表明,您可以获取设备和/或SIM卡所属的网络类型

科特林

   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

            }
        }
    }

如您所见,您可以针对各种网络类型(例如GSM)获得不同的属性

java

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

或LTE

java

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

现在,对了!问题是在这种情况下 2147483647 ,当您在LOG中开始看到MAX_VALUES Int数据类型时。在文档中说出“ 16位跟踪区号, Integer.MAX_VALUE,如果未知然后应用程序说出2147483647,我们跳出窗口。

但是,如果我们认为加深,那只是一次。我们一次获得了房地产网络。状态网络专有权发生更改时,我们应该进行更新,并将其命名为 Listener

科特林

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

制作类并扩展PhoneStateListener类

科特林

   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

下一个代码是简单而愚蠢的,因为侦听器正在工作,即侦听。 网络专有数据类型变化如此之快,以至于我们看不到。但是唯一要做的就是下一个脚本

  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**
   }

所以,只有当您知道一个已知值时,它才会改变

我留下了一些链接以最了解它

Example of app in prod

Java examples android

Java example android

答案 3 :(得分:1)

值为16。 使用它像:

String cellId = Integer.toHexString(location.getCid());
String cellLac = Integer.toHexString(location.getLac());

答案 4 :(得分:0)

我不知道您是否可以访问该信息。 我知道您可以访问的位置数据是

来自d.android.com上的Android开发者指南

“您可以使用Android提供的Context对象查找语言环境:

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

编辑:哦,你需要什么?因为如果你只想为它制作不同的资源,你不需要访问这些信息,因为Android会为你做这些。请阅读本地化一章中d.android.com开发指南中的相关内容。