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 :

Connexion BDD erreur


Sujet :

API standards et tierces Android

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de devdeb91
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2013
    Messages
    246
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2013
    Messages : 246
    Par défaut Connexion BDD erreur
    Bonjour

    alors voila j'ai fait un code pour ce connecter via un fichier php a ma BDD mais lorsque j'utilise cette persmission

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    <uses-permission 
            android:name="android.permission.ACCESS_NETWORK_STATE" />
    il me sort en erreur de log cat un connexion refused to http://192.168.1.x

    et lorsque je change la permission en ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    <uses-permission 
            android:name="android.permission.INTERNET" />
    il me sort android.os.NetworkOnMainThread.

    pour le deuxieme je sais que il faut un asynctask mais le premier je ne comprend pas pourquoi cette erreur

  2. #2
    Modérateur
    Avatar de Hizin
    Homme Profil pro
    Développeur mobile
    Inscrit en
    Février 2010
    Messages
    2 180
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur mobile

    Informations forums :
    Inscription : Février 2010
    Messages : 2 180
    Par défaut
    NetworkOnMainThread => résultat de la mauvaise pratique consistant à faire un appel réseau sur le thread principal.
    Merci de passer cet appel dans un Thread à part (ou une AsyncTask, par exemple).
    C'est Android, PAS Androïd, ou Androïde didiou !
    Le premier est un OS, le second est la mauvaise orthographe du troisième, un mot français désignant un robot à forme humaine.

    Membre du comité contre la phrase "ça marche PAS" en titre et/ou explication de problème.

    N'oubliez pas de consulter les FAQ Android et les cours et tutoriels Android

  3. #3
    Membre éclairé Avatar de devdeb91
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2013
    Messages
    246
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2013
    Messages : 246
    Par défaut
    et pour la premiere erreur ?

  4. #4
    Expert confirmé

    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
    Billets dans le blog
    3
    Par défaut
    Le réseau 192.168.1.x n'existe qu'en WiFi pour un vrai device.
    (d'ailleurs j'espère que ce n'est pas vraiment x, et tu peux laisser la vraie valeur, c'est une adresse privée, donc non routable, donc non joignable par autre chose que par le réseau local).

    Entre un émulateur et la machine hôte il existe un réseau virtuel: 10.0.2.0/24, la machine "hôte" étant en 10.0.2.2

    android.permission.ACCESS_NETWORK_STATE
    Donne la permission à l'application de savoir dans quel état est le réseau du device (connecté, à qui, comment). Aucunement à accéder à ce réseau.

    android.permission.INTERNET
    Donne la permission à l'application d'accéder à Internet. c'est à dire à autre chose qu'à lui-même en utilisant des protocoles de données TCP ou UDP.


    Pour le NetworkOnMainThreadException, Hizin a déjà parfaitement répondu, tout opération "longue" (et donc par exemple lecture d'un fichier, appel internet, etc...) devrait être effectué par un thread différent du thread principal. Le plus simple étant de passer par les AsyncTask pour ce faire.

  5. #5
    Membre éclairé Avatar de devdeb91
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2013
    Messages
    246
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2013
    Messages : 246
    Par défaut
    bon bah alors je passe par un thread mais un probleme s'oppose a moi

    d'abord voici le code de la fonction de connexion
    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
    public int connecter(EditText login, EditText password){
     
    		String monLogin = "";
    		String monPass = "";
     
    		String returnString = "0";
    		ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
    		nameValuePairs.add(new BasicNameValuePair(monLogin, login.getText().toString()));
    		nameValuePairs.add(new BasicNameValuePair(monPass, password.getText().toString()));
     
    		InputStream is = null;
    		String result = "";
     
    		HttpResponse response = null;
     
    		try {
     
    			HttpClient client = new DefaultHttpClient();
    			HttpPost post = new HttpPost("http://192.168.1.34/connexion.php");
    			post.setEntity(new UrlEncodedFormEntity(nameValuePairs));
    			response = client.execute(post);
    			HttpEntity entity = response.getEntity();
    			is = entity.getContent();
     
    		} catch (Exception e) {
    			// TODO: handle exception
    			Log.e("log_tag", "Erreur de connexion " + e.toString());
    		}
     
    		try {
    			BufferedReader reader = new BufferedReader(new InputStreamReader(is, "iso-8859-1"),8 );
    			//StringBuilder sb = new StringBuilder();
    			String line = null;
     
    			while((line = reader.readLine()) != null)
    				returnString = line;
    			is.close();
    		} catch (Exception e) {
    			// TODO: handle exception
    			Log.e("log_tag", "Error converting result " + e.toString());
    		}
     
    		int i = Integer.parseInt(returnString);
     
    		return i;
     
    	}
    maintenant voici le thread
    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
    seConnecter.setOnClickListener(new View.OnClickListener() {
     
    			@Override
    			public void onClick(View v) {
    				// TODO Auto-generated method stub
    				int i;
    				Thread connect = new Thread(){
    					public void run(){
    						try{
    							i = connecter(login, password);
    						}catch(InterruptedException e){
    							e.printStackTrace();
    						}finally{
    							if (i == 1) {
    								Intent ouvrirActivy = new Intent("com.example.dvp.MAINACTIVITY");
    								startActivity(ouvrirActivy);
    							}
    							else {
    								affichage.setText("id incorrect");
    							}
    						}
    					}
    				};
    				connect.start();
    alors le int i ne vas pas car il n'est pas final mais lorsque je le passe en final il ne vas pas aussi car il ne peu pas changé de valeur alors comment faire pour contourner ça

  6. #6
    Expert confirmé

    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
    Billets dans le blog
    3
    Par défaut
    le problème s'oppose ?

    Voir les tutoriels présentés ici devrait t'aider... je pense en particulier à une forcément (http://nicroman.developpez.com/tutor...id/exceptions/) qui décrit une fonction ... un peu similaire.

    1. La fonction "connecter" ne renvoie aucune information (en tous cas, elle n'est pas prévue pour en renvoyer vu sa déclaration) concernant les echecs éventuels (réseau non disponible, erreur de login/password, etc...). Cela me semble étrange (voir le tutoriel ci-dessus pour la raison).

    2. La fonction "connecter" prend en paramètres des EditText... hors leur seule utilisation est dans la transformation EditText=>String... Il me semble donc plus judicieux que la fonction prenne en paramètre des String (voire des CharSequence) et sera ainsi réutilisable en plusieurs endroits.

    3. La fonction "connecter" utilise des Log (logcat) pour les erreurs, c'est très bien, (revoir la gestion des exceptions, tutoriel précédent encore), sauf que la syntaxe n'est pas bonne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Log.e("log_tag", "Erreur de connexion " + e.toString());
    doit impérativement être remplacé par:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Log.e("log_tag", "Erreur de connexion ",e);
    (avec "log_tag" par un truc plus explicite....genre "connexion" ?)

    4. La fonction "connecter" réinvente la roue, sans en utiliser toutes les possibilités, et ne gère pas la fermeture de ressources (InputStream, Reader). Le code suivant suffit à tout décoder.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    HttpClient client = new DefaultHttpClient();
    HttpPost post = new HttpPost("http://192.168.1.34/connexion.php");
    post.setEntity(new UrlEncodedFormEntity(nameValuePairs));
    response = client.execute(post);
    HttpEntity entity = response.getEntity();
    String strResponse = EntityUtils.toString(strResponse);
    Integer.parseInt(strResponse);

    5. Si on parlait de AsyncTask, c'est justement parcequ'avec un "Thread" c'est compliqué... Le Thread ne peut pas faire de startActivity par exemple, ni aucune action liée à l'UI (comme la lecture des EditText, ou le setText d'un TextView): il faut gérer les messages de retour au thread principal, chose faite automatiquement avec un AsyncTask.
    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
     
    class LoginTask extends AsyncTask<String,Void,Integer>
    {
         public Integer doInBackground(String ... params)
         {
              if (params == null || params.length != 2) throw new IllegalArguementException("Invalid arguements passed to LoginTask: should be login,password");
              String login = params[0];
              String password = params[1];
              return Integer.valueOf(connecter(login,password));
         }
     
         public void onPostExecute(Integer result)
         {
              if (result != null && result.intValue() == 1) {
                  Intent ouvrirActivy = new Intent("com.example.dvp.MAINACTIVITY");
                  MyActivity.this.startActivity(ouvrirActivy);  // <= MyActivity étant le nom de la classe englobante
              } else {
                  MyActivity.this.affichage.setText("id incorrect"); // <= ce n'est pas vrai... si le réseau est down ?
              }
         }
    }
     
     
    seConnecter.setOnClickListener(new View.OnClickListener() {
     			@Override
    			public void onClick(View v) {
                                 LoginTask task = new LoginTask ();
                                 task.execute(login.getText().toString(),password.getText().toString());
                            }
    });
    Bon après il y a d'autres questions... la fonction de login renvoie 1 ou 0 si j'ai bien compris... mais comment fait le web-service pour authentifier l'utilisateur par la suite ? il faudrait au moins une sorte de "token" pour cela.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [WB18] Connexion BDD + Erreur redirection
    Par Benduroy dans le forum WebDev
    Réponses: 0
    Dernier message: 05/05/2014, 10h09
  2. Erreur connexion BDD Oracle
    Par sam-sam dans le forum Bases de données
    Réponses: 0
    Dernier message: 03/12/2010, 13h50
  3. Connexion BDD MySql, erreur dll Mysql.Data.CF
    Par mustardpimp dans le forum Windows Mobile
    Réponses: 6
    Dernier message: 16/02/2010, 14h46
  4. Erreur connexion bdd access
    Par offspring dans le forum C#
    Réponses: 9
    Dernier message: 12/07/2008, 01h15
  5. [BDD] Erreur dans la connexion à une base MySQL
    Par dodo10 dans le forum Eclipse Java
    Réponses: 1
    Dernier message: 24/01/2005, 19h52

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