Partage
  • Partager sur Facebook
  • Partager sur Twitter

Problème de communication entre Android et Mysql

Sujet résolu
10 août 2015 à 5:34:41

Bonjour,

Je travail actuellement sur la mise en place d'une base de donnée externe pour mon application android. Mais voila, cela fait 2 tutoriels que j'essais, et a chaque fois qu'il s'agit de réaliser des opérations sur la base de donnée, l'application plante en disant "... s'est arrêté".

Voici les 2 tutos que j'ai suivi : 

http://www.enis-android-club.com/2014/04/tutoAndroidMysqlpart2.html

http://www.androidhive.info/2012/05/how-to-connect-android-with-php-mysql/

J'ai certaines fonctions qui sont barré avec la mention "depreciated" lorsque je passe la souris deçu, semblant vouloir dire qu'ils ne sont plus d'actualité ? Je ne sais pas si c'est la source du problème. DefaultHttpClient()HttpGet,  DefaultHttpClient ou encore NameValuePair sont barré. 

Je travail en localhost.

Je ne sais vraiment pas d'où vient le problème et si je dois remplacer toute ces fonctions je ne saurais vraiment pas comment m'y prendre.

Donc voilà si quelqu'un a une solution ou aurait un tutoriel fiable je suis preneur.

Ps : je suis sur Android studio et je débute. Je cherche un moyen pour chercher mes erreurs et je ne comprend toujours pas comment on utilise le Logcat après mes multiple recherche, il y a 1000 message que je ne comprend pas même en utilisant la liste déroulante. Quelque chose m'échappe ? 

Merci beaucoup.

  • Partager sur Facebook
  • Partager sur Twitter
10 août 2015 à 9:05:48

Salut,

Quand ton application plante, elle génère une stacktrace dans le logcat. Pour filtrer, tu peux régler le log level à "warn" et sélectionner uniquement ton application.

Sans le logcat et donc la stacktrace, impossible de t'aider.

  • Partager sur Facebook
  • Partager sur Twitter
10 août 2015 à 18:55:34

Salut et merci,

je copie colle le log cat en level warn :

