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 :

Atteindre une base de données Postgresql externe, problème d'accès à Internet


Sujet :

Android

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite Avatar de KibitO
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2004
    Messages
    616
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Septembre 2004
    Messages : 616
    Par défaut Atteindre une base de données Postgresql externe, problème d'accès à Internet
    Bonjour,

    Je me suis mis au Java récemment et j'essaie de développer une petite application Android qui se connecte à une base de données externe Postgresql (via le connecteur JDBC correspondant : postgresql-9.4-1201.jdbc4.jar).

    Je travaille sous l'environnement Eclipse Luna et j'ai spécifié le connecteur en faisant clic-droit sur le répertoire "libs/" de mon projet puis "coller" le fichier .jar. Ca m'a demandé de l'enregistrer ce que j'ai accepté. Avant cette étape, mon code levait une exception comme quoi le driver n'existait pas.

    Le problème est que je n'arrive pas à me connecter à la base de données distante avec ce connecteur, j'ai une Exception de Type EACCES. Je me suis renseigné et à priori j'avais oublié de spécifié dans le fichier Manifest l’autorisation à l'application de se connecter à Internet. Donc j'ai rajouté cette ligne dans le fichier Manifest :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <uses-permission android:name="android.permission.INTERNET"/>
    Sauf que maintenant, je ne passe même plus dans un catch, mon application plante complètement ("AndroidExample s'est arrêté").

    Voici mon code :

    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
     
    // Connexion à la base de données Postgresql GF
    try {
        Class.forName("org.postgresql.Driver");
        System.out.println("Driver O.K.");
        String url = "jdbc:postgresql://<IP>:5432/<databasename>";
        String user = "user";
        String passwd = "mdp";
     
     
        if (isOnline())
        {
            Connection conn = DriverManager.getConnection(url, user, passwd);
     
            String connectionMsg = "Connexion effective !!";                    
            System.out.println(connectionMsg);                    
            txtConnection.setTextColor(Color.GREEN);
            txtConnection.setText(connectionMsg);
            conn.close();
        }
        else
        {
            txtConnection.setTextColor(Color.RED);
            txtConnection.setText("Pas connecté à Internet");
        }                    
     
        Article myArticle = new Article(contents);
        txtConnection.append(myArticle.getArtNr());                    
     
        } 
        catch (SQLException sqlEx)
        {
            sqlEx.printStackTrace();
            txtConnection.setTextColor(Color.RED);
            txtConnection.setText(sqlEx.getMessage());
            txtConnection.append(" | " + sqlEx.toString());
            txtConnection.append(sqlEx.getCause().getMessage());
        }    
        catch (Exception e) {
            e.printStackTrace();
            txtConnection.setTextColor(Color.RED);
            txtConnection.setText(e.getMessage());
            txtConnection.append(" | " + e.toString());
            txtConnection.append(e.getCause().getMessage());
        }
    La fonction isOnline pour savoir si on a une connectivité Internet :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public boolean isOnline() {        ConnectivityManager cm =
                (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
            NetworkInfo netInfo = cm.getActiveNetworkInfo();
            return netInfo != null && netInfo.isConnectedOrConnecting();
        }
    La méthode isOnline() renvoie true et c'est sur la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Connection conn = DriverManager.getConnection(url, user, passwd);
    que ça plante apparemment.

    Pourtant je gère l'exception générale. Vous avez une idée pour faire fonctionner mon programme ? Merci par avance.

    Kib

  2. #2
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 693
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 693
    Par défaut
    1- On accède pas à une base de données distante directement pour des raisons de sécurité. On passe en principe par un webservice.
    2- Ton problème viens sans doute du fait que ton drivers jdbc fait une requête réseau sur le thread ui et non sur un thread à part , ce qui est interdit sur android.
    3- Que dit le log cat ? Quelle erreur est affichée ?
    Pry Framework php5 | N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre confirmé
    Profil pro
    Développeur Back-End
    Inscrit en
    Août 2003
    Messages
    138
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Back-End

    Informations forums :
    Inscription : Août 2003
    Messages : 138
    Par défaut
    Salut,
    Se connecter "directement" à la base de données n'est pas vraiment la façon habituelle de faire. Il est préférable de se connecter à un serveur, via un web service en échangeant les données entre les deux par du JSON (par exemple).

    Je ne sais pas s'il est possible de se conencter directement à une base de données, mais si c'était le cas, ce serait un gros trou de sécurité car la connection à la base passerait "en clair" sur le réseau et la base de données serait obligée d'accepter les connections de n'importe quelle machine sur internet. Alors qu'en utilisant un web service, la base de données n'accepte QUE les connections à partir du serveur web qui est généralement situé sur la même machine que la base de données. Et ton webservice permet de vérifier que seules certaines requetes soient autorisées...

    Bon courage,

    Axel

  4. #4
    Membre émérite Avatar de KibitO
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2004
    Messages
    616
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Septembre 2004
    Messages : 616
    Par défaut
    Merci pour vos réponses. J'allais justement apporter des précisions quant au logCat. Je sais que je dois passer par un webservice mais là c'était pour des tests basiques, je ne déploierai pas une telle application. Je teste, je débute Je tâtonne.

    Après vérification du log, je vais déjà corriger ça pour qu'il gère l'exception :


    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
    05-13 11:22:30.693: E/AndroidRuntime(21542): FATAL EXCEPTION: main
    05-13 11:22:30.693: E/AndroidRuntime(21542): Process: com.example.androidqrcodeexample, PID: 21542
    05-13 11:22:30.693: E/AndroidRuntime(21542): java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=0, result=-1, data=Intent { act=com.google.zxing.client.android.SCAN flg=0x80000 (has extras) }} to activity {com.example.androidqrcodeexample/com.example.androidqrcodeexample.AndroidQrCodeExample}: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String java.lang.Throwable.getMessage()' on a null object reference
    05-13 11:22:30.693: E/AndroidRuntime(21542):     at android.app.ActivityThread.deliverResults(ActivityThread.java:4122)
    05-13 11:22:30.693: E/AndroidRuntime(21542):     at android.app.ActivityThread.handleSendResult(ActivityThread.java:4165)
    05-13 11:22:30.693: E/AndroidRuntime(21542):     at android.app.ActivityThread.access$1400(ActivityThread.java:181)
    05-13 11:22:30.693: E/AndroidRuntime(21542):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1522)
    05-13 11:22:30.693: E/AndroidRuntime(21542):     at android.os.Handler.dispatchMessage(Handler.java:102)
    05-13 11:22:30.693: E/AndroidRuntime(21542):     at android.os.Looper.loop(Looper.java:145)
    05-13 11:22:30.693: E/AndroidRuntime(21542):     at android.app.ActivityThread.main(ActivityThread.java:6066)
    05-13 11:22:30.693: E/AndroidRuntime(21542):     at java.lang.reflect.Method.invoke(Native Method)
    05-13 11:22:30.693: E/AndroidRuntime(21542):     at java.lang.reflect.Method.invoke(Method.java:372)
    05-13 11:22:30.693: E/AndroidRuntime(21542):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1388)
    05-13 11:22:30.693: E/AndroidRuntime(21542):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1183)
    05-13 11:22:30.693: E/AndroidRuntime(21542): Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String java.lang.Throwable.getMessage()' on a null object reference
    05-13 11:22:30.693: E/AndroidRuntime(21542):     at com.example.androidqrcodeexample.AndroidQrCodeExample.onActivityResult(AndroidQrCodeExample.java:144)
    05-13 11:22:30.693: E/AndroidRuntime(21542):     at android.app.Activity.dispatchActivityResult(Activity.java:6626)
    05-13 11:22:30.693: E/AndroidRuntime(21542):     at android.app.ActivityThread.deliverResults(ActivityThread.java:4118)
    05-13 11:22:30.693: E/AndroidRuntime(21542):     ... 10 more

    Apparemment la méthode getMessage() ne fonctionne pas. Je pense que c'est le deuxième appel (sur un objet vide ?) qui ne marche pas car le premier marchait.

  5. #5
    Membre émérite Avatar de KibitO
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2004
    Messages
    616
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Septembre 2004
    Messages : 616
    Par défaut
    Ok j'ai commenté cette ligne et maintenant je rentre bien dans l'exception et j'ai le message :


    "ConnectivityService: Neither user 10242 nor current process has android.permission.ACCESS_NETWORK_STATE."


    Je rajoute la permission dans le manifest et j'ai cette erreur :


    "Something unusual has occurred to cause the driver to fail. Please report this exception."

  6. #6
    Membre confirmé
    Profil pro
    Développeur Back-End
    Inscrit en
    Août 2003
    Messages
    138
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Back-End

    Informations forums :
    Inscription : Août 2003
    Messages : 138
    Par défaut
    Il faut éviter de lancer une connexion dans le même thread que l'activité principale car si l'appli attends trop longtemps, Android fait planter l'appli (pour conserver les ressources).
    Il faut donc utiliser un thread différent en utilisant les async task (tu trouveras pleins de tuto sur le net, même si c'est un peu complexe à comprendre).

    Bon courage,

    Axel

  7. #7
    Membre émérite Avatar de KibitO
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2004
    Messages
    616
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Septembre 2004
    Messages : 616
    Par défaut
    Ca a l'air d'être ça merci

    http://developer.android.com/referen...Exception.html

    Je vais essayer de déporter ce code qui accède au réseau dans une autre activité. En même temps ça m'apprendra à communiquer entre les deux

Discussions similaires

  1. Problème avec une base de données PostgreSQL
    Par katia13 dans le forum Doctrine2
    Réponses: 6
    Dernier message: 25/07/2014, 17h36
  2. Réponses: 7
    Dernier message: 07/10/2010, 15h04
  3. connexion à une base de donnée PostgreSQL avec Psycopg
    Par mon_proj dans le forum Bibliothèques tierces
    Réponses: 1
    Dernier message: 06/03/2008, 12h58
  4. Connexion à une Base de données PostgreSQL distante
    Par soumou dans le forum PostgreSQL
    Réponses: 5
    Dernier message: 02/05/2007, 13h16
  5. BIRT et une Base de données PostgreSQL
    Par soumou dans le forum BIRT
    Réponses: 2
    Dernier message: 02/05/2007, 00h44

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