我想知道SIM卡中保存的位置区号和小区ID。
如何在Android手机中获取位置区号和小区ID。
最好的问候。答案 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();
从设备上的所有无线电(包括主小区和相邻小区)返回所有观察到的小区信息。调用此方法不会触发对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**
}
所以,只有当您知道一个已知值时,它才会改变
我留下了一些链接以最了解它
答案 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开发指南中的相关内容。