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 :

L'accès HTTP sous Android


Sujet :

Android

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Expert confirmé

    Avatar de Feanorin
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    4 589
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 4 589
    Par défaut L'accès HTTP sous Android
    Bonjour,

    Je vous présente ce tutoriel intitulé :

    L'accès HTTP sous Android



    Cet article décrit comment accéder à des ressources Web via HTTP dans Android. Il est basé sur Eclipse 3.7, Java 1.6 et Android 4.0 (Ice Cream Sandwich).

    Nous remercions Lars Vogel qui nous a aimablement autorisés à traduire et héberger cet article.
    N'hésitez pas à commentez cet article !

  2. #2
    Membre averti
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2014
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juillet 2014
    Messages : 40
    Par défaut
    Bonjour,

    Je viens de tester ce tutoriel très bien fait mais bien sûr ... je rencontre un soucis. Je précise tout de suite que je suis un débutant bien parasité par la maitrise d'autres langages, ceci pouvant donc expliquer cela. Je poste ici parce que je me dis qu'il y a peu être une information à rajouter pour les gens comme moi.

    Le soucis rencontré : le flux récupéré est toujours vide. (une exception nulle est générée au passage de con.getInputStream() => e.getMessage() est nul mais catché).

    La fonction isNetworkAvailable() me renvoit bien True donc j'ai du réseau.
    J'ai ajouté un affichage de HttpURLConnection.HTTP_ACCEPTED qui me renvoit bien 202.
    (j'ai bien ajouté les permissions INTERNET et ACCESS_NETWORK_STATE, il faut savoir que j'en suis au moins au 4eme tutoriel pour faire ça).
    Je n'ai pas de proxy.
    J'ai rien dans le Logcat ou la console de spécial.
    J'utilise eclypse IDE for Androids developers 23.0.2.1259578.

    A noter aussi que cela fonctionne pareil sur l'emulateur et sur mon nexus 5 (ça s'exécute mais me ramène rien).

    Mon souhait initial est d'interroger une page php et de récupérer son contenu exécuté pour (actuellement) l'afficher (principe du httprequest en javascript).

    Il doit donc y avoir quelque chose de plus à faire ou ne pas faire ? (par exemple : ne pas mettre ce code dans le MainActivity ?)

    S'il faut plus de précision, je peux ouvrir un autre sujet si vous me le conseillez (noob aussi sur ce forum).

  3. #3
    Expert confirmé

    Avatar de Feanorin
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    4 589
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 4 589
    Par défaut
    Salut,

    TU as le nom de l erreur remontée , pas le message mais le nom de l'exception ?

  4. #4
    Membre averti
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2014
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juillet 2014
    Messages : 40
    Par défaut
    Non rien du tout mais peut être que je ne sais pas comment la voir.
    Comme j'ai dit, j'ai rien dans la console, si j'affiche getMessage ou getStackTrace ou autre (j'n ai essayé pas mal) mais j'ai rien à chaque fois.
    Apparemment, InputStreamReader a des IOException, j'ai voulu mettre ça à la place d'Exception et la j'ai eu pleins d'erreurs dans la console mais l'application ne marche plus alors j'ai remis Exception.
    Je pense que c'est InputStreamReader puisqu'à la ligne d'après j'ai mis une trace à l'affichage qui ne s'exécute pas contrairement au passage dans le catch de l'exception.
    Je viens de remettre IOException, voici ce que je vois à ce moment la mais je ne sais pas si c'est lié ou pas
    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-22 10:31:08.804: W/dalvikvm(1103): threadid=1: thread exiting with uncaught exception (group=0xb2a86ba8)
    07-22 10:31:08.814: E/AndroidRuntime(1103): FATAL EXCEPTION: main
    07-22 10:31:08.814: E/AndroidRuntime(1103): Process: com.example.test1, PID: 1103
    07-22 10:31:08.814: E/AndroidRuntime(1103): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.test1/com.example.test1.MainActivity}: android.os.NetworkOnMainThreadException
    07-22 10:31:08.814: E/AndroidRuntime(1103): 	at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2195)
    07-22 10:31:08.814: E/AndroidRuntime(1103): 	at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2245)
    07-22 10:31:08.814: E/AndroidRuntime(1103): 	at android.app.ActivityThread.access$800(ActivityThread.java:135)
    07-22 10:31:08.814: E/AndroidRuntime(1103): 	at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196)
    07-22 10:31:08.814: E/AndroidRuntime(1103): 	at android.os.Handler.dispatchMessage(Handler.java:102)
    07-22 10:31:08.814: E/AndroidRuntime(1103): 	at android.os.Looper.loop(Looper.java:136)
    07-22 10:31:08.814: E/AndroidRuntime(1103): 	at android.app.ActivityThread.main(ActivityThread.java:5017)
    07-22 10:31:08.814: E/AndroidRuntime(1103): 	at java.lang.reflect.Method.invokeNative(Native Method)
    07-22 10:31:08.814: E/AndroidRuntime(1103): 	at java.lang.reflect.Method.invoke(Method.java:515)
    07-22 10:31:08.814: E/AndroidRuntime(1103): 	at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
    07-22 10:31:08.814: E/AndroidRuntime(1103): 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
    07-22 10:31:08.814: E/AndroidRuntime(1103): 	at dalvik.system.NativeStart.main(Native Method)
    07-22 10:31:08.814: E/AndroidRuntime(1103): Caused by: android.os.NetworkOnMainThreadException
    07-22 10:31:08.814: E/AndroidRuntime(1103): 	at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1145)
    07-22 10:31:08.814: E/AndroidRuntime(1103): 	at java.net.InetAddress.lookupHostByName(InetAddress.java:385)
    07-22 10:31:08.814: E/AndroidRuntime(1103): 	at java.net.InetAddress.getAllByNameImpl(InetAddress.java:236)
    07-22 10:31:08.814: E/AndroidRuntime(1103): 	at java.net.InetAddress.getAllByName(InetAddress.java:214)
    07-22 10:31:08.814: E/AndroidRuntime(1103): 	at com.android.okhttp.internal.Dns$1.getAllByName(Dns.java:28)
    07-22 10:31:08.814: E/AndroidRuntime(1103): 	at com.android.okhttp.internal.http.RouteSelector.resetNextInetSocketAddress(RouteSelector.java:216)
    07-22 10:31:08.814: E/AndroidRuntime(1103): 	at com.android.okhttp.internal.http.RouteSelector.next(RouteSelector.java:122)
    07-22 10:31:08.814: E/AndroidRuntime(1103): 	at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:292)
    07-22 10:31:08.814: E/AndroidRuntime(1103): 	at com.android.okhttp.internal.http.HttpEngine.sendSocketRequest(HttpEngine.java:255)
    07-22 10:31:08.814: E/AndroidRuntime(1103): 	at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:206)
    07-22 10:31:08.814: E/AndroidRuntime(1103): 	at com.android.okhttp.internal.http.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:345)
    07-22 10:31:08.814: E/AndroidRuntime(1103): 	at com.android.okhttp.internal.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:296)
    07-22 10:31:08.814: E/AndroidRuntime(1103): 	at com.android.okhttp.internal.http.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:179)
    07-22 10:31:08.814: E/AndroidRuntime(1103): 	at com.example.test1.MainActivity.httpRequest(MainActivity.java:50)
    07-22 10:31:08.814: E/AndroidRuntime(1103): 	at com.example.test1.MainActivity.onCreate(MainActivity.java:31)
    07-22 10:31:08.814: E/AndroidRuntime(1103): 	at android.app.Activity.performCreate(Activity.java:5231)
    07-22 10:31:08.814: E/AndroidRuntime(1103): 	at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
    07-22 10:31:08.814: E/AndroidRuntime(1103): 	at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2159)
    07-22 10:31:08.814: E/AndroidRuntime(1103): 	... 11 more

  5. #5
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Salut,



    @greedo01 : Et quel est ton code ?





    Sinon pour avoir jeter un coup d'oeil au tuto... j'aurais beaucoup à redire sur la méthode readStream() :
    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
    private void readStream(InputStream in) {
    		BufferedReader reader = null;
    		try {
    			reader = new BufferedReader(new InputStreamReader(in));
    			String line = "";
    			while ((line = reader.readLine()) != null) {
    				System.out.println(line);
    			}
    		} catch (IOException e) {
    			e.printStackTrace();
    		} finally {
    			if (reader != null) {
    				try {
    					reader.close();
    				} catch (IOException e) {
    					e.printStackTrace();
    				}
    			}
    		}
    	}
    • A quoi sert l'initialisation String line = ""; ? Cette valeur n'est jamais utilisé ?
    • Le e.printStackTrace() pour gérer l'exception c'est crade. Cela veut dire qu'on n'a aucun moyen au niveau du programme de savoir si cela a réussi ou pas.
      Il serait préférable de laisser remonter l'exception.
    • Ce pattern du try/finally est super-lourd à écrire et à lire... et pas toujours efficace.
      Il vaut mieux lui préférer le pattern suivant plus simple et plus robuste :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      Closeable variable = new Closeable();
      try {
          // code
      } finally {
          variable.close();
      }


    Bref il serait déjà mieux d'écrire ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    	private void readStream(InputStream in) throws IOException {
    		BufferedReader reader = new BufferedReader(new InputStreamReader(in));
    		try {
    			String line;
    			while ((line = reader.readLine()) != null) {
    				System.out.println(line);
    			}
    		} finally {
    			reader.close();
    		}
    	}
    Même s'il y a toujours un "problème" en ce qui me concerne, c'est qu'on ne connait pas l'encodage des caractères.
    Plutôt que de passer l'InputStream je ferais une méthode prenant directement l'URL en paramètre, ce qui permet de traiter le content-type s'il est présent...


    a++

  6. #6
    Membre averti
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2014
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juillet 2014
    Messages : 40
    Par défaut
    Voici donc mon code :
    MainActivity .java (j'ai tout mis même s'il y a des passages qui ne concerne pas mon problème
    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
     
    package com.example.test1;
     
    import java.io.BufferedReader;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.net.HttpURLConnection;
    import java.net.URL;
     
    import android.support.v7.app.ActionBarActivity;
    import android.content.Context;
    import android.net.ConnectivityManager;
    import android.net.NetworkInfo;
    import android.os.Bundle;
    import android.widget.TextView;
     
     
    public class MainActivity extends ActionBarActivity 
    {
        @Override
        protected void onCreate(Bundle savedInstanceState) 
        {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
     
            TextView t1 = (TextView) findViewById(R.id.textView1);
       	 	t1.setText("RRRRRR");
     
       	 	if(isNetworkAvailable())
       	 	{
       	 		t1.setText(httpRequest("http://www.hbcnancysluc.com/test.php"));
       	 	}
       	 	else
       	 	{
       	 		t1.setText("pas de réseau");
       	 	}
     
        }
     
        public String httpRequest (String adress)
        {
    	     String answer = "", temp = "";
    	     try
    	     {
    		     URL url = new URL(adress);
    		     HttpURLConnection con = (HttpURLConnection) url.openConnection();
    		     con.setRequestProperty("Content-Type","application/octet-stream"); 
    		     answer = answer + HttpURLConnection.HTTP_ACCEPTED+ "(1)*" ; // 202 = acceptée => ok
    		     // plante ci-dessous
    		     InputStream in = con.getInputStream();
    		     answer = answer + "(2)*"; // juste pour voir si ça passe
    		     BufferedReader reader = new BufferedReader(new InputStreamReader(in));
    		     while ((temp = reader.readLine()) != null)
    		     {
    		    	 answer = answer + temp;
    		     }
    		     reader.close();
    	     }
    	     catch (Exception e){answer = answer + e.getMessage()+"*";}
    	     return answer;
        }
     
     
        public boolean isNetworkAvailable() {
            ConnectivityManager cm = (ConnectivityManager) 
              getSystemService(Context.CONNECTIVITY_SERVICE);
            NetworkInfo networkInfo = cm.getActiveNetworkInfo();
            // si aucun réseau n'est disponible, networkInfo sera null
            // sinon, vérifier si nous sommes connectés
            if (networkInfo != null && networkInfo.isConnected()) {
                return true;
            }
            return false;
        }
     
    }
    activity_main.xml : la pareil j'ai tout mis mais bon pas utile les images ou autre
    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
     
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:paddingBottom="@dimen/activity_vertical_margin"
        android:paddingLeft="@dimen/activity_horizontal_margin"
        android:paddingRight="@dimen/activity_horizontal_margin"
        android:paddingTop="@dimen/activity_vertical_margin"
        tools:context="com.example.test1.MainActivity" >
     
        <ImageView
            android:id="@+id/imageView1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:contentDescription="@string/logo"
            android:src="@drawable/ic_test" />
     
        <ImageView
            android:id="@+id/imageView2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_below="@+id/imageView1"
            android:layout_toRightOf="@+id/imageView1"
            android:contentDescription="@string/logo"
            android:src="@drawable/abc_ic_commit_search_api_holo_light" />
     
        <Button
            android:id="@+id/button1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignLeft="@+id/imageView2"
            android:layout_below="@+id/imageView2"
            android:layout_marginLeft="17dp"
            android:text="@string/button_label" />
     
        <TextView
            android:id="@+id/textView1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignTop="@+id/imageView1"
            android:layout_toRightOf="@+id/button1"
            android:text="@string/button_label" />
     
    </RelativeLayout>
    AndroidManisfest.xml : pour vérifier la aussi au cas où
    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
     
    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.example.test1"
        android:versionCode="1"
        android:versionName="1.0" >
     
        <uses-sdk
            android:minSdkVersion="8"
            android:targetSdkVersion="21" />
        <uses-permission android:name="android.permission.INTERNET"/>
        <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
     
        <application
            android:allowBackup="true"
            android:icon="@drawable/ic_launcher"
            android:label="@string/app_name"
            android:theme="@style/AppTheme" >
            <activity
                android:name=".MainActivity"
                android:label="@string/app_name" >
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
     
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
        </application>
     
    </manifest>
    Donc ça exécute bien mon code, cela affiche tout ce que cela doit afficher sauf qu'en retour t1.setText, j'ai :
    202(1)*null* qui signifie selon moi (donc à vérifier^^) que :
    HttpURLConnection.HTTP_ACCEPTED+ "(1)*" => 202(1)*, la ligne s'exécute et il y a du réseau
    e.getMessage()+"*" => null*, passe dans le catche mais sans message
    Ma ligne answer = answer + "(2)*"; ne s'exécutant pas donc bien passé dans le catch sur l'exécution de InputStream in = con.getInputStream();

    (merci pour vos réponses et vos efforts )

Discussions similaires

  1. Enregistrer une flux HTTP sur un serveur sous Android
    Par ensinienne dans le forum API standards et tierces
    Réponses: 0
    Dernier message: 10/04/2012, 17h55
  2. Réponses: 1
    Dernier message: 13/10/2011, 14h32
  3. Probleme d'acces à http://localhost:8080/ sous IE
    Par elbopha dans le forum Tomcat et TomEE
    Réponses: 2
    Dernier message: 21/12/2006, 22h33

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