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

Android Discussion :

Communication application Android et MySQL


Sujet :

Android

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2014
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Sénégal

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2014
    Messages : 27
    Points : 16
    Points
    16
    Par défaut Communication application Android et MySQL
    Bonjour tout le monde,

    Je me suis lancé dans la programmation android et après quelques lectures de tutos (http://www.enis-android-club.com/), j'ai décidé de faire un petit projet qui me liste les données d'une table (telephone avec les attributs id,Designation,Detail) que j'ai crée sous mysql.
    Voici les fichiers de codes que j'ai écris:
    - connexion.php
    - affichage_telephone.php
    - une classe ServiceHandler.java que j'ai pris à l'adresse http://pastebin.com/4VsfVvCA.
    - mon MainActivity.java

    connexion.php
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    <?php
    mysql_connect('localhost','root','');
    mysql_select_db('bdtigo');
    ?>
    affichage_telephone.php
    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
     
    <?php 
    // La table de réponse JSON
    $response = array();
    // connexion à la base
    include 'connexion.php';
    // recupérer les données de la table téléphone
    $result = mysql_query("select * from telephone") or die(mysql_error());
    // tester si on a recu des données ou non
    if (mysql_num_rows($result) > 0) {
        // Ajouter les valeurs à la liste
        $response["valeurs"] = array();
        while ($row = mysql_fetch_array($result)) {
            $ligne = array();
            $ligne["id"] = $row["id"];
            $ligne["Designation"] = $row["Designation"];
            $ligne["Detail"] = $row["Detail"];
            array_push($response["valeurs"], $ligne);
        }
        // cuccès
        $response["success"] = 1;
    	$response["message"] = "Les donnees sont bien recuperees";
        // encoder la réponse
        echo json_encode($response);
    } else {
        // on a rien trouvé
        $response["success"] = 0;
        $response["message"] = "Aucun telephone dans la base";
        echo json_encode($response);
    }
    ?>
    ServiceHandler.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
     
    public class ServiceHandler {
        static String response = null;
        public final static int GET = 1;
        public final static int POST = 2;
     
        public ServiceHandler() {}
        /*
        * Making service call
        * @url - url to make request
        * @method - http request method
        * */
        public String ServiceCall(String url, int method) {
            return this.ServiceCall(url, method, null);
        }
     
        /*
         * Making service call
         * @url - url to make request
         * @method - http request method
         * @params - http request params
         * */
        public String ServiceCall(String url, int method, List<NameValuePair> params) {
            try {
                // Client http
                DefaultHttpClient httpClient = new DefaultHttpClient();
                HttpEntity httpEntity = null;
                HttpResponse httpResponse = null;
                // Choisir mode requête http
                if (method == POST) {
                    HttpPost httpPost = new HttpPost(url);
                    // ajouter les paramètres post
                    if (params != null) {
                        httpPost.setEntity(new UrlEncodedFormEntity(params));
                    }
                    httpResponse = httpClient.execute(httpPost);
                } else if (method == GET) {
                    //
                    if (params != null) {
                        String paramString = URLEncodedUtils.format(params, "utf-8");
                        url += "?" + paramString;
                    }
                    HttpGet httpGet = new HttpGet(url);
                    httpResponse = httpClient.execute(httpGet);
                }
                httpEntity = httpResponse.getEntity();
                response = EntityUtils.toString(httpEntity);
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            } catch (ClientProtocolException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
            return response;
        }
    }
    MainActivity.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
     
    public class MainActivity extends ActionBarActivity{
        String urlGet = "http://10.0.2.2:82/AndroidWork/affichage_telephone.php";
        GetDataAsyncTask getData;
        String message;
        int success;
        ListView lv;
        List<String> maListDonnee;
        ArrayAdapter arrayadp;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            lv = (ListView) findViewById(R.id.listviewperso);
            maListDonnee = new ArrayList<>();
            getData = new GetDataAsyncTask();
            getData.execute();
        }
        private class GetDataAsyncTask extends AsyncTask<Void, Void, Void> {
            @Override
            protected void onPreExecute() {
                Log.i("add", "onPreExecute");
                super.onPreExecute();
            }
            @Override
            protected Void doInBackground(Void... params) {
                Log.i("add", " start doInBackground");
                ServiceHandler sh = new ServiceHandler();
                // Envoyer une requête sur l'url
                String jsonStr = sh.ServiceCall(urlGet, ServiceHandler.POST);
                Log.d("Response: ", jsonStr);
                if (jsonStr != null) {
                    try {
                        JSONObject jsonObj = new JSONObject(jsonStr);
                        // retourner valeur succèss
                        success = jsonObj.getInt("success");
                        Log.i("success", String.valueOf(success));
                        if (success == 0) {
                            // success=0 ==> On a un String = message
                            message = jsonObj.getString("message");
                            Log.i("message", message);
                        } else if (success == 1) {
                            // success=1 ==> On a un tableau des données = valeurs
                            JSONArray dataValues = jsonObj.getJSONArray("valeurs");
                            // Parcourir
                            for (int j = 0; j < dataValues.length(); j++) {
                                JSONObject values = dataValues.getJSONObject(j);
                                // returner la valeur de la colonne id dans valCol1...
                                String valCol1 = values.getString("id");
                                String valCol2 = values.getString("Designation");
                                String valCol3 = values.getString("Detail");
                                maListDonnee.add(valCol2);
                                Log.i("Row " + (j + 1), valCol2);
                            }
                        }
                    } catch (JSONException e) {
                        e.printStackTrace();
                    }
                } else {
                    Log.e("ServiceHandler", "Aucune donnee a cette adresse");
                }
                Log.i("add", " end doInBackground");
                return null;
            }
            @Override
            protected void onPostExecute(Void result) {
                Log.i("add", "onPostExecute");
                super.onPostExecute(result);
                if (success == 1) {
                    Toast.makeText(getApplicationContext(), "Bien recue ", Toast.LENGTH_LONG).show();
                    arrayadp = new ArrayAdapter(getApplicationContext(), android.R.layout.simple_list_item_1, maListDonnee);
                    lv.setAdapter(arrayadp);
                } else {
                    Toast.makeText(getApplicationContext(), "Erreur", Toast.LENGTH_LONG).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.menu_main, menu);
            return true;
        }
     
        @Override
        public boolean onOptionsItemSelected(MenuItem item) {
            int id = item.getItemId();
            if (id == R.id.action_settings) {
                return true;
            }
            return super.onOptionsItemSelected(item);
        }
    }
    J'ai rien comme erreur à l'exécution mais ça m'affiche pas de données, ma variable jsonStr ne recupère rien à l'adresse spécifiée.
    J'ai besoin d'aide pour comprendre c'est quoi le problème.

    Cordialement.

  2. #2
    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
    Bonjour,

    Remplacer:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            } catch (ClientProtocolException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
    Par:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    } catch (Exception e) { Log.e("ServiceHandler","Failed to retrieve data",e); }
    Ensuite, attention... les noms de membres (méthodes, variables) doivent commencer par une minuscule. Les majuscules sont réservées aux noms de type.

    ServiceHandler
    mais
    ServiceHandler.serviceCall(...)


    Pour finir,

    le PHP a bien été testé dans un browser avant ?
    (unit-testing: tester chaque bout de code individuellement, y compris dans les cas particulier: base de donnée offline, etc...).
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2014
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Sénégal

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2014
    Messages : 27
    Points : 16
    Points
    16
    Par défaut
    Bonjour nicroman,

    Merci pour ces précisions de noms de membres...j'ai remplacer le catch par votre code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    } catch (Exception e) { Log.e("ServiceHandler","Failed to retrieve data",e); }
    J'ai tester aussi mon php sur un browser, ça affiche les données mais l'extension mysql est obsolète donc j'ai fait des modifications sur mon fichier affichage_telephone.php:

    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
     
    <?php
    $response = array();
    $link = mysqli_connect("localhost","root","","bdtigo") or die("Erreur " . mysqli_error($link));
    $query = "select * from telephone" or die("Erreur.." . mysqli_error($link));
    $result = mysqli_query($link, $query);
    $response["valeurs"] = array();
    while($row = mysqli_fetch_array($result)) {
      //echo $row['Designation']."<br>";
      $ligne = array();
      $ligne["id"] = $row["id"];
      $ligne["Designation"] = $row["Designation"];
      $ligne["Detail"] = $row["Detail"];
      //mettre la ligne dans la table JSON
      array_push($response["valeurs"], $ligne);
    }
            $response["success"] = 1;
    	$response["message"] = "Les donnees sont bien recuperees";
    	echo json_encode($response);
    ?>
    Maintenant ça affiche les données sans erreur sur un browser. Mais par contre j'ai des erreur à l'exécution.
    Voilà la liste des erreurs.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    org.apache.http.conn.HttpHostConnectException: Connection to http://10.0.2.2:82 refused
    ....
     Caused by: java.lang.NullPointerException
                at com.android.internal.os.LoggingPrintStream.println(LoggingPrintStream.java:298)
    ....      
         Caused by: java.net.ConnectException: socket failed: EACCES (Permission denied)
    ....
    J'ai utilisé le browser de mon émulateur pour tester mon lien http://10.0.2.2:82/AndroidWork/affichage_telephone.php et ça affiche bien les données.

    Merci d'avance.

  4. #4
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2014
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Sénégal

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2014
    Messages : 27
    Points : 16
    Points
    16
    Par défaut
    Bonjours,

    Maintenant j'ai ces erreurs....
    Vous avez des idées, c'est dans la classe suivante :

    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
     
    public class ServiceHandler {
        static String response = null;
        public final static int GET = 1;
        public final static int POST = 2;
        public ServiceHandler() {}
        /*
        * Making service call
        * @url - url to make request
        * @method - http request method
        * */
        public String serviceCall(String url, int method) {
            return this.serviceCall(url, method, null);
        }
     
        /*
         * Making service call
         * @url - url to make request
         * @method - http request method
         * @params - http request params
         * */
        public String serviceCall(String url, int method, List<NameValuePair> params) {
            try {
                // Client http
                DefaultHttpClient httpClient = new DefaultHttpClient();
                HttpEntity httpEntity = null;
                HttpResponse httpResponse = null;
                // Choisir mode requête http
                if (method == POST) {
                    HttpPost httpPost = new HttpPost(url);
                    // ajouter les paramètres post
                    if (params != null) {
                        httpPost.setEntity(new UrlEncodedFormEntity(params));
                    }
                    httpResponse = httpClient.execute(httpPost);
                } else if (method == GET) {
                    if (params != null) {
                        String paramString = URLEncodedUtils.format(params, "utf-8");
                        url += "?" + paramString;
                    }
                    HttpGet httpGet = new HttpGet(url);
                    httpResponse = httpClient.execute(httpGet);
                }
                httpEntity = httpResponse.getEntity();
                response = EntityUtils.toString(httpEntity);
            } catch (Exception e) {
                Log.e("ServiceHandler","Failed to retrieve data",e);
            } 
            return response;
        }
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    org.apache.http.conn.HttpHostConnectException: Connection to http://10.0.2.2:82 refused   //Bon voila mon lien: "http://10.0.2.2:82/AndroidWork/affichage_telephone.php"
    at com.projetcode.technosmart.projettout.ServiceHandler.serviceCall(ServiceHandler.java:59)  //ligne httpResponse = httpClient.execute(httpPost);
    Merci d'avance.

  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
    Ben voilà... l'hote refuse la connection HTTP...

    C'est bien le port 82 ?
    Le parefeu local laisse bien arriver les requetes HTTP sur le 82 ?
    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
    Février 2014
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Sénégal

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2014
    Messages : 27
    Points : 16
    Points
    16
    Par défaut
    Oui c'est bien le port 82 et le parefeu local laisse bien arriver les requetes HTTP sur le 82.
    J'ai testé sur un browser et ça m'affiche les données de ma requête.

  7. #7
    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
    Question bête... l'appli a bien les droits d'accès à internet ?

    Sinon une copie compllete du logcat serait bienvenue (entre balises code)
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

Discussions similaires

  1. Application Android + BDD MySQL
    Par Sssss1 dans le forum Android
    Réponses: 2
    Dernier message: 02/02/2014, 08h43
  2. Connexion MySQL à une application Android
    Par te-san dans le forum API standards et tierces
    Réponses: 5
    Dernier message: 24/11/2011, 10h50
  3. Réponses: 4
    Dernier message: 20/07/2011, 14h03
  4. Envoyer des données depuis mon application android vers mysql
    Par bennour.mohamed dans le forum Android
    Réponses: 9
    Dernier message: 18/07/2011, 14h42
  5. Réponses: 0
    Dernier message: 16/05/2011, 21h09

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