我最近在运行Android 5.1项目。在进行LTE测试时,我发现了一个奇怪的问题。
我想通过使用GsmCellLocation和PhoneStateListener来获取Cid和Lac
这是我的PhoneStateListener和GsmCellLocation的代码:
TelephonyManager tm = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
tm.listen(new PhoneStateListener() {
@Override
public void onCellLocationChanged(CellLocation location) {
String txt = "";
if (location instanceof GsmCellLocation) {
if (location != null) {
//something process when location changed
GsmCellLocation l = (GsmCellLocation) location;
if (l_ != null) {
txt += "\ngetCellLocation: " + l_.getCid();
}
else {
txt += "\ngetCellLocation, location is null";
}
}
}
}
}, PhoneStateListener.LISTEN_CELL_LOCATION);
GsmCellLocation l_ = (GsmCellLocation) mTm.getCellLocation();
String txt = "";
if (l_ != null) {
txt = "getCellLocation: " + l_.getCid();
}
else {
txt = "getCellLocation, location is null";
}
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
我尝试在我的代码中使用PhoneStateListener通过LTE获取位置。 但它没有按预期工作。但是,4G移动数据工作正常。
仅使用GsmCellLocation工作正常。我可以从GsmCellLocation类获得Cid和Lac。
在跟踪源代码之后,我发现PhoneStateListener的onCellLocationChanged和GsmCellLocation的getCellLocation正在运行名为newFromBundle的相同函数。
当运行getCellLocation时,我看到这个函数与newFromBundle的GsmCellLocation(bundle)一起工作正常,这样我就可以通过使用GsmCellLocation类来获得正确的Cid和Lac。
但PhoneStateListener的onCellLocationChanged始终使用newFromBundle返回null。
public static CellLocation newFromBundle(Bundle bundle) {
// TelephonyManager.getDefault().getCurrentPhoneType() handles the case when
// ITelephony interface is not up yet.
//switch(TelephonyManager.getDefault().getCurrentPhoneType()) {
switch(bundle.getInt("type", PhoneConstants.PHONE_TYPE_NONE)) {
case PhoneConstants.PHONE_TYPE_CDMA:
Log.e(TAG, "create CdmaCellLocation");
return new CdmaCellLocation(bundle);
case PhoneConstants.PHONE_TYPE_GSM:
Log.e(TAG, "create GsmCellLocation");
return new GsmCellLocation(bundle);
default:
return null;
}
}
没有意义。为什么这么说呢。我有韩国的三个SIM卡,KT,LG U +和SK Telecom。
这三个SIM可以正常使用GsmCellLocation的getCellLocation。
KT和SK Telecom与PhoneStateListener的onCellLocationChanged一起正常工作。
使用PhoneStateListener的onCellLocationChanged只有LG U +出现故障。
我认为我的代码不对。但是,该单元的供应商说我必须设置适当的SubId才能让PhoneStateListener初始化。
我对它有点困惑。使用SK和SK Telecom时,我不必设置任何SubId,但为什么Lg U +需要这样做?在我设置了LG U +的SubId之后,它仍然无法正常工作。有没有人遇到这个问题?这个问题已经困扰了我很长时间。