24

AndroidのGSMおよびCDMAでセルタワーリストを取得する方法を知っている人はいますか.

Google Maps Locations API を使用しようとしています: https://developers.google.com/maps/documentation/business/geolocation/

そして、これらのフィールドを使用して携帯電話基地局の情報を取得したいと考えています。

  • cellId: セルの一意の識別子。GSM では、これはセル ID (CID) です。CDMA ネットワークは、基地局 ID (BID) を使用します。
  • locationAreaCode: GSM ネットワークのロケーション エリア コー​​ド (LAC)。CDMA ネットワークはネットワーク ID (NID) を使用します。
  • mobileCountryCode: セル タワーのモバイル カントリー コード (MCC)。
  • mobileNetworkCode: セル タワーのモバイル ネットワーク コード。これは、GSM の MNC、または CDMA のシステム ID (SID) です。
  • age: このセルがプライマリになってからのミリ秒数。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

3 に答える 3

11

私はずっと最近この問題を抱えていましたが、最終的には

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;
    }
于 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 に答える