2012-11-08 50 views
12

Có ai biết cách truy xuất danh sách tháp di động trên GSM và CDMA trên Android hay không.Truy xuất thông tin tháp di động

Tôi đã cố gắng sử dụng Vị trí Google Maps API: https://developers.google.com/maps/documentation/business/geolocation/

Và tôi muốn để có được tế bào tháp thông tin với các lĩnh vực:

  • CellID: định danh duy nhất của tế bào. Trên GSM, đây là Cell ID (CID); Mạng CDMA sử dụng ID trạm gốc (BID).
  • vị tríMã mã: Mã vùng vị trí (LAC) cho mạng GSM; Mạng CDMA sử dụng ID mạng (NID).
  • mobileCountryCode: Mã quốc gia di động của tháp di động (MCC).
  • mobileNetworkCode: Mã mạng di động của tháp di động. Đây là MNC cho GSM hoặc ID hệ thống (SID) cho CDMA.
  • tuổi: Số mili giây kể từ khi ô này là chính. Nếu tuổi là 0, cellId đại diện cho một phép đo hiện tại.
  • signalStrength: Cường độ tín hiệu radio đo bằng dBm.
  • timingAdvance: Giá trị trước thời gian.

Mã này không đặc biệt nhận được thông tin về tháp di động.

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) {} 
} 

Và tôi thiết lập quyền như thế này:

<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"/> 

Xin hãy giúp tôi, cảm ơn bạn.

+4

"Mã của tôi hoạt động ngoại trừ việc nhận thông tin về tháp di động" là mô tả vô dụng về các triệu chứng của bạn. Hãy dành thời gian để giải thích, chi tiết, cái gì là và không hoạt động. – CommonsWare

+0

Tôi xin lỗi, tiếng Anh không phải là ngôn ngữ chính của tôi. Khi tôi chạy mã trên Android của mình (nhà cung cấp dịch vụ chạy nước rút), "tel.getNeighboringCellInfo();" trả về luôn rỗng. – wf9a5m75

+0

Và ngay cả khi tôi thử mã trên các mạng Android khác của mạng GSM, tôi cũng nhận được kết quả tương tự. Vì vậy, câu hỏi của tôi là cách lấy thông tin về tháp di động. – wf9a5m75

Trả lời

6

Điện thoại của bạn có thể không hỗ trợ chức năng này.

Xem này: http://code.google.com/p/android/issues/detail?id=24136

và điều này: Which Android phone models support getNeighboringCellInfo()?

+0

Tôi hiểu. Vâng, bạn có biết một cách khác để lấy danh sách tháp di động thay vì getNeighboringCellInfo() không? – wf9a5m75

+0

Xin lỗi. Tôi cũng mới làm điều này. –

+1

Cảm ơn bạn, Bernd. Tôi từ bỏ để thử điều này. – wf9a5m75

0

Nó không điện thoại của bạn, mà không hỗ trợ thông tin này, nó hoàn toàn là thực hiện không hấp dẫn của C liên quan RIL và Java dùng để cung cấp những API cuộc gọi, ngăn chặn điều này. Nếu bạn quản lý để đi vào các menu Service Mode (mà thay đổi rộng rãi từ điện thoại đến điện thoại), bạn sẽ có quyền truy cập đầy đủ và ngay lập tức vào RSSI và tải các loại tín hiệu khác. Bạn nên đổ lỗi cho Google (hoặc OEM của bạn) vì không sửa các lỗi đó và cung cấp truy cập tốt hơn đến các biến liên quan đến RF.

4

Tôi có vấn đề này nhiều thời gian gần đây hơn và nó kết thúc lên được một thực tế rằng

getNeighboringCellInfo

bị phản đối từ API 23 lên. Để sử dụng thông tin này như sau (thật khó chịu),

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

Lưu ý rằng "deprecetad" và "không còn hoạt động" là hai thứ khác nhau — có nhiều API không dùng nữa vẫn hoạt động như trước đây, giới hạn duy nhất là chúng thiếu hỗ trợ cho các tính năng mới có thể được giới thiệu kể từ đó (như với API, không bao giờ có bất kỳ hỗ trợ thích hợp nào cho LTE). Tuy nhiên, hỗ trợ nhà cung cấp của các API này rất khác nhau. – user149408

Các vấn đề liên quan