08-10 18:47:46.599    7127-7386/five.androidfive W/System.err﹕ org.apache.http.conn.HttpHostConnectException: Connection to http://localhost refused
08-10 18:47:46.620    7127-7386/five.androidfive W/System.err﹕ at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:188)
08-10 18:47:46.620    7127-7386/five.androidfive W/System.err﹕ at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:169)
08-10 18:47:46.620    7127-7386/five.androidfive W/System.err﹕ at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:124)
08-10 18:47:46.621    7127-7386/five.androidfive W/System.err﹕ at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:365)
08-10 18:47:46.621    7127-7386/five.androidfive W/System.err﹕ at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:560)
08-10 18:47:46.621    7127-7386/five.androidfive W/System.err﹕ at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:492)
08-10 18:47:46.621    7127-7386/five.androidfive W/System.err﹕ at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:470)
08-10 18:47:46.622    7127-7386/five.androidfive W/System.err﹕ at five.androidfive.JSONParser.makeHttpRequest(JSONParser.java:65)
08-10 18:47:46.622    7127-7386/five.androidfive W/System.err﹕ at five.androidfive.AllproductsActivity$LoadAllProducts.doInBackground(AllproductsActivity.java:127)
08-10 18:47:46.622    7127-7386/five.androidfive W/System.err﹕ at five.androidfive.AllproductsActivity$LoadAllProducts.doInBackground(AllproductsActivity.java:105)
08-10 18:47:46.622    7127-7386/five.androidfive W/System.err﹕ at android.os.AsyncTask$2.call(AsyncTask.java:292)
08-10 18:47:46.622    7127-7386/five.androidfive W/System.err﹕ at java.util.concurrent.FutureTask.run(FutureTask.java:237)
08-10 18:47:46.622    7127-7386/five.androidfive W/System.err﹕ at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
08-10 18:47:46.622    7127-7386/five.androidfive W/System.err﹕ at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
08-10 18:47:46.622    7127-7386/five.androidfive W/System.err﹕ at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
08-10 18:47:46.622    7127-7386/five.androidfive W/System.err﹕ at java.lang.Thread.run(Thread.java:818)
08-10 18:47:46.622    7127-7386/five.androidfive W/System.err﹕ Caused by: java.net.ConnectException: failed to connect to /127.0.0.1 (port 80): connect failed: ECONNREFUSED (Connection refused)
08-10 18:47:46.628    7127-7386/five.androidfive W/System.err﹕ at libcore.io.IoBridge.connect(IoBridge.java:124)
08-10 18:47:46.629    7127-7386/five.androidfive W/System.err﹕ at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:183)
08-10 18:47:46.629    7127-7386/five.androidfive W/System.err﹕ at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:456)
08-10 18:47:46.629    7127-7386/five.androidfive W/System.err﹕ at java.net.Socket.connect(Socket.java:882)
08-10 18:47:46.629    7127-7386/five.androidfive W/System.err﹕ at org.apache.http.conn.scheme.PlainSocketFactory.connectSocket(PlainSocketFactory.java:124)
08-10 18:47:46.629    7127-7386/five.androidfive W/System.err﹕ at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:149)
08-10 18:47:46.629    7127-7386/five.androidfive W/System.err﹕ ... 15 more
08-10 18:47:46.629    7127-7386/five.androidfive W/System.err﹕ Caused by: android.system.ErrnoException: connect failed: ECONNREFUSED (Connection refused)
08-10 18:47:46.629    7127-7386/five.androidfive W/System.err﹕ at libcore.io.Posix.connect(Native Method)
08-10 18:47:46.629    7127-7386/five.androidfive W/System.err﹕ at libcore.io.BlockGuardOs.connect(BlockGuardOs.java:111)
08-10 18:47:46.629    7127-7386/five.androidfive W/System.err﹕ at libcore.io.IoBridge.connectErrno(IoBridge.java:137)
08-10 18:47:46.629    7127-7386/five.androidfive W/System.err﹕ at libcore.io.IoBridge.connect(IoBridge.java:122)
08-10 18:47:46.630    7127-7386/five.androidfive W/System.err﹕ ... 20 more
08-10 18:47:46.630    7127-7386/five.androidfive E/Buffer Error﹕ Error converting result java.lang.NullPointerException: lock == null
08-10 18:47:46.646    7127-7386/five.androidfive E/JSON Parser﹕ Error parsing data org.json.JSONException: End of input at character 0 of
08-10 18:47:46.649    7127-7386/five.androidfive E/AndroidRuntime﹕ FATAL EXCEPTION: AsyncTask #1
    Process: five.androidfive, PID: 7127
    java.lang.RuntimeException: An error occured while executing doInBackground()
            at android.os.AsyncTask$3.done(AsyncTask.java:304)
            at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355)
            at java.util.concurrent.FutureTask.setException(FutureTask.java:222)
            at java.util.concurrent.FutureTask.run(FutureTask.java:242)
            at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
            at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
            at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
            at java.lang.Thread.run(Thread.java:818)
     Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String org.json.JSONObject.toString()' on a null object reference
            at five.androidfive.AllproductsActivity$LoadAllProducts.doInBackground(AllproductsActivity.java:130)
            at five.androidfive.AllproductsActivity$LoadAllProducts.doInBackground(AllproductsActivity.java:105)
            at android.os.AsyncTask$2.call(AsyncTask.java:292)
            at java.util.concurrent.FutureTask.run(FutureTask.java:237)
            at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
            at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
            at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
            at java.lang.Thread.run(Thread.java:818)
08-10 18:47:46.676    7127-7137/five.androidfive W/art﹕ Suspending all threads took: 8.271ms
08-10 18:47:47.673    7127-7137/five.androidfive W/art﹕ Suspending all threads took: 7.691ms
08-10 18:47:47.842    7127-7127/five.androidfive E/WindowManager﹕ android.view.WindowLeaked: Activity five.androidfive.AllproductsActivity has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView{666ad89 V.E..... R......D 0,0-729,232} that was originally added here
            at android.view.ViewRootImpl.<init>(ViewRootImpl.java:363)
            at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:271)
            at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:85)
            at android.app.Dialog.show(Dialog.java:298)
            at five.androidfive.AllproductsActivity$LoadAllProducts.onPreExecute(AllproductsActivity.java:117)
            at android.os.AsyncTask.executeOnExecutor(AsyncTask.java:591)
            at android.os.AsyncTask.execute(AsyncTask.java:539)
            at five.androidfive.AllproductsActivity.onCreate(AllproductsActivity.java:57)
            at android.app.Activity.performCreate(Activity.java:5990)
            at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1106)
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2278)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2387)
            at android.app.ActivityThread.access$800(ActivityThread.java:151)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303)
            at android.os.Handler.dispatchMessage(Handler.java:102)
            at android.os.Looper.loop(Looper.java:135)
            at android.app.ActivityThread.main(ActivityThread.java:5254)
            at java.lang.reflect.Method.invoke(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:372)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)

