2012-11-08 142 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