quindi se per esempio uso il metodo post, da android carico un url del tipo http://localhost/test.php?barcode=code...però non devo avere come risposta una pagina html ma dei dati dal database. come faccio?
quindi se per esempio uso il metodo post, da android carico un url del tipo http://localhost/test.php?barcode=code...però non devo avere come risposta una pagina html ma dei dati dal database. come faccio?
puoi usare json ad es. JSON - Wikipedia
Ma a questo punto, imho, tanto vale usare la soluzione soap+webservice che ti è stata proposta inizialmente.
xyzi (05-02-13)
Originariamente inviato da xyzi
Per tornare i dati puoi usare la classe json.
In internet trovi tanti esempi
Inviato dal mio HTC Desire usando Androidiani App
xyzi (05-02-13)
Ragazzi, innanzitutto ringrazio tutti per le possibili soluzioni proposte.
Effettivamente ragionandoci un pò, penso che la soluzione iniziale soap+webservice sia la più praticabile. anche perchè quella di creare una socket era solo un suggerimento che mi è stato dato e non un imposizione... dunque penso che la via da seguire per creare questa simulazione tra il client e il server si quello dell'utilizzo della libreria KSOAP2. visto che mi sono accorto di essere veramente scarso vi sarei grato se mi aiutaste ad implementare questa parte.
questa il codice dell'activity principale in cui integro la libreria zxing:
quello da fare ora è inviare la stringa "barcode" al server http://localhost/test.php tramite la libreria ksoap2.codice:public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } public void doScan (View view) { IntentIntegrator integrator = new IntentIntegrator(this); integrator.initiateScan(); } public void onActivityResult (int requestCode, int resultCode, Intent intent) { IntentResult scanResult = IntentIntegrator.parseActivityResult(requestCode, resultCode, intent); if (scanResult != null) { String barcode; String format; barcode = scanResult.getContents(); format = scanResult.getFormatName(); EditText etBarcode = (EditText) findViewById(R.id.etBarcode); EditText etFormat = (EditText) findViewById(R.id.etFormat); etBarcode.setText(barcode); etFormat.setText(format); } }
cmq devo creare uno script php che risponde alle richieste come ad esempio in un form html. giusto?
EDIT: stavo cercando roba su internet e mi sto accorgendo che non avevo idea di cosa fosse un webservices! io so solo programmare in html e php!
Ultima modifica di xyzi; 05-02-13 alle 16:45 - Motivo: edit
da quanto ho capito non mi caca più nessuno.
a livello informativo, volevo dirvi che ho risolto quasi del tutto (mi mancano gli ultimi accorgimenti) utilizzando una richiesta HTTP con il metodo POST e inviando i dati dal server al client tramite il formato JSON!
Stavo provando l'activity che ho creato ma non riesco a capire perchè non funziona!!!
L'errore che da è “Errore nella connessione http android.os.NetworkOnMainThreadException”!
dove "bc"="8076809535236" è il codice a barre che invio al server.codice:public class HttpPostActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_http_post); final TextView textviewDatiRicevuti = (TextView) findViewById(R.id.datiRicevuti); Button buttonInviaDati = (Button) findViewById(R.id.buttonInviaDati); buttonInviaDati.setOnClickListener(new View.OnClickListener() { public void onClick(View view) { //invio richiesta textviewDatiRicevuti.setText(inviaDati()); } }); } public String inviaDati(){ String result = ""; String stringaFinale = ""; ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(); nameValuePairs.add(new BasicNameValuePair("bc","8076809535236")); InputStream is = null; //http post try{ HttpClient httpclient = new DefaultHttpClient(); HttpPost httppost = new HttpPost("http://10.0.2.2/supermercato/testp.php"); httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); HttpResponse response = httpclient.execute(httppost); HttpEntity entity = response.getEntity(); is = entity.getContent(); }catch(Exception e){ Log.e("TEST", "Errore nella connessione http "+e.toString()); } if(is != null){ //converto la risposta in stringa try{ BufferedReader reader = new BufferedReader(new InputStreamReader(is,"iso-8859-1"),8); StringBuilder sb = new StringBuilder(); String line = null; while ((line = reader.readLine()) != null) { sb.append(line + "\n"); } is.close(); result=sb.toString(); }catch(Exception e){ Log.e("TEST", "Errore nel convertire il risultato "+e.toString()); } //parsing dei dati arrivati in formato json try{ JSONArray jArray = new JSONArray(result); for(int i=0;i<jArray.length();i++){ JSONObject json_data = jArray.getJSONObject(i); Log.i("TEST","prezzo: "+json_data.getDouble("prezzo")+ ", categoria: "+json_data.getString("categoria")+ ", descrizione: "+json_data.getInt("descrizione") ); stringaFinale = json_data.getDouble("prezzo") + " " + json_data.getString("categoria") + " " + json_data.getInt("descrizione") + "\n\n"; } } catch(JSONException e){ Toast.makeText(getBaseContext(), "Prodotto non trovato!", Toast.LENGTH_LONG).show(); } } else{//is è null e non ho avuto risposta } return stringaFinale; } }
per simulare il sito, come già detto, ho usato xampp con le impostazioni predefinite e inserendo in "xampp\htdocs\supermercato" lo script "testp.php" che è:
i passi che eseguo sono: far partire da xampp sia apache che mysql e quindi far partire l'activity dall'emulatorecodice:<?php mysql_connect("localhost:3306","root",""); mysql_select_db("supermercato"); $q=mysql_query("SELECT prezzo,categoria,descrizione FROM prodotti WHERE barcode='".$_REQUEST['bc']."'"); while($e=mysql_fetch_assoc($q)) $output[]=$e; print(json_encode($output)); mysql_close(); ?>
ovviamente ho anche inserito nel manifest il permesso di accedere ad internet.
please help me!
il problema è appunto: NetworkOnMainThread
ovvero, stai svolgendo delle operazioni di rete (HttpClient e roba varia) nel thread principale della ui... una pratica che non è piu' ammessa (per fortuna).
le operazioni di comunicazione con la rete, le devi svolgere in un thread secondario (tramite un asynctask ad esempio)
Ultima modifica di IlSocio; 08-02-13 alle 12:47