En mode debbugage par contre le logcat est très très long, je ne sais pas si sa se fait de le copie colle.

  • Partager sur Facebook
  • Partager sur Twitter
10 août 2015 à 19:18:03

D'après le logcat, 'localhost' n'est pas reconnu. Tu travailles sur un émulateur ou sur un terminal physique ?

  • Partager sur Facebook
  • Partager sur Twitter
10 août 2015 à 19:39:56

Je travail sur un terminal physique.

Il n'y a pas de soucis quand je teste les scripts php avec google API REST.

-
Edité par vendy10 10 août 2015 à 19:41:57

  • Partager sur Facebook
  • Partager sur Twitter
10 août 2015 à 21:19:36

Le problème c'est que le téléphone ne sait pas ce qu'est localhost... Pour s'en convaincre, il suffit de saisir "localhost" dans la barre d'adresse du navigateur du téléphone. Si tu n'arrives pas à afficher ce que tu veux par ce moyen, ton application ne s'en sortira pas mieux :)

  • Partager sur Facebook
  • Partager sur Twitter
10 août 2015 à 23:51:46

Merci rolandl je n'y avais pas pensé.

Seulement j'essai depuis tout a l'heure d'accéder à localhost depuis mon telephone mais j'ai l'erreur ERR_ADDRESS_UNREACHABLE.

J'ai récupérer l'ip de mon pc, avec lequel je peux accéder à localhost, mais sa ne marche ni sur mon téléphone, ni sur un autre PC que j'ai chez moi. (la même origine ?).

J'ai ouvert le fichier httpd.config et je ne trouve pas la ligne décrit dans les tutos, à savoir (allow from 127...). Elle semble avoir été remplacé par 

AllowOverride none

Require all denied

J'ai remplacé denied par granted, et sa ne change toujours rien. 

J'ai également tenter de rajouter ":80" apres l'adresse ip.

-
Edité par vendy10 11 août 2015 à 0:08:14

  • Partager sur Facebook
  • Partager sur Twitter
11 août 2015 à 8:50:57

Je ne suis malheureusement pas expert de wamp et je ne sais pas spécialement comment on peut ouvrir l'accès localhost à d'autres machines. Peut-être auras-tu plus de chances dans le forum php ?

  • Partager sur Facebook
  • Partager sur Twitter
12 août 2015 à 8:27:38

J'ai enfin pu me connecter à wamp à partir de mon telephone, en remplaçant localhost par mon adresse ip et en ouvrant le port 80 si jamais certains ont eut le même problème.

Cependant, l'application crash toujours avec ("nom_de_lapp s'est arrêté") des que j'essai d'accéder à la page View products.

Je met le nouveau logcat : 

08-12 08:20:19.554    3886-4245/five.androidfive E/JSON Parser﹕ Error parsing data org.json.JSONException: Value <br of type java.lang.String cannot be converted to JSONObject
    --------- beginning of crash
08-12 08:20:19.560    3886-4245/five.androidfive E/AndroidRuntime﹕ FATAL EXCEPTION: AsyncTask #1
    Process: five.androidfive, PID: 3886
    java.lang.RuntimeException: An error occured while executing doInBackground()
            at android.os.AsyncTask$3.done(AsyncTask.java:304)
            at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355)
            at java.util.concurrent.FutureTask.setException(FutureTask.java:222)
            at java.util.concurrent.FutureTask.run(FutureTask.java:242)
            at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
            at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
            at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
            at java.lang.Thread.run(Thread.java:818)
     Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String org.json.JSONObject.toString()' on a null object reference
            at five.androidfive.AllproductsActivity$LoadAllProducts.doInBackground(AllproductsActivity.java:130)
            at five.androidfive.AllproductsActivity$LoadAllProducts.doInBackground(AllproductsActivity.java:105)
            at android.os.AsyncTask$2.call(AsyncTask.java:292)
            at java.util.concurrent.FutureTask.run(FutureTask.java:237)
            at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
            at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
            at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
            at java.lang.Thread.run(Thread.java:818)
