venerdì 13 dicembre 2013

Geolocalizzazione su Android senza GPS

Attualmente e' possibile effettuare la geolocalizzazione di un telefono Android mediante la rete cellulare,una possibilita', un tempo riservata a forze dell'ordine ed ai gestori della telefonia mobile.

Mediante le Api di Android e' possibile ottenere le informazioni sulla antenna agganciata dal telefono.
I parametri sono
MCC e MNC : relativi al gestore (in questo caso MCC 222 e MNC 88 indica Wind Italia)
CID e LAC : sono gli identificativi dell'antenna

Il codice per ottenere queste informazioni  si possono ottenere con il codice riportato al termine del post


A questo punto ci si puo' affidare a servizi come quello fornito da Cellphonetrackers.org, per ottenere una geolocalizzazione


Il segreto e' che esiste un database pubblico della posizione e degli ID delle antenne di telefonia mobile denominato OpenCellID che permette di convertire le informazioni di telefonia in informazioni geografiche

Con la scheda Wind non sono riuscito a identificare le NeighboringCellInfo ne' il numero del cellulare (che e' gestito a livello di rete e non e' contenuto fisicamente nella SIM)
Con Vodafone invece la lista delle antenna vicine si popola con tre elementi di cui viene indicato l'RSSI ma non il LAC ed il CID (quindi fondamentalmente e' inutile)

Modifica il file Manifest
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>

------------------------------------------------
 TelephonyManager mTelephonyMgr;
        mTelephonyMgr = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
        String networkOperator = mTelephonyMgr.getNetworkOperator();
        GsmCellLocation cellLocation = (GsmCellLocation) mTelephonyMgr.getCellLocation();
        nr_phone = mTelephonyMgr.getLine1Number();
        cid = cellLocation.getCid();
        lac = cellLocation.getLac();
        if (networkOperator != null) {
            mcc = Integer.parseInt(networkOperator.substring(0, 3));
            mnc = Integer.parseInt(networkOperator.substring(3));
        }
------------------------------------------------

questo invece e' il codice per le celle vicine che non mi funziona



------------------------------------------------
  List<NeighboringCellInfo> NeighboringList = mTelephonyMgr.getNeighboringCellInfo();
        String stringNeighboring = "Neighboring List- Lac : Cid : RSSI\n";
        for(int i=0; i < NeighboringList.size(); i++){
         
        String dBm;
        int rssi = NeighboringList.get(i).getRssi();
        if(rssi == NeighboringCellInfo.UNKNOWN_RSSI){
        dBm = "Unknown RSSI";
        }else{
        dBm = String.valueOf(-113 + 2 * rssi) + " dBm";
        }
 
        stringNeighboring = stringNeighboring
         + String.valueOf(NeighboringList.get(i).getLac()) +" : "
         + String.valueOf(NeighboringList.get(i).getCid()) +" : "
         + dBm +"\n";
        }
------------------------------------------------