PhoneStateListerner GsmCellLocation

时间:2017-09-25 02:02:32

标签: android-5.1.1-lollipop phone-state-listener

我最近在运行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之后,它仍然无法正常工作。

有没有人遇到这个问题?这个问题已经困扰了我很长时间。

0 个答案:

没有答案