2012-11-08 143 views
12

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

我一直在尝试使用谷歌地图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)。
  • 年龄:自该单元格为主之后的毫秒数。如果age为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

“我的代码工作,除了获得基站的信息”是你的症状无用的描述。请花时间详细解释什么是和不在工作。 – CommonsWare

+0

对不起,英语不是我的主要语言。 当我在Android上运行代码(载体是sprint)时,“tel.getNeighboringCellInfo();”返回值始终为空。 – wf9a5m75

+0

即使我尝试GSM网络的其他Android上的代码,我也得到了相同的结果。 所以我的问题是如何获取手机信息塔信息。 – wf9a5m75

回答

0

这不是你的手机,不支持这个信息,那纯粹是蹩脚的实施RIL相关的C和Java中使用,以提供这些API电话,这阻止了这一点。如果您设法进入Service Mode菜单(各个电话之间差别很大),您将可以完全和即时访问RSSI和其他类型的信号。您应该责备Google(或您的OEM)不解决这些问题,并提供更好的RF相关变量访问权限。

4

我最近多了这个问题,它结束了那

getNeighboringCellInfo

从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; 
    } 
+1

请注意,“deprecetad”和“不再有效”是两个不同的东西 - 有许多过时的API仍然像以前一样工作,唯一的限制是它们缺少对可能从此引入的新功能的支持(就像这样API,从来没有任何适当的支持LTE)。但是,这些API的供应商支持差异很大。 – user149408