24

有谁知道如何在 Android 上检索 GSM 和 CDMA 上的手机信号塔列表。

我一直在尝试使用 Google Maps Locations API: https ://developers.google.com/maps/documentation/business/geolocation/

我想通过以下字段获取手机信号塔信息:

  • cellId:单元格的唯一标识符。在 GSM 上,这是 Cell ID (CID);CDMA 网络使用基站 ID (BID)。
  • locationAreaCode:GSM 网络的位置区域代码 (LAC);CDMA 网络使用网络 ID (NID)。
  • mobileCountryCode:手机信号塔的移动国家代码 (MCC)。
  • mobileNetworkCode:手机信号塔的移动网络代码。这是 GSM 的 MNC,或 CDMA 的系统 ID (SID)。
  • 年龄:自该单元成为主单元以来的毫秒数。如果年龄为 0,则 cellId 表示当前测量值。
  • signalStrength:以 dBm 为单位测量的无线电信号强度。
  • timingAdvance:定时提前值。

此代码并没有特别获取手机信号塔信息。

TelephonyManager tel = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);

// Type of the network
int phoneTypeInt = tel.getPhoneType();
String phoneType = null;
phoneType = phoneTypeInt == TelephonyManager.PHONE_TYPE_GSM ? "gsm" : phoneType;
phoneType = phoneTypeInt == TelephonyManager.PHONE_TYPE_CDMA ? "cdma" : phoneType;
try {
  if (phoneType != null) {
    params.put("radioType", phoneType);
  }
} catch (Exception e) {}

/*
 * The below code doesn't work I think.
 */
JSONArray cellList = new JSONArray();
List<NeighboringCellInfo> neighCells = tel.getNeighboringCellInfo();
for (int i = 0; i < neighCells.size(); i++) {
  try {
    JSONObject cellObj = new JSONObject();
    NeighboringCellInfo thisCell = neighCells.get(i);
    cellObj.put("cellId", thisCell.getCid());
    cellList.put(cellObj);
  } catch (Exception e) {}
}
if (cellList.length() > 0) {
  try {
    params.put("cellTowers", cellList);
  } catch (JSONException e) {}
}

我设置这样的权限:

<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_UPDATES"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
<uses-permission android:name="android.permission.INTERNET"/>

请帮帮我,谢谢。

4

3 回答 3

11

我最近遇到了这个问题,结果是这样的

获取邻接细胞信息

从 API 23 起已弃用。要解决此问题,请使用以下内容(真的很烦人):

public static JSONArray getCellInfo(Context ctx){
        TelephonyManager tel = (TelephonyManager) ctx.getSystemService(Context.TELEPHONY_SERVICE);

        JSONArray cellList = new JSONArray();

// Type of the network
        int phoneTypeInt = tel.getPhoneType();
        String phoneType = null;
        phoneType = phoneTypeInt == TelephonyManager.PHONE_TYPE_GSM ? "gsm" : phoneType;
        phoneType = phoneTypeInt == TelephonyManager.PHONE_TYPE_CDMA ? "cdma" : phoneType;

        //from Android M up must use getAllCellInfo
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {



            List<NeighboringCellInfo> neighCells = tel.getNeighboringCellInfo();
            for (int i = 0; i < neighCells.size(); i++) {
                try {
                    JSONObject cellObj = new JSONObject();
                    NeighboringCellInfo thisCell = neighCells.get(i);
                    cellObj.put("cellId", thisCell.getCid());
                    cellObj.put("lac", thisCell.getLac());
                    cellObj.put("rssi", thisCell.getRssi());
                    cellList.put(cellObj);
                } catch (Exception e) {
                }
            }

        } else {
            List<CellInfo> infos = tel.getAllCellInfo();
            for (int i = 0; i<infos.size(); ++i) {
                try {
                    JSONObject cellObj = new JSONObject();
                    CellInfo info = infos.get(i);
                    if (info instanceof CellInfoGsm){
                        CellSignalStrengthGsm gsm = ((CellInfoGsm) info).getCellSignalStrength();
                        CellIdentityGsm identityGsm = ((CellInfoGsm) info).getCellIdentity();
                        cellObj.put("cellId", identityGsm.getCid());
                        cellObj.put("lac", identityGsm.getLac());
                        cellObj.put("dbm", gsm.getDbm());
                        cellList.put(cellObj);
                    } else if (info instanceof CellInfoLte) {
                        CellSignalStrengthLte lte = ((CellInfoLte) info).getCellSignalStrength();
                        CellIdentityLte identityLte = ((CellInfoLte) info).getCellIdentity();
                        cellObj.put("cellId", identityLte.getCi());
                        cellObj.put("tac", identityLte.getTac());
                        cellObj.put("dbm", lte.getDbm());
                        cellList.put(cellObj);
                    }

                } catch (Exception ex) {

                }
            }
        }

        return cellList;
    }
于 2016-09-15T06:42:59.300 回答
8

您的手机可能不支持此功能。

看到这个:http ://code.google.com/p/android/issues/detail?id=24136

还有这个:哪些 Android 手机型号支持 getNeighboringCellInfo()?

于 2012-11-08T19:40:13.087 回答
0

这不是您的手机,它不支持此信息,它纯粹是用于提供这些 API 调用的 RIL 相关 C 和 Java 的糟糕实现,从而阻止了这种情况。如果您设法进入Service Mode菜单(因手机而异),您将可以完全且即时地访问 RSSI 和大量其他类型的信号。您应该责怪 Google(或您的 OEM)没有解决这些问题并提供对 RF 相关变量的更好访问。

于 2014-04-10T10:37:22.460 回答