Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Android] Webservice et QR codes

    2 août 2012 à 11:20:41

    Bonjour à tous,
    Je fais du java android depuis peu et j'ai deux problèmes qui m'empêchent de continuer mon projet, et après une journée de recherche, je passe chercher un peu d'aide.

    Tout d'abord, je cherche à utiliser un webservice afin de faire appel à des fonctions déjà créées par quelqu'un, auxquelles j'ai accès. Le problème est que malgré les quelques tutos trouvés, je n'arrive pas à comprendre comment appeler ces fonctions, ni comment récupérer leur réponse. En effet, tout ce que j'arrive à avoir pour le moment est l'appel à une fonction permettant d'ajouter un utilisateur dans une BD après son inscription, mais le seul message que me retourne la fonction est l'invalidité de l'adresse mail, peu importe que celle-ci soit correcte ou non. Si quelqu'un pouvait m'expliquer un peu comment tout cela fonctionne ou connait un tuto bien commenté, ça me serait bien utile.

    Deuxième problème, je souhaite que mon application puisse permettre de flasher des QR codes, mais impossible de trouver quoi que ce soit de correct pour réaliser ça. J'ai essayé avec la librairie ZXing, mais cela force l'utilisateur à installer une autre appli en plus de la mienne, ce que je veux éviter. Alors si là aussi quelqu'un aurait quelque chose à proposer, je suis preneur.

    Merci d'avance.
    • Partager sur Facebook
    • Partager sur Twitter
      2 août 2012 à 11:35:38

      Logiquement quand tu contactes ton webService, tu utilises du Http (en tout cas je fais comme ça avec Json).
      Tu lui fournis une adresse ip (celle de ton pc locale 192.168.x.x) et comme en php (si ton webservice est en php) tu ajoutes un argument ==> http://192.168.x.x/monWebService.php?fonction=getName
      Je n'ai pas encore trouvé comment appeler une fonction directement par l'url, mais j'utilise
      if($_GET['fonction'] == getName){}
      

      et là au pire tu fou la fonction dedans ^^

      Bon dans ton cas l'adresse que tu vas contacter sera l'ip de ton webservice en externe (normalement ip fix publique).
      Et il ne faut pas oublier les permissions d'accès à Internet (même en local).
      Check un post que j'ai mis dans le forum il y a un lien d'un tuto sur lequel je me suis basé (fonctionnel) et la ligne à rajouter dans le manifest y est aussi
      • Partager sur Facebook
      • Partager sur Twitter
        2 août 2012 à 11:47:01

        Merci de ta réponse.

        J'ai déjà mis les permissions à Internet etc.., et quant au code php, je n'ai accès qu'à l'appel de la fonction, je ne peux pas modifier le code (je me suis mal exprimé, désolé).
        J'ai refait quelques essais, en fait, il s'avère que mon code ne fait pas réellement appel à la fonction, mais renvoie simplement une sorte de code source.

        Comme je dois communiquer avec ces fonctions en post, j'utilise la classe HttpPost, à laquelle j'ajoute les arguments demandés par la fonction parle biais d'une liste de NameValuePair, et j'envoie le tout en utilisant un DefaultHttpClient. Enfin, pour récupérer l'information, j'utilise un BufferedReader qui me retourne toutes les lignes renvoyées, mais de toute évidence ça en fonctionne pas puisque je ne récupère pas ce que je souhaite.
        En gros voici le code que j'utilise pour appeler ma fonction (c'est en partie un code que j'avais trouvé sur le net et que j'avais voulu tester, n'ayant aucune base sur comment traiter le problème de la communication avec un Webservice)
        //l'adresse en post à laquelle on veut faire appel
        				HttpPost post = new HttpPost("l'url de ma fonction");
        				//nvp va servir à ajouter les paramètres souhaités pour la fonction appelée 
        				List<NameValuePair> nvp = new ArrayList<NameValuePair>();
        				//on ajoute le paramètre mail à nvp
        				nvp.add(new BasicNameValuePair("mail", mail));
        				//on ajoute la paramètre pass à nvp
        				nvp.add(new BasicNameValuePair("pass", pass));
        				
        				try {
        					//on lie la liste au POST à envoyer
        					post.setEntity(new UrlEncodedFormEntity(nvp));
        				} catch (UnsupportedEncodingException e) {
        					// TODO Auto-generated catch block
        					e.printStackTrace();
        				}
        				
        				//On crée le client où on envoie la requête
        				HttpClient client = new DefaultHttpClient();
        				//on envoie la requête
        				try {
        					client.execute(post);
        				} catch (ClientProtocolException e) {
        					// TODO Auto-generated catch block
        					e.printStackTrace();
        				} catch (IOException e) {
        					// TODO Auto-generated catch block
        					e.printStackTrace();
        				}
        				HttpResponse response = null;
        				try {
        					response = client.execute(post);
        				} catch (ClientProtocolException e) {
        					// TODO Auto-generated catch block
        					e.printStackTrace();
        				} catch (IOException e) {
        					// TODO Auto-generated catch block
        					e.printStackTrace();
        				}
        				BufferedReader reader = null;
        				try {
        					reader = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
        				} catch (IllegalStateException e1) {
        					// TODO Auto-generated catch block
        					e1.printStackTrace();
        				} catch (IOException e1) {
        					// TODO Auto-generated catch block
        					e1.printStackTrace();
        				}
        				StringBuilder total = new StringBuilder();
        				String line;
        				try {
        					while((line = reader.readLine()) != null){
        						total.append(line);
        					}
        					
        				} catch (IOException e) {
        					// TODO Auto-generated catch block
        					e.printStackTrace();
        				}
        


        J'ai aussi voulu essayer la librairie SOAP qui semble être assez intéressante pour gérer ce genre de problème, mais là aussi des exemples d'utilisation ou des tutos bien expliqués sont assez rares.
        • Partager sur Facebook
        • Partager sur Twitter
          2 août 2012 à 12:35:04

          Faudra peut-être attendre qlq de plus expérimenté :p
          Mais je pense que mon json est bien renvoyé ^^ (juste un petit problème de tableau :p

          Si j'ai bien compris le namevaluepaire tu dois ensuite préciser dans ta requête en récupérant la valeur com ça:

          $sql=mysql_query("SELECT '".$_REQUEST['mail']."'" FROM xxx);
          


          Un truc du style
          • Partager sur Facebook
          • Partager sur Twitter
            2 août 2012 à 14:02:30

            Je ne sais pas du tout comment ma requête est récupérée par la fonction, c'est là le problème. Le collègue qui a mis en place le webservice et créé les différentes fonctions à appeler est en vacances et je ne sais donc pas du tout comment il a codé tout ça, ce qui fait que je dois faire ça à tâtons, en ayant comme indication les paramètres à donner à la fonction et la façons de les envoyer (certaines étant en POST et d'autres en GET)
            • Partager sur Facebook
            • Partager sur Twitter
              2 août 2012 à 14:10:34

              Bon bah ça vient peut-être de là ton problème vu que le moyen de récupérer une valeur via namevaluepaire est celle que je t'ai donnée. essayes plutôt de passer tes variables dans l'url comme je t'ai dit
              • Partager sur Facebook
              • Partager sur Twitter
                2 août 2012 à 14:43:45

                J'ai modifié un peu mon code en me basant sur le lien que tu donnes dans un autre sujet, maintenant au lieu de me renvoyer le code disponible à l'URL de la fonction, il me renvoie simplement l'URL. Je ne sais pas si c'est un progrès ou pas, mais au moins ça change un peu. J'ai essayé en passant les variables directement dans l'URL, mais là ça ne marche plus du tout, je pense que les variables en question ne sont pas celles qu'il faut pour la fonction, mais je n'ai aucun moyen de le savoir.

                Du coup j'ai continué mes recherches pour essayer d'appeler la fonction qui se trouve à cette URL, mais je ne trouve rien de plus que ce que j'ai déjà, et apparemment ça marche chez ceux qui le présentent.

                Au cas où quelqu'un arriverait à trouver ce qui cloche, le code ressemble à présent à ceci :
                import java.io.BufferedReader;
                import java.io.IOException;
                import java.io.InputStream;
                import java.io.InputStreamReader;
                import java.io.UnsupportedEncodingException;
                import java.util.ArrayList;
                import java.util.List;
                
                import org.apache.http.HttpEntity;
                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.entity.UrlEncodedFormEntity;
                import org.apache.http.client.methods.HttpPost;
                import org.apache.http.impl.client.DefaultHttpClient;
                import org.apache.http.message.BasicNameValuePair;
                import org.json.JSONArray;
                import org.json.JSONException;
                import org.json.JSONObject;
                
                import android.app.Activity;
                import android.content.Intent;
                import android.os.Bundle;
                import android.util.Log;
                import android.view.View;
                import android.view.View.OnClickListener;
                import android.widget.Button;
                import android.widget.EditText;
                import android.widget.LinearLayout;
                import android.widget.TextView;
                import android.widget.Toast;
                
                public class Register extends Activity {
                	
                	public void onCreate(Bundle savedInstanceState){
                		super.onCreate(savedInstanceState);
                		setContentView(R.layout.register);
                		
                		final EditText _mail = (EditText)findViewById(R.id.reg_mail);
                		final EditText _pass = (EditText)findViewById(R.id.reg_pass);
                		final EditText _conf = (EditText)findViewById(R.id.reg_conf_pass);	
                		
                		
                		//----------------Retour--------------
                		final Button back = (Button)findViewById(R.id.back_button);
                		back.setOnClickListener(new OnClickListener() {
                			
                			public void onClick(View v) {
                				Intent intent = new Intent(Register.this, ConnectionForm.class);
                				startActivity(intent);
                			}
                		});
                				
                		
                		//Confirmer inscription
                		final Button confirm = (Button)findViewById(R.id.conf_button);
                		confirm.setOnClickListener(new OnClickListener() {
                			
                			public void onClick(View v) {
                				_mail.setText(getServerData(strURL));
                			}
                		});
                	}
                		
                	public static final String strURL = "xxx.fr/xxxx.json";
                	
                	
                	private String getServerData(String returnString){
                		final EditText _mail = (EditText)findViewById(R.id.reg_mail);
                		final EditText _pass = (EditText)findViewById(R.id.reg_pass);
                		final EditText _conf = (EditText)findViewById(R.id.reg_conf_pass);
                		final String mail = _mail.getText().toString();
                		final String pass = _pass.getText().toString();
                		final String conf = _conf.getText().toString();
                		
                		InputStream is = null;
                		String result = "";
                		
                		ArrayList<NameValuePair> nvp = new ArrayList<NameValuePair>();
                		nvp.add(new BasicNameValuePair("mail", mail));
                		nvp.add(new BasicNameValuePair("password", pass));
                		
                		try{
                			HttpClient client = new DefaultHttpClient();
                			HttpPost post = new HttpPost(strURL);
                			post.setEntity(new UrlEncodedFormEntity(nvp));
                			HttpResponse resp = client.execute(post);
                			HttpEntity entity = resp.getEntity();
                			is = entity.getContent();
                		}
                		catch(Exception e){
                			Log.e("log_tag", e.toString());
                		}
                		
                		try{
                			BufferedReader reader = new BufferedReader(new InputStreamReader(is));
                			StringBuilder total = new StringBuilder();
                			String line = null;
                			
                			while((line = reader.readLine()) != null ){
                				total.append(line + "\n");
                			}
                			is.close();
                			result = total.toString();
                		}
                		catch(Exception e){
                			Log.e("log_tag", e.toString());
                		}
                		
                		try{
                			JSONArray jArray = new JSONArray(result);
                			for(int i = 0; i < jArray.length(); i++){
                				JSONObject json_data = jArray.getJSONObject(i);
                				
                				Log.i("log_tag", "mail : " + json_data.getString("mail") + "\n pass : " + 
                						json_data.getString("password"));
                				returnString += "\n \t" + jArray.getJSONObject(i);
                			}
                		}
                		catch(JSONException e){
                			Log.e("log_tag", "Error parsing data " + e.toString());
                		}
                		return returnString;
                	}
                }
                
                • Partager sur Facebook
                • Partager sur Twitter
                  2 août 2012 à 14:46:05

                  T'as essayé de taper le lien avec lequel tu communiques avec le webservice? mais sans appeler la page? là t'auras tous les fichiers et si c'est pas trop sécurisé tu le télécharges
                  • Partager sur Facebook
                  • Partager sur Twitter
                    2 août 2012 à 14:50:46

                    Oui j'avais essayé ça au début, les seules indications que j'ai par rapport aux fonctions sont dans ce genre là :
                    http://xx.xxxxxx.fr/xxxx/xxx/ma_fonction.json
                    Paramètres POST :
                    email => (email, isUnique)
                    password => (minLength >= 6)
                    Méthode permettant de créer un nouveau compte.
                    Renvoie l'objet contenant l'utilisateur en cas de success, sinon renvoie un objet contenant l'erreur

                    Alors après, c'est peut être parce que je débute là dedans, mais je ne pense pas avoir assez de renseignement uniquement avec ça.
                    • Partager sur Facebook
                    • Partager sur Twitter
                      2 août 2012 à 15:00:12

                      Bah faut voir, en tout cas toi comment t'avais fait au début si les requêtes ne sont pas adaptées à ton ws c'est mort ^^
                      • Partager sur Facebook
                      • Partager sur Twitter
                        2 août 2012 à 15:10:32

                        Je vais essayer d'avoir accès au code des fonctions, ça m'aidera peut être.

                        En tous cas merci de ton aide.
                        • Partager sur Facebook
                        • Partager sur Twitter
                          3 août 2012 à 22:00:54

                          Bonsoir,

                          Je t'avoue que je n'ai pas eu le courage de lire tous les postes de ton topic (pas des masses de temps devant moi) mais pourrais-tu nous donner l'erreur présent dans ton LogCat lors du crash ? Ca nous aidera à debugger ton code. :)
                          • Partager sur Facebook
                          • Partager sur Twitter
                          Si vous voulez me retrouver, rendez-vous sur ZesteDeSavoir.
                            5 août 2012 à 13:32:16

                            Le souci est qu'il n'y a pas d'erreur dans le LogCat, je pense plutôt que le code ne fait pas exactement ce que je pensais. Cela dit, après quelques modifications, il me renvoie à chaque fois le même message lors d'une inscription, à savoir que l'email entré est déjà utilisé, ce qui n'est pas le cas. Mais malgré tout, le compteur du nombre de comptes dans la BD est incrémenté. Je posterai ce à quoi ressemble à présent le code demain, ne l'ayant pas à disposition aujourd'hui.

                            EDIT :
                            Voilà le code, je l'ai un peu modifié.
                            import java.io.BufferedReader;
                            import java.io.InputStream;
                            import java.io.InputStreamReader;
                            import java.util.ArrayList;
                            
                            import org.apache.http.HttpEntity;
                            import org.apache.http.HttpResponse;
                            import org.apache.http.NameValuePair;
                            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 org.json.JSONArray;
                            import org.json.JSONException;
                            import org.json.JSONObject;
                            
                            import android.app.Activity;
                            import android.content.Intent;
                            import android.os.Bundle;
                            import android.util.Log;
                            import android.view.View;
                            import android.view.View.OnClickListener;
                            import android.widget.Button;
                            import android.widget.EditText;
                            import android.widget.TextView;
                            import android.widget.Toast;
                            
                            public class Register extends Activity {
                            	
                            	public void onCreate(Bundle savedInstanceState){
                            		super.onCreate(savedInstanceState);
                            		setContentView(R.layout.register);
                            		
                            		//final EditText _mail = (EditText)findViewById(R.id.reg_mail);
                            		final EditText _pass = (EditText)findViewById(R.id.reg_pass);
                            		final EditText _conf = (EditText)findViewById(R.id.reg_conf_pass);	
                            		final String mail = _mail.getText().toString();
                            		final String pass = _pass.getText().toString();
                            		final String conf = _conf.getText().toString();
                            		
                            		
                            		//----------------Retour--------------
                            		final Button back = (Button)findViewById(R.id.back_button);
                            		back.setOnClickListener(new OnClickListener() {
                            			
                            			public void onClick(View v) {
                            				Intent intent = new Intent(Register.this, ConnectionForm.class);
                            				startActivity(intent);
                            			}
                            		});
                            		
                            		
                            		//Confirmer inscription
                            		final Button confirm = (Button)findViewById(R.id.conf_button);
                            		confirm.setOnClickListener(new OnClickListener() {
                            			
                            			public void onClick(View v) {
                            				//Si les deux mots de passe sont identiques et font plus de six caractères
                            				//if(pass.equals(conf) && pass.length() >= 6){
                            					getServerData(strURL);
                            					_mail.setText(getServerData(strURL));
                            					/*Intent ok = new Intent(Register.this, ConnectionForm.class);
                            					startActivity(ok);*/
                            				//}
                            				//Si le mot de passe fait moins de 6 caractères, on avertit la personne
                            				/*else if(pass.length() < 6){
                            					Toast tooShort = Toast.makeText(getApplicationContext(), 
                            							"Le mot de passe doit faire au moins six caractères", Toast.LENGTH_SHORT);
                            					tooShort.show();
                            				}
                            				//si le mot de passe et sa confirmation sont différents, on avertit la personne
                            				else{
                            					Toast noMatch = Toast.makeText(getApplicationContext(), 
                            							"Les mots de passe doivent être identiques", Toast.LENGTH_SHORT);
                            					noMatch.show();
                            				}*/
                            			}
                            		});
                            	}
                            		
                            	public static final String strURL = "http://xxx.fr/xx/xxx.json";
                            	
                            	private String getServerData(String returnString){
                            		final EditText _mail = (EditText)findViewById(R.id.reg_mail);
                            		final EditText _pass = (EditText)findViewById(R.id.reg_pass);
                            		final EditText _conf = (EditText)findViewById(R.id.reg_conf_pass);
                            		final String mail = _mail.getText().toString();
                            		final String pass = _pass.getText().toString();
                            		final String conf = _conf.getText().toString();
                            		
                            		InputStream is = null;
                            		String result = "";
                            		
                            		ArrayList<NameValuePair> nvp = new ArrayList<NameValuePair>();
                            		nvp.add(new BasicNameValuePair("email", mail));
                            		nvp.add(new BasicNameValuePair("password", pass));
                            		
                            		try{
                            			HttpClient client = new DefaultHttpClient();
                            			HttpPost post = new HttpPost(strURL);
                            			Log.println(BIND_AUTO_CREATE, "post", post.getMethod());
                            			post.setEntity(new UrlEncodedFormEntity(nvp));
                            			HttpResponse resp = client.execute(post);
                            			HttpEntity entity = resp.getEntity();
                            			is = entity.getContent(); 
                            		}
                            		catch(Exception e){
                            			Log.e("log_tag", e.toString());
                            		}
                            		
                            		try{
                            			BufferedReader reader = new BufferedReader(new InputStreamReader(is));
                            			StringBuilder total = new StringBuilder();
                            			String line = null;
                            			
                            			while((line = reader.readLine()) != null ){
                            				total.append(line + "\n");
                            			}
                            			is.close();
                            			result = total.toString();
                            		}
                            		catch(Exception e){
                            			Log.e("log_tag", e.toString());
                            		}
                            		
                            		try{
                            			JSONArray jArray = new JSONArray(result);
                            			for(int i = 0; i < jArray.length(); i++){
                            				JSONObject json_data = jArray.getJSONObject(i);
                            				
                            				Log.i("log_tag", "mail : " + json_data.getString("mail") + "\n pass : " + 
                            						json_data.getString("password"));
                            				returnString += "\n \t" + jArray.getJSONObject(i);
                            			}
                            		}
                            		catch(JSONException e){
                            			Log.e("log_tag", "Error parsing data " + e.toString());
                            		}
                            		returnString = result;
                            		return returnString;
                            	}
                            }
                            


                            Et maintenant la fonction me retourne bel et bien une erreur dans le LogCat :

                            E/log_tag(24082): Error parsing data org.json.JSONException: Value {"User":{"group_id":"2","id":"28","password":"7785888d318707e04dcb74ab49532e48d9da2a27","email":"zrrrt@gtgf.com"}} of type org.json.JSONObject cannot be converted to JSONArray

                            E/log_tag(24082): Error parsing data org.json.JSONException: Value {"email":["L'adresse email renseignée est déjà utilisée."]} of type org.json.JSONObject cannot be converted to JSONArray

                            Sachant que "{"email":["L'adresse email renseignée est déjà utilisée."]}" apparaît toujours, que l'adresse soit utilisée ou pas.
                            • Partager sur Facebook
                            • Partager sur Twitter

                            [Android] Webservice et QR codes

                            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                            • Editeur
                            • Markdown