2013-05-01 22 views
5

Próbuję wysłać trochę danych na moją stronę. Po kliknięciu przycisku, dane muszą być wysyłane na stronę internetowąJak wysłać dane do witryny za pomocą aplikacji na Androida

ale mam pewne błędy podczas Używam programu

po kliknięciu przycisku pojawi się ten komunikat „niestety aplikacja została zatrzymana”, a następnie go wyjdź z mojej aplikacji.

public class testInput extends Activity { 

Button Setbutton; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    // TODO Auto-generated method stub 
    super.onCreate(savedInstanceState); 


    setContentView(R.layout.test_input_page); 

    Setbutton=(Button)findViewById(R.id.setbtn); 

Setbutton.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      // TODO Auto-generated method stub 
     testInput ti=new testInput(); 
      //Create the intent 



      ti.postData("Sent Data"); 


    }); 

} 

public void postData(String toPost) { 
    // Create a new HttpClient and Post Header 
    HttpClient httpclient = new DefaultHttpClient(); 
    HttpPost httppost = new HttpPost("http://mysite.com/index.php"); 

    //This is the data to send 
    String MyName = toPost; //any data to send 

    try { 
    // Add your data 
    List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(1); 
    nameValuePairs.add(new BasicNameValuePair("action", MyName)); 

    httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); 

    // Execute HTTP Post Request 

    ResponseHandler<String> responseHandler = new BasicResponseHandler(); 
    String response = httpclient.execute(httppost, responseHandler); 

    //This is the response from a php application 
    String reverseString = response; 
    Toast.makeText(this, "response" + reverseString, Toast.LENGTH_LONG).show(); 

    } catch (ClientProtocolException e) { 
    Toast.makeText(this, "CPE response " + e.toString(), Toast.LENGTH_LONG).show(); 
    // TODO Auto-generated catch block 
    } catch (IOException e) { 
    Toast.makeText(this, "IOE response " + e.toString(), Toast.LENGTH_LONG).show(); 
    // TODO Auto-generated catch block 
    } 

    }//end postData() 

To jest mój kod PHP.

<?php 

//code to reverse the string 

$reversed = strrev($_POST["action"]); 

echo $reversed; 

?> 

Mam pozwolenie również do korzystania z Internetu w mojej aplikacji.

+0

Nie wspomniałeś o błędach, które otrzymujesz. –

+0

Czy otrzymałeś coś, co działa? Jeśli tak, opublikuj post, aby pomóc wszystkim. Dzięki! – jkw4703

Odpowiedz

3

Od wersji Android 3.x nie można wykonywać operacji sieciowych w wątku głównym. Musisz użyć AsyncTask lub oddzielnego wątku, w którym możesz wywołać metodę postData.

http://developer.android.com/reference/android/os/NetworkOnMainThreadException.html

+0

Dziękuję, czy możesz wyjaśnić to dalej? Ponieważ jestem nowy w rozwoju Androida – Tikitaka

+0

http://stackoverflow.com/a/9671602/527759 http://developer.android.com/reference/android/os/AsyncTask .html – httpdispatch

0

Oto fragment kodu, mając nadzieję, że to pomoże.

1) Funkcja, która wykonuje usługę HTTP GET

private String SendDataFromAndroidDevice() { 
    String result = ""; 

    try { 
     HttpClient httpclient = new DefaultHttpClient(); 
     HttpGet getMethod = new HttpGet("your url + data appended"); 

     BufferedReader in = null; 
     BasicHttpResponse httpResponse = (BasicHttpResponse) httpclient 
       .execute(getMethod); 
     in = new BufferedReader(new InputStreamReader(httpResponse 
       .getEntity().getContent())); 

     StringBuffer sb = new StringBuffer(""); 
     String line = ""; 
     while ((line = in.readLine()) != null) { 
      sb.append(line); 
     } 
     in.close(); 
     result = sb.toString(); 


    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    return result; 
} 

2) klasy, która rozciąga AsyncTask

private class HTTPdemo extends 
     AsyncTask<String, Void, String> { 

    @Override 
    protected void onPreExecute() {} 

    @Override 
    protected String doInBackground(String... params) { 
     String result = SendDataFromAndroidDevice(); 
     return result; 
    } 

    @Override 
    protected void onProgressUpdate(Void... values) {} 

    @Override 
    protected void onPostExecute(String result) { 

     if (result != null && !result.equals("")) { 
      try { 
       JSONObject resObject = new JSONObject(result); 

       } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 
    } 
} 

3) Wewnątrz onCreate metody

 @Override 
public void onCreate(Bundle savedInstanceState) { 

    super.onCreate(savedInstanceState); 
    setContentView("your layout"); 



    if ("check here where network/internet is avaliable") { 

     new HTTPdemo().execute(""); 
    } 

    } 

kodu Snippet dostarczony przeze mnie działa w następujący sposób,

