IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

API standards et tierces Android Discussion :

Envoi de données d'une application vers un serveur


Sujet :

API standards et tierces Android

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2013
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2013
    Messages : 25
    Points : 12
    Points
    12
    Par défaut Envoi de données d'une application vers un serveur
    Bonjour, je développe une application Android et après un bon bout de temps passé sur la partie interface graphique je m'attaque à la partie communication avec le serveur. Pour cela je m’entraîne actuellement sur un tutoriel que j'avais un peu modifié mais j'avais eu des erreurs du coup j'ai réessayé et je pense que j'ai la même chose que dans le tuto au mot près. Problème les mêmes erreurs apparaissent dans le logcat!

    Voilà le code PHP:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <?php
    	if (isset($_POST) && !empty($_POST)) {
     
    		extract($_POST);
     
    		$db = mysql_connect('localhost', 'root', 'root'); //chemin pour se co a la bdd
    		mysql_select_db('gsctuto', $db);
    		$sql = "insert INTO information (message) VALUES ('$message')";
    		mysql_query($sql);
    	} 
     
    			?>
    et le code Java:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    package com.lagwil.testandroidrestclient;
     
    import java.io.IOException;
    import java.io.InputStream;
    import java.util.ArrayList;
    import java.util.List;
     
    import org.apache.http.NameValuePair;
    import org.apache.http.client.ClientProtocolException;
    import org.apache.http.client.HttpClient;
    import org.apache.http.client.entity.UrlEncodedFormEntity;
    import org.apache.http.client.methods.HttpPost;
    import org.apache.http.impl.client.DefaultHttpClient;
    import org.apache.http.message.BasicNameValuePair;
     
    import android.os.Bundle;
    import android.support.v4.app.Fragment;
    import android.support.v7.app.ActionBarActivity;
    import android.view.LayoutInflater;
    import android.view.Menu;
    import android.view.MenuItem;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.Button;
    import android.widget.EditText;
    import android.widget.Toast;
     
    public class MainActivity extends ActionBarActivity {
     
    	EditText edtMsg;
    	Button btnEnvoyer;
    	String resultat = null;
    	InputStream is = null;
    	StringBuilder sb = null;
     
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
     
            edtMsg = (EditText)findViewById(R.id.edtMsg);
            btnEnvoyer = (Button)findViewById(R.id.btnEnvoyer);
        }
     
        public void envoyerMessage(View v){
        	HttpClient client = new DefaultHttpClient();
        	HttpPost post = new HttpPost("http://adresse_ip/eclipse/PremierProjet/newfile.php"); //adresse IP du pc/fichier de sauvegarde/nom du projet php/nom du fichier
        	String msg = edtMsg.getText().toString();
        	if (msg.length() >0){
        		try{
        			List<NameValuePair> donnees = new ArrayList<NameValuePair>(1);
        			donnees.add(new BasicNameValuePair("message", msg));
        			post.setEntity(new UrlEncodedFormEntity(donnees));
        			client.execute(post);
        			edtMsg.setText("");
        			Toast.makeText(this, "Message envoyé", Toast.LENGTH_SHORT).show();
        		}
        		catch(ClientProtocolException e){
        			e.printStackTrace();
        		}
        		catch(IOException e){
        			e.printStackTrace();
        		}
        	}
        	else 
        		Toast.makeText(this, "Ce champs ne peut etre vide!", Toast.LENGTH_SHORT).show();
        }
     
        @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;
        }
     
        @Override
        public boolean onOptionsItemSelected(MenuItem item) {
            // Handle action bar item clicks here. The action bar will
            // automatically handle clicks on the Home/Up button, so long
            // as you specify a parent activity in AndroidManifest.xml.
            int id = item.getItemId();
            if (id == R.id.action_settings) {
                return true;
            }
            return super.onOptionsItemSelected(item);
        }
     
        /**
         * A placeholder fragment containing a simple view.
         */
        public static class PlaceholderFragment extends Fragment {
     
            public PlaceholderFragment() {
            }
     
            @Override
            public View onCreateView(LayoutInflater inflater, ViewGroup container,
                    Bundle savedInstanceState) {
                View rootView = inflater.inflate(R.layout.fragment_main, container, false);
                return rootView;
            }
        }
     
    }
    Bien sûr je n'ai pas oublié la permission dans le manifest.

    Et dans le logcat j'ai ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    07-02 15:26:34.273: E/AndroidRuntime(11154): FATAL EXCEPTION: main
    07-02 15:26:34.273: E/AndroidRuntime(11154): java.lang.IllegalStateException: Could not execute method of the activity
    07-02 15:26:34.273: E/AndroidRuntime(11154): 	at android.view.View$1.onClick(View.java:3758)
    07-02 15:26:34.273: E/AndroidRuntime(11154): 	at android.view.View.performClick(View.java:4377)
    07-02 15:26:34.273: E/AndroidRuntime(11154): 	at android.view.View$PerformClick.run(View.java:18044)
    07-02 15:26:34.273: E/AndroidRuntime(11154): 	at android.os.Handler.handleCallback(Handler.java:725)
    07-02 15:26:34.273: E/AndroidRuntime(11154): 	at android.os.Handler.dispatchMessage(Handler.java:92)
    07-02 15:26:34.273: E/AndroidRuntime(11154): 	at android.os.Looper.loop(Looper.java:137)
    07-02 15:26:34.273: E/AndroidRuntime(11154): 	at android.app.ActivityThread.main(ActivityThread.java:5306)
    07-02 15:26:34.273: E/AndroidRuntime(11154): 	at java.lang.reflect.Method.invokeNative(Native Method)
    07-02 15:26:34.273: E/AndroidRuntime(11154): 	at java.lang.reflect.Method.invoke(Method.java:511)
    07-02 15:26:34.273: E/AndroidRuntime(11154): 	at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1102)
    07-02 15:26:34.273: E/AndroidRuntime(11154): 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:869)
    07-02 15:26:34.273: E/AndroidRuntime(11154): 	at dalvik.system.NativeStart.main(Native Method)
    07-02 15:26:34.273: E/AndroidRuntime(11154): Caused by: java.lang.reflect.InvocationTargetException
    07-02 15:26:34.273: E/AndroidRuntime(11154): 	at java.lang.reflect.Method.invokeNative(Native Method)
    07-02 15:26:34.273: E/AndroidRuntime(11154): 	at java.lang.reflect.Method.invoke(Method.java:511)
    07-02 15:26:34.273: E/AndroidRuntime(11154): 	at android.view.View$1.onClick(View.java:3753)
    07-02 15:26:34.273: E/AndroidRuntime(11154): 	... 11 more
    07-02 15:26:34.273: E/AndroidRuntime(11154): Caused by: android.os.NetworkOnMainThreadException
    07-02 15:26:34.273: E/AndroidRuntime(11154): 	at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1128)
    07-02 15:26:34.273: E/AndroidRuntime(11154): 	at libcore.io.BlockGuardOs.connect(BlockGuardOs.java:84)
    07-02 15:26:34.273: E/AndroidRuntime(11154): 	at libcore.io.IoBridge.connectErrno(IoBridge.java:127)
    07-02 15:26:34.273: E/AndroidRuntime(11154): 	at libcore.io.IoBridge.connect(IoBridge.java:112)
    07-02 15:26:34.273: E/AndroidRuntime(11154): 	at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:192)
    07-02 15:26:34.273: E/AndroidRuntime(11154): 	at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:459)
    07-02 15:26:34.273: E/AndroidRuntime(11154): 	at java.net.Socket.connect(Socket.java:842)
    07-02 15:26:34.273: E/AndroidRuntime(11154): 	at org.apache.http.conn.scheme.PlainSocketFactory.connectSocket(PlainSocketFactory.java:119)
    07-02 15:26:34.273: E/AndroidRuntime(11154): 	at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:144)
    07-02 15:26:34.273: E/AndroidRuntime(11154): 	at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164)
    07-02 15:26:34.273: E/AndroidRuntime(11154): 	at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119)
    07-02 15:26:34.273: E/AndroidRuntime(11154): 	at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:360)
    07-02 15:26:34.273: E/AndroidRuntime(11154): 	at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555)
    07-02 15:26:34.273: E/AndroidRuntime(11154): 	at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487)
    07-02 15:26:34.273: E/AndroidRuntime(11154): 	at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465)
    07-02 15:26:34.273: E/AndroidRuntime(11154): 	at com.lagwil.testandroidrestclient.MainActivity.envoyerMessage(MainActivity.java:54)
    07-02 15:26:34.273: E/AndroidRuntime(11154): 	... 14 more
    Les erreurs sont-elles liées à une différence de version d'API (10 pour le tuto, 19 pour la mienne) ?
    Je ne suis pas certain non plus de la façon dont j'envoi des données dans le POST, dois-je mettre l'adresse IP de mon pc? et eclipse est-il bien le fichier par défaut où s'enregistre les projets?
    Enfin que sont les erreurs:
    java.lang.reflect.InvocationTargetException
    android.os.NetworkOnMainThreadException ??
    Après une petite recherche j'ai appris que la première apparaissait lorque une ressource particulière était nulle et pour la seconde j'ai vu que je devais peut être utiliser AsyncTask...

    Voilà j'espère que c'est compréhensible et que quelqu'un pourra m'aider! Merci d'avance

  2. #2
    Membre éclairé
    Avatar de LeBzul
    Homme Profil pro
    Inscrit en
    Décembre 2008
    Messages
    381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Décembre 2008
    Messages : 381
    Points : 832
    Points
    832
    Par défaut
    Salut,
    Tu n'aurais pas activé le StrictMode dans les options développeurs de ton telephone ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Caused by: android.os.NetworkOnMainThreadException
    at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1128)
    "Quand la lune n'est pas là, la nuit mène une existence obscure"

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2013
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2013
    Messages : 25
    Points : 12
    Points
    12
    Par défaut
    Eh bien je viens de vérifier et non le "mode strict" n'est pas coché sur mon téléphone

    Edit: en fait l'application démarre bien, je peux écrire un message mais au moment ou je clique sur envoyer ça bug

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 6
    Points : 10
    Points
    10
    Par défaut
    Bonjour,

    Ta fonction envoyerMessage() fait un appel réseau (en l’occurrence utilisation des classes HttpClient et HttpPost).
    Or, Android interdit qu'un appel réseau soit fait dans le même thread que l'UI (on Activity).

    Pour résoudre ce problème tu dois appeler ta méthode envoyerMessage() dans un thread séparé.
    Tu peux par exemple utiliser une AsyncTask (et c'est dans la méthode doInBackground() que tu lance tes appels réseau).

  5. #5
    Expert éminent

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Points : 7 618
    Points
    7 618
    Billets dans le blog
    3
    Par défaut
    Or, Android interdit qu'un appel réseau soit fait dans le même thread que l'UI (on Activity).


    Juste pour préciser la chose... ce n'est pas tant qu'Android l'interdise.... Toute programmation propre interdit de faire des opérations potentiellement lentes (appels database, lecture fichier, ... et donc a fortiori appel à un serveur distant) au milieu de la gestion d'un événement de l'interface.
    Android s'assure juste que la partie "réseau" est bien respectée (NetworkOnMainThreadException). Rien ne dit qu'il ne le fera pas dans l'avenir pour d'autres choses (IOOnMainThreadException ? SQLOnMainThreadException ?).


    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  6. #6
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2013
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2013
    Messages : 25
    Points : 12
    Points
    12
    Par défaut
    Citation Envoyé par Guicara Voir le message
    Bonjour,

    Ta fonction envoyerMessage() fait un appel réseau (en l’occurrence utilisation des classes HttpClient et HttpPost).
    Or, Android interdit qu'un appel réseau soit fait dans le même thread que l'UI (on Activity).

    Pour résoudre ce problème tu dois appeler ta méthode envoyerMessage() dans un thread séparé.
    Tu peux par exemple utiliser une AsyncTask (et c'est dans la méthode doInBackground() que tu lance tes appels réseau).
    Qu'est ce qu'un thread?

  7. #7
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2013
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2013
    Messages : 25
    Points : 12
    Points
    12
    Par défaut
    Bonjour,
    finalement j'ai tout changé, un collègue a crée un faux serveur en ligne pour que je puisse faire des tests. Donc j'essaie pour l'instant de récupérer des nombres avec un GET request.
    La fenêtre de l'application est toute simple il faut rentrer un nombre et cliquer sur le bouton en dessous et là le serveur doit vérifier si le nombre rentré est bon ou pas et alors l'application affiche un petit message avec un TOAST.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    package com.example.getrequest;
     
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.net.HttpURLConnection;
    import java.net.URL;
    import java.net.URLEncoder;
    import java.util.ArrayList;
     
    import org.apache.http.HttpEntity;
    import org.apache.http.HttpResponse;
    import org.apache.http.HttpStatus;
    import org.apache.http.NameValuePair;
    import org.apache.http.client.ClientProtocolException;
    import org.apache.http.client.HttpClient;
    import org.apache.http.client.methods.HttpGet;
    import org.apache.http.client.methods.HttpUriRequest;
    import org.apache.http.impl.client.DefaultHttpClient;
    import org.apache.http.message.BasicNameValuePair;
     
    import android.support.v7.app.ActionBarActivity;
    import android.content.Intent;
    import android.os.Bundle;
    import android.view.Menu;
    import android.view.MenuItem;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.Button;
    import android.widget.TextView;
    import android.widget.Toast;
     
     
    public class MainActivity extends ActionBarActivity implements OnClickListener{
     
    	Button button;
    	private URL connection;
    	private HttpClient client;
     
    	 @Override
    	    protected void onCreate(Bundle savedInstanceState){
    	        super.onCreate(savedInstanceState);
    	        setContentView(R.layout.activity_main);
     
    	        final Button sendButton = (Button) findViewById(R.id.button1);
    	        sendButton.setOnClickListener(this);
    	    }
     
    	        @Override
    	        public void onClick(View arg0) {
    	        	int number = 123;
    	        	if (checkNumber (number=123)){
                            Toast.makeText(this.getApplicationContext(), 
                                "This number is good", 
                                Toast.LENGTH_SHORT).show();
    	        	}
    	        	else{
    	        		Toast.makeText(this.getApplicationContext(), 
                                "This number is bad", 
                                Toast.LENGTH_SHORT).show();	
    	        	}
    	      }
     
    	 public boolean checkNumber(int i) {
    		    boolean isValid = false;
    		    try {
    		        HttpGet request = new HttpGet("http://91.112.0.130:8080/HotlineCall/checkNumber/" + i); 
    		        HttpClient client = new DefaultHttpClient();
    		        HttpResponse httpResponse = client.execute(request);
    		        isValid = httpResponse.getStatusLine().getStatusCode() == HttpStatus.SC_OK;
    		    } catch (ClientProtocolException e)  {
    		        client.getConnectionManager().shutdown();
    		        Toast.makeText(this.getApplicationContext(), e.getMessage(), Toast.LENGTH_LONG);
    		    } catch (IOException e) {
    		        client.getConnectionManager().shutdown();
    		        Toast.makeText(this.getApplicationContext(), e.getMessage(), Toast.LENGTH_LONG);
    		    } catch (Exception e) {
    		    	Toast.makeText(this.getApplicationContext(), e.getMessage(), Toast.LENGTH_LONG);
    		    }
    		    return isValid;
    		}
     
     
        @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;
        }
     
        @Override
        public boolean onOptionsItemSelected(MenuItem item) {
            // Handle action bar item clicks here. The action bar will
            // automatically handle clicks on the Home/Up button, so long
            // as you specify a parent activity in AndroidManifest.xml.
            int id = item.getItemId();
            if (id == R.id.action_settings) {
                return true;
            }
            return super.onOptionsItemSelected(item);
        }
    }
    Mon problème c'est que pour l'instant ça me renvoi toujours le même message "the number is bad" même quand je rentre 123... Une idée?
    J'ai remplacé les "e.printStackTrace();" par "Toast.makeText(this.getApplicationContext(), e.getMessage(), Toast.LENGTH_LONG);" parce qu'on m'a dit que ça permettait d'afficher l'erreur mais rien ne se passe..

    Merci pour vos réponses

Discussions similaires

  1. Réponses: 20
    Dernier message: 14/04/2013, 15h12
  2. [Débutant] Transfert des données d'une application vers Excel
    Par beaudelaire dans le forum ASP.NET
    Réponses: 1
    Dernier message: 09/04/2012, 10h33
  3. envoi de donnée d'une vue vers un controlleur
    Par lidybekham07 dans le forum ASP.NET MVC
    Réponses: 2
    Dernier message: 11/07/2010, 15h54
  4. Réponses: 4
    Dernier message: 15/05/2009, 13h29
  5. [PHP-JS] Envoi de données sur une même page...
    Par dudux dans le forum Langage
    Réponses: 8
    Dernier message: 14/09/2005, 13h51

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo