Chiarimento maps e implementazione

di il
31 risposte

31 Risposte - Pagina 2

  • Re: Chiarimento maps e implementazione

    Dal codice che hai postato mi sembra tutto ok, a parte il fatto che la rilevazione della sicurezza avviene nel modo sbagliato.
    Il modo corretto (e usato da android stesso) è il seguente:
    
    private static int getSecurity(ScanResult result) {
            if (result.capabilities.contains("WEP")) {
                return SECURITY_WEP;
            } else if (result.capabilities.contains("PSK")) {
                return SECURITY_PSK;
            } else if (result.capabilities.contains("EAP")) {
                return SECURITY_EAP;
            }
            return SECURITY_NONE;
    }
    
    dove security_wep e le altre sono tutte costati definite all'interno della classe, ma tu puoi definire le tue
  • Re: Chiarimento maps e implementazione

    Aspetta mi sono perso un attimo, posso postarti la classe che uso x scansionare le reti??

    io uso questa
    import java.util.List;
    
    
    
    import android.annotation.SuppressLint;
    import android.app.Activity;
    import android.content.BroadcastReceiver;
    
    import android.content.Context;
    import android.content.Intent;
    import android.content.IntentFilter;
    
    
    
    import android.net.wifi.ScanResult;
    import android.net.wifi.WifiManager;
    import android.os.Bundle;
    
    import android.widget.ArrayAdapter;
    import android.widget.ListView;
    
    
    
    public class SearchHotspotsActivity extends Activity {
    	   WifiManager mainWifiObj;
    	   WifiScanReceiver wifiReciever;
    	   ListView list;
    	   String wifis[];
    	   public int coperture;
    	   public String name;
    	   public String security;
    	   public AccessPoint ap;
    	   PositionAccess gps;
    	   double latitude; 
           double longitude;
    	   
           
    	   public void onCreate(Bundle savedInstanceState) {
    	      super.onCreate(savedInstanceState);
    	      setContentView(R.layout.activity_wifi);
    	      list = (ListView)findViewById(R.id.listView1);
    	      mainWifiObj = (WifiManager) getSystemService(Context.WIFI_SERVICE);
    	      wifiReciever = new WifiScanReceiver();
    	      mainWifiObj.startScan();
    	   }
    	   
    
    	   public void onBackPressed() {
    		   Intent MainIntent = new Intent(SearchHotspotsActivity.this,
    					MainActivity.class);
    			SearchHotspotsActivity.this.startActivity(MainIntent);
    			SearchHotspotsActivity.this.finish(); 
    		   
    		    return;
    		}
    
    	   protected void onPause() {
    	      unregisterReceiver(wifiReciever);
    	      super.onPause();
    	   }
    
    	   protected void onResume() {
    	      registerReceiver(wifiReciever, new IntentFilter(
    	      WifiManager.SCAN_RESULTS_AVAILABLE_ACTION));
    	      super.onResume();
    	   }
    	   
    	  
    	 
    
    	   class WifiScanReceiver extends BroadcastReceiver {
    		   int id;
    		   String Rete_name;
    		   String Security;
    		   int copertura;
    		   
    		   
    	      @SuppressLint("UseValueOf")
    	      public void onReceive(Context c, Intent intent) {
    	    	  gps = new PositionAccess(SearchHotspotsActivity.this);
    		      if(gps.canGetLocation()) {
    
    	              latitude = gps.getLatitude();
    	              longitude = gps.getLongitude();
    
    	              // \n is for new line
    	             // Toast.makeText(getApplicationContext(), "Your Location is - \nLat: " + latitude + "\nLong: " + longitude, Toast.LENGTH_LONG).show();
    	          } else {
    	              // Can't get location.
    	              // GPS or network is not enabled.
    	              // Ask user to enable GPS/network in settings.
    	              gps.showSettingsAlert();
    	          }
    		     
    		 
    	         List<ScanResult> wifiScanList = mainWifiObj.getScanResults();
    	         wifis = new String[wifiScanList.size()];
    	         for(int i = 0; i < wifiScanList.size(); i++){
    	            wifis[i] = ((wifiScanList.get(i)).toString());
    	            id = 0;
    	            
    	            Rete_name=wifiScanList.get(i).SSID.toString();
    	            Security =wifiScanList.get(i).capabilities.toString();
    	            copertura = wifiScanList.get(i).frequency;
    	            
    	            //output per prova dati abbiamo visto che funzionano
    	           // System.err.println(Rete_name);
    	           // System.err.println(Security);
    	            //System.err.println(coperture);
    	            
    	          //variabili per creare un oggetto di tipo AccessPoint  
    	        name = Rete_name;
    	        security = Security;
    	        coperture = copertura;
    	        
    	          ap = new AccessPoint();
    		      ap.setName(name);
    		      ap.setSecurity(security);
    		      ap.setCoperture(coperture);
    		      ap.setLatitude(latitude);
    		      ap.setLongitude(longitude);
    		      //output di prova per vedere se funzionava 
    		     // System.out.println(name);
    		      MySQLiteHelper db = new MySQLiteHelper(c);
    		      
    		      
    		      //db.onUpgrade(db, oldVersion, newVersion);
    		      /**
    		         * CRUD Operations
    		         * */
    		        // add ap
    		     
    		      
    		     db.addAccessPoint(new AccessPoint(name,security,coperture,latitude,longitude));
    	         }
    	        
    	         list.setAdapter(new ArrayAdapter<String>(getApplicationContext(),
    	         android.R.layout.simple_list_item_1,wifis));
    	      }
    	   
    	   }
    	   
    	   
    }
    

    posso aggiungere il metodo che mi dici tu per avere la chiave di sicurezza??
    sennò mi puoi postare un esempio x scansionare? perchè io l'ho preso su intenet in un esempio...
    l'unica cosa che ho aggiunto io è il GPS per sapere dove trovo gli hotspot
  • Re: Chiarimento maps e implementazione

    Il codice per fare la scansione è quello lì, ci sono diversi problemi di altra natura (perché quando premi back devi lanciare un nuovo intent? Il back-stack serve apposta per questo motivo), ma non interferiscono con quello che chiedi.
    Una cosa che può interferire, però, è che ad ogni nuova scansione tu inserisci nel DB tutti i valori che ti vengono restituiti dalla scansione, senza verificare se un determinato access point è già presente nel DB o meno (a meno che tu non faccia questa cosa all'interno del metodo "addAccessPoint"). Di conseguenza è altamente probabile che all'interno del DB venga salvato più volte lo stesso access point con diverse posizioni tutte molto vicine; ad esempio se sei in un determinato punto e ti sposti di 1 metro allora grosso modo gli access point che riesci a rilevare sono sempre gli stessi, ma il sensore GPS ti restituirà coordinate diverse. Come conseguenza sulla mappa ti troverai tanti marker tutti appiccicati che si riferiscono allo stesso AP.
    Quindi può darsi che il problema che hai sia dovuto a questa cosa qua.

    Per quanto riguarda il codice che ti ho postato prima si, puoi usarlo tranquillamente ed è funzionante, perché l'ho preso dal codice sorgente di android
  • Re: Chiarimento maps e implementazione

    Anche io ho pensato che ripete gli accesspoint nell'inserimento, come posso correggere? perchè la classe db helper l'ho presa da un esempio online sempre...
    ti mostro il metodo di inserimento, e poi correggerò la sicurezza perchè in quel pezzo di codice che ho messo io purtroppo disegna l'access point in tutti e 2 i modi sia rosso che verde, deduco perchè la stringa è costitutita da tutti quei parametri...

    l'unica cosa che ti chiedo come mai il metodo getSecurity resituisce un INT?
    perchè ho provato ad inserirlo il metodo che mi hai dato tu ma mi dice di creare varabili tipo
    SECURiTY_WEP = 0; per questo non capisco....io per ora salvo ciò che è stringa e mettendo free la rete di casa mia ho visto che il wireless per essere free ed accessibile a tutti non contiene [WPA-TKIP] e contiene solo [WPS][ESS] oppure solo [ESS](quest ultimo provato con l'hotspot di un telefono android senza protezione, per quello ti chiedo chiarimento... Purtroppo sto ideando questa app per un maledetto esame all'uni

    cmq questo è il codice di inserimento dell'accesspoint nel db
    public void addAccessPoint(AccessPoint ap){
            Log.d("accesspoint", ap.toString());
            // 1. get reference to writable DB
            SQLiteDatabase db = this.getWritableDatabase();
     
            // 2. create ContentValues to add key "column"/value
            ContentValues values = new ContentValues();
            values.put(KEY_SSID, ap.getName()); // get name rete 
            values.put(KEY_SECURITY, ap.getSecurity()); //get security
            values.put(KEY_COPERTURE, ap.getCoperture());// get coperture
            values.put(KEY_LATITUDE, ap.getLatitude());
            values.put(KEY_LONGITUDE, ap.getLongitude());
            // 3. insert
            db.insert(TABLE_ACCESSPOINT, // table
                    null, //nullColumnHack
                    values); // key/value -> keys = column names/ values = column values
     
            // 4. close
            db.close(); 
            
            
        }  
    
  • Re: Chiarimento maps e implementazione

    Non è così semplice, perché più access point possono avere lo stesso SSID: pensa ad un'università, che ha tanti access point fisicamente disposti in punti diversi (quindi diverse coordinate), ma ha lo stesso SSID.
    Una soluzione potrebbe essere quella di trattare due AP con lo stesso SSID come se fossero lo stesso AP, se essi hanno coordinate "simili" (es: la loro distanza è inferiore a, giusto per dire un numero, 1Km). La cosa si complica, e non di poco, perché ti serve un modo per calcolare la distanza fra due punti (e, poiché la terra è circa sferica, bisogna usare formule abbastanza complicate, oppure una libreria, tipo questa), devi lavorare molto col DB, ecc..

    Una soluzione più semplice è fare finta che l'SSID sia unico (la maggior parte delle persone lascia l'SSID che il router propone di default, e di solito è unico) e trattarlo come chiave della tabella. In questo modo se tenti di inserire un nuovo AP con lo stesso SSID il DB ti darà un errore, che potrai ignorare (in questo modo manterrai le coordinate "vecchie") oppure potrai sovrascrivere la riga vecchia con quella nuova..
  • Re: Chiarimento maps e implementazione

    Grazie mille....

    eh infatti io ho notato che molti di noi usano la rete e la lasciano chiamata come tale....
    nella mia uni le reti hanno tutte nomi diversi, tipo campus, studenti, ateneo, ospiti ecc e direi che essendo nomi diversi non si pone....
    Direi quindi per semplificare la vita di mettere come primary key il nome della rete....

    Per quanto riguarda la sicurezza come posso risolvere quell'ultimo mio intoppo??

    In ogni caso come io metto una rete free lui me la trova e mi disegna due marker uno rosso(indicante la rete private ad esempio alice 1234) e poi disegna il marker verde stesso nome della rete alice 1234
  • Re: Chiarimento maps e implementazione

    Eh li dovresti studiare il codice oppure usare il debugger per capire il perché..la seconda via direi che è più veloce!


    Sent from my iPhone using Tapatalk
  • Re: Chiarimento maps e implementazione

    Della ha scritto:


    Eh li dovresti studiare il codice oppure usare il debugger per capire il perché..la seconda via direi che è più veloce!


    Sent from my iPhone using Tapatalk

    proverò domani allora...perchè io analizzo come è scritta la stringa...

    ultima domanda mi da errore mettere il primary key cosi:
     public void onCreate(SQLiteDatabase db) {  
            String CREATE_HOTSPOT_TABLE = "CREATE TABLE hotspot ( " +
                    "id INTEGER AUTOINCREMENT, " + 
                    "name PRIMARY KEY TEXT, "+
                    "security TEXT, " +
                    "coperture DOUBLE," +
                    "latitude DOUBLE," +
                    "longitude DOUBLE)";
            // create hotspot table
            db.execSQL(CREATE_HOTSPOT_TABLE);

    mi da errore sull'id dove c'è autoincrement
  • Re: Chiarimento maps e implementazione

    Beh quel campo serviva prima come chiave, ora non ti serve più quindi puoi eliminarlo direttamente..
    L'errore comunque è dato dal fatto che in SQLite AUTOINCREMENT è valido solo se il campo è chiave primaria


    Sent from my iPhone using Tapatalk
  • Re: Chiarimento maps e implementazione

    Della ha scritto:


    Beh quel campo serviva prima come chiave, ora non ti serve più quindi puoi eliminarlo direttamente..
    L'errore comunque è dato dal fatto che in SQLite AUTOINCREMENT è valido solo se il campo è chiave primaria


    Sent from my iPhone using Tapatalk
    e non posso mettere doppia chiave primaria come in MYSQL?
    io in mysql avevo messo username e email come chiavi primarie in modo tale che non potevano essere ripetute
  • Re: Chiarimento maps e implementazione

    Attenzione non è una doppia chiave, ma una chiave composta (formata, cioè, da due o più campi). Se tu hai creato una chiave tipo
    PRIMARY KEY (username, psw)[\code] vuol dire che può esistere una sola coppia username/psw nella tabella..per cui due utenti che scelgono stesso username ma diversa password possono farlo, cosa che non è ragionevole..
    Di conseguenza se tu crei una chiave composta (id, SSID) non stai dicendo che l'SSID è unico, ma che lo è la coppia dei due valori, cosa in contrasto con quanto detto prima.
    Quindi la chiave è il solo SSID, mentre l'id è inutile..
    
    
    Sent from my iPhone using Tapatalk
  • Re: Chiarimento maps e implementazione

    Ah ok grazie mille! Domani aggiorno la cosa! Posso chiederti un altro favore mi posti la guida di android dove hai preso la sicurezza??
  • Re: Chiarimento maps e implementazione

    Nessuna guida, solo il codice sorgentre :
  • Re: Chiarimento maps e implementazione

    Mi spiace disturbarti ancora per la cosa del DB:
    ho modificato cosi:
    public void onCreate(SQLiteDatabase db) {  
            String CREATE_HOTSPOT_TABLE = "CREATE TABLE hotspot ( " +
                    "name PRIMARY KEY TEXT, "+
                    "security TEXT, " +
                    "coperture DOUBLE," +
                    "latitude DOUBLE," +
                    "longitude DOUBLE)";
            // create hotspot table
            db.execSQL(CREATE_HOTSPOT_TABLE);
        }

    solo che mi da questo errore:
    07-05 11:42:54.536: E/SQLiteLog(12081): (1) near "TEXT": syntax error
    07-05 11:42:54.537: D/AndroidRuntime(12081): Shutting down VM
    07-05 11:42:54.537: W/dalvikvm(12081): threadid=1: thread exiting with uncaught exception (group=0x40d0e9a8)
    07-05 11:42:54.545: E/AndroidRuntime(12081): FATAL EXCEPTION: main
    07-05 11:42:54.545: E/AndroidRuntime(12081): java.lang.RuntimeException: Error receiving broadcast Intent { act=android.net.wifi.SCAN_RESULTS flg=0x8000010 } in com.example.wifihotspotfinder.SearchHotspotsActivity$WifiScanReceiver@41070028
    07-05 11:42:54.545: E/AndroidRuntime(12081): 	at android.app.LoadedApk$ReceiverDispatcher$Args.run(LoadedApk.java:798)
    07-05 11:42:54.545: E/AndroidRuntime(12081): 	at android.os.Handler.handleCallback(Handler.java:800)
    07-05 11:42:54.545: E/AndroidRuntime(12081): 	at android.os.Handler.dispatchMessage(Handler.java:100)
    07-05 11:42:54.545: E/AndroidRuntime(12081): 	at android.os.Looper.loop(Looper.java:194)
    07-05 11:42:54.545: E/AndroidRuntime(12081): 	at android.app.ActivityThread.main(ActivityThread.java:5371)
    07-05 11:42:54.545: E/AndroidRuntime(12081): 	at java.lang.reflect.Method.invokeNative(Native Method)
    07-05 11:42:54.545: E/AndroidRuntime(12081): 	at java.lang.reflect.Method.invoke(Method.java:525)
    07-05 11:42:54.545: E/AndroidRuntime(12081): 	at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:833)
    07-05 11:42:54.545: E/AndroidRuntime(12081): 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600)
    07-05 11:42:54.545: E/AndroidRuntime(12081): 	at dalvik.system.NativeStart.main(Native Method)
    07-05 11:42:54.545: E/AndroidRuntime(12081): Caused by: android.database.sqlite.SQLiteException: near "TEXT": syntax error (code 1): , while compiling: CREATE TABLE hotspot ( name PRIMARY KEY TEXT, security TEXT, coperture DOUBLE,latitude DOUBLE,longitude DOUBLE)
    07-05 11:42:54.545: E/AndroidRuntime(12081): 	at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method)
    07-05 11:42:54.545: E/AndroidRuntime(12081): 	at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:886)
    07-05 11:42:54.545: E/AndroidRuntime(12081): 	at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:497)
    07-05 11:42:54.545: E/AndroidRuntime(12081): 	at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588)
    07-05 11:42:54.545: E/AndroidRuntime(12081): 	at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:58)
    07-05 11:42:54.545: E/AndroidRuntime(12081): 	at android.database.sqlite.SQLiteStatement.<init>(SQLiteStatement.java:31)
    07-05 11:42:54.545: E/AndroidRuntime(12081): 	at android.database.sqlite.SQLiteDatabase.executeSql(SQLiteDatabase.java:1663)
    07-05 11:42:54.545: E/AndroidRuntime(12081): 	at android.database.sqlite.SQLiteDatabase.execSQL(SQLiteDatabase.java:1594)
    07-05 11:42:54.545: E/AndroidRuntime(12081): 	at com.example.wifihotspotfinder.MySQLiteHelper.onCreate(MySQLiteHelper.java:37)
    07-05 11:42:54.545: E/AndroidRuntime(12081): 	at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:252)
    07-05 11:42:54.545: E/AndroidRuntime(12081): 	at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:164)
    07-05 11:42:54.545: E/AndroidRuntime(12081): 	at com.example.wifihotspotfinder.MySQLiteHelper.addAccessPoint(MySQLiteHelper.java:72)
    07-05 11:42:54.545: E/AndroidRuntime(12081): 	at com.example.wifihotspotfinder.SearchHotspotsActivity$WifiScanReceiver.onReceive(SearchHotspotsActivity.java:142)
    07-05 11:42:54.545: E/AndroidRuntime(12081): 	at android.app.LoadedApk$ReceiverDispatcher$Args.run(LoadedApk.java:788)
    07-05 11:42:54.545: E/AndroidRuntime(12081): 	... 9 more
    
  • Re: Chiarimento maps e implementazione

    Il LogCat spiega chiaramente qual è il problema: c'è un errore di sintassi SQL vicino a "text"..in particolare hai invertito l'ordine fra TEXT e PRIMARY KEY..


    Sent from my iPhone using Tapatalk
Devi accedere o registrarti per scrivere nel forum
31 risposte