08-12 08:20:19.936    3886-3886/five.androidfive E/WindowManager﹕ android.view.WindowLeaked: Activity five.androidfive.AllproductsActivity has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView{365dca1d V.E..... R......D 0,0-729,232} that was originally added here
            at android.view.ViewRootImpl.<init>(ViewRootImpl.java:363)
            at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:271)
            at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:85)
            at android.app.Dialog.show(Dialog.java:298)
            at five.androidfive.AllproductsActivity$LoadAllProducts.onPreExecute(AllproductsActivity.java:117)
            at android.os.AsyncTask.executeOnExecutor(AsyncTask.java:591)
            at android.os.AsyncTask.execute(AsyncTask.java:539)
            at five.androidfive.AllproductsActivity.onCreate(AllproductsActivity.java:57)
            at android.app.Activity.performCreate(Activity.java:5990)
            at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1106)
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2278)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2387)
            at android.app.ActivityThread.access$800(ActivityThread.java:151)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303)
            at android.os.Handler.dispatchMessage(Handler.java:102)
            at android.os.Looper.loop(Looper.java:135)
            at android.app.ActivityThread.main(ActivityThread.java:5254)
            at java.lang.reflect.Method.invoke(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:372)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)

Si je comprend bien, l'objet JSON est null, et ne recupère donc pas les données.

Par rapport à l'autre tuto, je vois que la requête d'ajout s'effectue dans la base de données avec des nouvelles lignes insérés, mais il est également impossible d'avoir les données JSON qui indique le succès de l'opération.

Il y a donc un problème avec la récupération des données JSON mais la requête sql s'exécute belle et bien. Cette méthode est-elle devenu obsolète ou bien il y a une erreur quelque part qui empêche de récuperer les données JSON ? 

Merci pour l'aide.

-
Edité par vendy10 12 août 2015 à 8:30:30

  • Partager sur Facebook
  • Partager sur Twitter
12 août 2015 à 10:03:42

Ton JSONObject est null car visiblement il n'arrive pas à transformer la réponse de ton web-service en JSON. Ca semble être du HTML et non du JSON car tu as quelque chose comme Error parsing data org.json.JSONException: Value <br of type java.lang.String cannot be converted to JSONObject.

Quand tu appelles le web-service directement dans ton navigateur, qu'est-ce qui est affiché à l'écran ?

  • Partager sur Facebook
  • Partager sur Twitter
12 août 2015 à 19:35:21

Merci pour la piste j'ai résolu le problème.

La solution était d'utiliser la classe PDO pour les opérations sur la base de donnée.

En effet quand je recupérais les données avec le web service, j'avais bien mon tableau contenant les données mais il y avait egalement du langage XML récupéré avec je ne sais pas pourquoi, je ne pensais pas que ce code allait être récupéré lorsque l'objet JSON allait être crée. En utilisant la classe PDO j'ai seulement mon tableau contenant les données. De plus quand j'appelais la page depuis mon navigateur, les données étaient récupéré mais ils me disait que les methodes sql employé etaient "depreciated". Donc surement que le code XML récupéré par le web service c'était la mise en page de ce message.

En tout cas merci beaucoup rolandl tu m'a bien aidé ;)

  • Partager sur Facebook
  • Partager sur Twitter
29 juin 2016 à 5:10:08

vendy10 a écrit:

Merci pour la piste j'ai résolu le problème.

La solution était d'utiliser la classe PDO pour les opérations sur la base de donnée.

En effet quand je recupérais les données avec le web service, j'avais bien mon tableau contenant les données mais il y avait egalement du langage XML récupéré avec je ne sais pas pourquoi, je ne pensais pas que ce code allait être récupéré lorsque l'objet JSON allait être crée. En utilisant la classe PDO j'ai seulement mon tableau contenant les données. De plus quand j'appelais la page depuis mon navigateur, les données étaient récupéré mais ils me disait que les methodes sql employé etaient "depreciated". Donc surement que le code XML récupéré par le web service c'était la mise en page de ce message.

En tout cas merci beaucoup rolandl tu m'a bien aidé ;)



  • Partager sur Facebook
  • Partager sur Twitter
29 juin 2016 à 5:10:40

pouvez vous me donner ta fonction PDO ?
  • Partager sur Facebook
  • Partager sur Twitter