mercoledì 5 aprile 2017

Richieste HTTP su Android

Il problema da affrontare questa volta e' quello di creare un client http su Android per popolare i dati di un file csv che risiede su un server http.
La pagina Php sul server e' molto semplice e riceve dati latitudine/longitudine per scriverli su un file csv
--------------------------------
<?php
$lat = $_GET['lat'];
$lon = $_GET['lon'];
print $lat;
$list = array (
    array($lat, $lon)
);
$fp = fopen('file.csv', 'a+');
foreach ($list as $fields) {
    fputcsv($fp, $fields);
}
fclose($fp);
?>
--------------------------------

Non avevo fatto mai prove di client http su Android. Sono partito dalla libreria OkHttp, piu' che altro perche' erano disponibili molti esempi
Al primo tentativo sono incappato nell'errore android.os.NetworkOnMainThreadException. 
Cio' indica che il codice non puo' essere eseguito nel MainThread..ho provato a spostare il tutto in un Service ma stesso problema...alla fine la soluzione era quello di creare un AsyncTask...un po' contorto

Sul sito Developer di Android viene suggerito di utilizzare come client Http la libreria Volley.
Ok proviamoci...inserendo in  gradle la dipendenza a

compile'com.android.volley:volley:1.0.0'

viene generato un errore che Android Studio non riesce risolvere la libreria. Per farla breve ho scaricato da questo indirizzo http://api.androidhive.info/volley/volley.jar il file Jar e lo ho aggiunto alle librerie di Android Studio. Tutto Ok.

A questo punto si deve modificare il file Manifest.xml per l'accesso ad Internet

<uses-permission android:name="android.permission.INTERNET" />

--------------------------------
public class MainActivity extends AppCompatActivity {
    @Override    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        RequestQueue queue = Volley.newRequestQueue(this);
        String url ="http://c1p81.xxxxxxxxx.org/test/csv.php?lat=32.1";
        // Request a string response from the provided URL.        StringRequest stringRequest = new StringRequest(Request.Method.GET, url,
                new Response.Listener<String>() {
                    @Override                    public void onResponse(String response) {
                        Log.d("Debug","Risposta: "+ response.substring(0,4));
                    }
                }, new Response.ErrorListener() {
            @Override            public void onErrorResponse(VolleyError error) {
                Log.d("Debug","Errore");
            }
        });
        queue.add(stringRequest);
    }

}
--------------------------------

se si inserisce invece un pulsante con un OnClick Listener si deve modificare la parte di codice in giallo pena generare un errore di incompatible types: <anonymous OnClickListener> cannot be converted to Context

---------------------------------
public class MainActivity extends AppCompatActivity {
    private Button pulsante;

    @Override    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        pulsante = (Button) findViewById(R.id.button);
        pulsante.setOnClickListener(new View.OnClickListener() {
            @Override            public void onClick(View view) {
                RequestQueue queue = Volley.newRequestQueue(MainActivity.this);
                String url ="http://c1p81.xxxxxxxxx.org/test/csv.php?lat=32.1";
                // Request a string response from the provided URL.                StringRequest stringRequest = new StringRequest(Request.Method.GET, url,
                        new Response.Listener<String>() {
                            @Override                            public void onResponse(String response) {
                                Log.d("Debug","Risposta: "+ response.substring(0,4));
                            }
                        }, new Response.ErrorListener() {
                    @Override                    public void onErrorResponse(VolleyError error) {
                        Log.d("Debug","Errore");
                    }
                });
                queue.add(stringRequest);
            }
        });


    }

}