1) urządzenie Android wysłać adres URL + dane do serwera

2) Server [powiedzieć PHP używany] odbierać dane i daje potwierdzenie

teraz kod, który należy wpisać po stronie klienta (Android) jest przewidziany do ciebie, później część otrzymaniu tych danych na serwerze jest

  • Server musi odbierać dane
  • Wdrożenie funkcjonalności na stronie serwera
  • To funkcjonalność [serwis internetowy] zostanie wywołany gdy android będzie apelować URL + dane
  • Gdy masz dane, manipulować go jak chcesz
+0

Dziękuję Czy mój kod PHP jest przydatny po stronie serwera? – Tikitaka

+0

Czy mój obecny kod PHP jest przydatny do uzyskania danych? – Tikitaka

2

użyj następującego kodu

HttpClient httpclient = new DefaultHttpClient(); 
HttpPost httppost = new HttpPost("http://yoursite.com/index.php"); 

String MyName = toPost; 

try 
{ 
    List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(1); 
    nameValuePairs.add(new BasicNameValuePair("action", MyName)); 

    httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); 

    HttpResponse response = httpclient.execute(httppost); 

    InputStream is = response.getEntity().getContent(); 

    BufferedReader br = new BufferedReader(new InputStreamReader(is)); 

    result = br.readLine(); 
    //This is the response from a php application 
    String reverseString = result; 
    Toast.makeText(this, "result" + reverseString, Toast.LENGTH_LONG).show(); 
} 
catch(Exception e) 
{ 
    Toast.makeText(this, ""+e, Toast.LENGTH_LONG).show(); 
} 
1
i hope this help u alloott 
package com.example.test; 

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.InputStreamReader; 
import java.util.ArrayList; 
import java.util.List; 

import org.apache.http.HttpResponse; 
import org.apache.http.NameValuePair; 
import org.apache.http.client.ClientProtocolException; 
import org.apache.http.client.HttpClient; 
import org.apache.http.client.ResponseHandler; 
import org.apache.http.client.entity.UrlEncodedFormEntity; 
import org.apache.http.client.methods.HttpPost; 
import org.apache.http.impl.client.BasicResponseHandler; 
import org.apache.http.impl.client.DefaultHttpClient; 
import org.apache.http.message.BasicNameValuePair; 

import android.os.AsyncTask; 
import android.os.Bundle; 
import android.app.Activity; 
import android.util.Log; 
import android.view.Menu; 
import android.view.View; 
import android.widget.Button; 
import android.widget.EditText; 
import android.widget.Toast; 

public class MainActivity extends Activity { 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    Button but=(Button)findViewById(R.id.button1); 
    but.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      // TODO Auto-generated method stub 
      postData(); 

     } 
    }); 


} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.main, menu); 
    return true; 
} 
public void postData() { 
    // Create a new HttpClient and Post Header 
    class ss extends AsyncTask<Void, Void, String> 
    { 

    @Override 
    protected String doInBackground(Void... params) { 
     // TODO Auto-generated method stub 
     HttpClient httpclient = new DefaultHttpClient(); 
     String result = null; 
     HttpPost httppost = new HttpPost("http://www.techdoo.com/test.php"); 

     try 
     { 

     List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(1); 
     nameValuePairs.add(new BasicNameValuePair("action", "fadeel")); 

     httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); 

     HttpResponse response = httpclient.execute(httppost); 

     InputStream is = response.getEntity().getContent(); 

     BufferedReader br = new BufferedReader(new InputStreamReader(is)); 

     result = br.readLine(); 
     //This is the response from a php application 
     String reverseString = result; 
     EditText edit1=(EditText)findViewById(R.id.editText1); 
     edit1.setText(result); 
     // Toast.makeText(this, "result" + reverseString, Toast.LENGTH_LONG).show(); 
     } 
     catch(Exception e) 
     { 
     //Toast.makeText(this, ""+e, Toast.LENGTH_LONG).show(); 
     } 
     return result; 
    } 
    @Override 
     protected void onPostExecute(String result) { 
      // TODO Auto-generated method stub 
     if(result==null) 
     { 
      Toast.makeText(getApplicationContext(), "not ok", Toast.LENGTH_LONG).show(); 
     } 
     else 
      Toast.makeText(getApplicationContext(), result, Toast.LENGTH_LONG).show(); 

      super.onPostExecute(result); 
     } 

    } 
    ss s=new ss(); 
    s.execute(null,null,null); 
} 

}

+0

FYI - Próbowałem metody postData() w moim kodzie i od 2015-06-14 metody i HttpResponse, HttpClient i NameValuePair są nieaktualne. Nie mogłem go uruchomić, ale to było po prostu dlatego, że zapomniałem o dodaniu uprawnienia do pliku android.permission.INTERNET. Ten kod działa. – raddevus