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 :

Problème application Bluetooth


Sujet :

API standards et tierces Android

  1. #1
    Candidat au Club
    Homme Profil pro
    Stagiaire
    Inscrit en
    Avril 2016
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Stagiaire

    Informations forums :
    Inscription : Avril 2016
    Messages : 9
    Points : 3
    Points
    3
    Par défaut Problème application Bluetooth
    Bonjour à tous !

    Je suis entrant de réaliser une application dont le but est de se connecter à un boitier ELM 327 en Bluetooth pour ensuite pouvoir remonter certaines informations contenue dans les voitures à travers l'OBD2. Je suis actuellement entrant de développer l'aspect connexion Bluetooth mais j'ai un problème. En effet lorsque je suis les différents tutoriels Bluetooth sur Android Studio je bute lors de la connexion Bluetooth.

    Mon programme affiche une ListeView contenant les différentes devices déjà appairée avec mon téléphone et scan les devices non connues (le scan marchait parfaitement jusqu'à ce que je fasse la mise à jour android 6.0.1 sur mon Galaxy S6 mais ne detecte plus rien depuis). Une fois les différents objet BluetoothDevice créés et listés dans la listeview, je peux appuyer sur l'une d'elles pour que mon téléphone lance le ConnectionThread. Mais lors de la connexion ci dessous, j'ai une erreur :

    "/BluetoothAdapter: getBluetoothService() called with no BluetoothManagerCallback
    04-27 14:35:01.831 30520-30520/com.example.brebondy.ouioui D/CONNECTTHREAD: Could not connect: java.io.IOException: read failed, socket might closed or timeout, read ret: -1
    "

    La partie du code qui génère ce problème ce trouve ci-dessous. Il se situe dans une classe Java ConnectionThread().

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    public boolean connect() {
     
            try {
                bTSocket.connect();
                if(bTSocket.isConnected()) {
                    Log.d("CONNECTTHREAD", "connection nikel");
                }
                else{
                    Log.d("CONNECTTHREAD", "connexion ratéee");
                }
    En recherchant sur divers forums j'ai pu voir que beaucoup de personne avait eu ce problèmes mais leurs solution n'a pas marché pour moi. Je tiens à préciser que l'erreur s'effectue lorsque je clique sur l'une des devices.
    Toutes pistes pourrait m'être vraiment utile car là je bloque réellement. Merci à tous d'avance.
    Ne voulant pas copier coller des lignes et des lignes de code j'ai volontairement publié le minimum. Si il vous faut d'autre partie du code pour mieux comprendre le contexte n'hésitez pas à me le demander .

    Cordialement,
    Khoneb

  2. #2
    Candidat au Club
    Homme Profil pro
    Stagiaire
    Inscrit en
    Avril 2016
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Stagiaire

    Informations forums :
    Inscription : Avril 2016
    Messages : 9
    Points : 3
    Points
    3
    Par défaut
    Je viens rajouter quelques informations.

    Dorénavant mon téléphone peut via mon application s'appairer avec n'importes quelles devices Bluetooth à sa porter. Sur le côté téléphone une pop-up apparaît demandant de valider le code et la même chose apparait sur la device à laquelle mon téléphone tente de se connecter. Une fois ces manipulations faites, mon téléphone est appairé avec l'autre device. Néanmoins la même erreur apparaît et le code rentre directement dans le catch ce qui m'empêche d'utiliser cette connexion.

    Cordialement,
    Khoneb

  3. #3
    Membre éprouvé Avatar de Drowan
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2014
    Messages
    460
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juin 2014
    Messages : 460
    Points : 1 014
    Points
    1 014
    Par défaut
    Peux-tu poster l'ensemble du code de ta classe ConnectionThread ?
    Sur quelle ligne exactement l'exception est-elle levée ?
    Peux-tu aussi poster le code de ta méthode onListItemClick() ? (qui doit elle celle qui lance le thread de connexion)
    "On sera toujours mieux installé assis en 1ère que debout en 2nde", un illustre inconnu


    Avant de poser une question vérifiez si elle n'a pas déjà une réponse dans les cours et tutoriels
    Si votre problème est pensez à marquer la conversation comme telle
    Si un message est utile, pertinent, et/ou vous êtes d'accord avec, pensez à à l'inverse s'il est inutile, faux ou que vous n'êtes pas d'accord, pensez à

  4. #4
    Candidat au Club
    Homme Profil pro
    Stagiaire
    Inscrit en
    Avril 2016
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Stagiaire

    Informations forums :
    Inscription : Avril 2016
    Messages : 9
    Points : 3
    Points
    3
    Par défaut
    Bonjour .

    Avant tout je te remercie d'avoir pris du temps pour me répondre .

    Ensuite, j'ai réussi à résoudre le problème (ne me jugez pas :'( ). J'essayais tout simplement de me connecter à mon ordinateur portable sans y avoir mis de serveur Bluetooth. Après avoir téléchargé un simple petit programme "Remote PC Server" j'ai pu me connecter relativement facilement. Donc côté code ça a été.

    En revanche j'ai pas mal avancé depuis, et je me suis confronté à pas mal d'autre problème, le plus gros étant celui d'un écran noir lors d'un changement d'activité.

    En effet, mon appli fonctionne de la manière suivante :

    1 - L'activité A créer une liste des devices Bluetooth disponible à proximité ; en cliquant dessus, j'actionne un thread qui réceptionne l'objet "BluetoothDevice"
    2 - Ce thread (ConnectThread dont je parlais dans mon problème de base) créer une BluetoothSocket à partir de l'objet BluetoothDevice et tente de s'y connecter. Je précise encore une fois que l'objet BluetoothDevice est mon ordinateur portable avec un serveur Bluetooth dessus. Une fois la connection faites, je lance une deuxième activité, l'activité B.
    3 - L'activité B récupère l'objet BluetoothSocket et est sensé permettre de créer un dialogue entre mon ordinateur et mon téléphone. (Le but étant plus tard de connecter mon téléphone portable à un boitier OBD-II afin de remonter des DATA de ma voiture en live.)

    Le problème apparaît entre l'étape 2 et l'étape 3. En effet, lorsque la connexion se fait (quand le serveur est fonctionnel), l'écran noir va s'afficher à la place de l'activité B. J'ai attendu 5 minutes pour voir si l'écran noir disparaissait à un moment, mais il reste bien là. Si pendant l'écran noir j'éteint mon serveur Bluetooth (que la connexion est donc perdu) alors mon activité B apparaît comme par magie.

    Je me suis donc dit que le problème venait de la fonction BluetoothSocket.connect() qui devait pomper trop d'énergie pour être dans un thread, j'ai donc essayer de la mettre dans un service pour la faire tourner en fond (en remplacement le ConnectThread par un Service_connexion qui fait le même boulot). Le problème est toujours là.

    Voici le code de mon activité A :

    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
      // LE RECEIVER QUI PERMET DE DECOUVRIR LES NOUVELLES DEVICES 
        private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {
                String action = intent.getAction();
     
                // SE LANCE QUAND UNE NOUVELLE DEVICE EST DETECTE
     
                if (BluetoothDevice.ACTION_FOUND.equals(action)) {
                    int doublon_present = 0 ;
                    String devi_name;
                    BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
                    Log.e("DECOUVERTE", device.getName());
                    BDevice devi = new BDevice(device.getName(), device.getAddress(), device);
                    devi_name = devi.get_BDevice_name();
     
                    for(int i=0; i<mAdapter.getCount(); i++) {
                        BDevice doublon = mAdapter.getItem(i);
                        String doublon_name = doublon.get_BDevice_name();
                        Log.d("DOUBLON FOR DEVI FOUND", doublon_name+ " " + devi_name);
                        if(Objects.equals(devi_name, doublon_name)){
                            doublon_present = 1;
                        }
                        Log.d("Valeur de l'int", String.valueOf(doublon_present));
                    }
                    if(doublon_present == 0){
                        mAdapter.add(devi);
                    }
                }
            }
        };
     
        // LORSQUE JE CLIQUE SUR UNE DES DEVICES
        private  AdapterView.OnItemClickListener mDeviceClickListener = new AdapterView.OnItemClickListener() {
            BluetoothSocket socketsocket;
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                BluetoothDevice dev = deviceItemList.get(position).get_BDevice();
                device_obd = dev;
                DeviceSingleton.setDevice(device_obd);
     
                // Service qui gère la connexion Bluetooth tourne mon petit coupaing
                Intent intentzoo = new Intent(MainActivity.this, Service_connexion.class);
                startService(intentzoo);
                IntenSingleton.setService(intentzoo);
     
                //On lance l'intent
                Intent myIntent = new Intent(MainActivity.this, ManageOBD2.class);
                myIntent.putExtra("oui", true);
                socketsocket = SocketSingleton.getSocket();
                MainActivity.this.startActivity(myIntent);
                //thread_connexion.cancel();
            }
        };
    .

    Voici pour mon service qui permet d'effectuer la connection.
    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
    public class Service_connexion extends Service {
     
        private static final String TAG = "Service Connexion";
        private BluetoothSocket bTSocket;
        int mStartMode;
        BluetoothSocket tmp;
        BluetoothDevice device;
     
        @Override
        public void onCreate() {
     
            String MY_UUID = "00001101-0000-1000-8000-00805F9B34FB";
            device = DeviceSingleton.getDevice();
            try {
                tmp = device.createRfcommSocketToServiceRecord(UUID.fromString(MY_UUID));
            } catch (IOException e) {
                e.printStackTrace();
            }
            bTSocket = tmp;
            Log.i(TAG, "Service onCreate");
        }
     
        @Override
        public int onStartCommand(Intent intent, int flags, int startId){
            try{
                bTSocket = (BluetoothSocket) device.getClass().getMethod("createRfcommSocket", new Class[]{int.class}).invoke(device, 1);
                bTSocket.connect();
                SocketSingleton.setSocket(bTSocket);
                Log.d("SERVICE CONNEXION", "Le service à bien connecté nos devices-zer");
            }catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException | IOException e) {
                e.printStackTrace();
            }
            return mStartMode;
        }
     
        @Override
        public void onDestroy(){
            try {
                bTSocket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
            super.onDestroy();
        }
     
        @Nullable
        @Override
        public IBinder onBind(Intent intent) {
            return null;
        }
    J’espère que le code n'est pas imbitable, je répète que je suis vraiment débutant en Java / Android Studio donc j'imagine que rien n'est fait de manière optimale, et que mon code est laid comme tout.

    Merci d'avance à tous,
    Khoneb

  5. #5
    Membre éprouvé Avatar de Drowan
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2014
    Messages
    460
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juin 2014
    Messages : 460
    Points : 1 014
    Points
    1 014
    Par défaut
    Il faut savoir que les actions que tu réalise sur ta socket sont bloquantes (par exemple connect() ou bien read()). Il ne faut donc pas les utiliser dans le thread UI. Ton écran noir vient peut-être de là.

    Sinon, je ne m'y connais pas du tout en Service, je ne peux donc pas t'aider là-dessus
    "On sera toujours mieux installé assis en 1ère que debout en 2nde", un illustre inconnu


    Avant de poser une question vérifiez si elle n'a pas déjà une réponse dans les cours et tutoriels
    Si votre problème est pensez à marquer la conversation comme telle
    Si un message est utile, pertinent, et/ou vous êtes d'accord avec, pensez à à l'inverse s'il est inutile, faux ou que vous n'êtes pas d'accord, pensez à

  6. #6
    Candidat au Club
    Homme Profil pro
    Stagiaire
    Inscrit en
    Avril 2016
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Stagiaire

    Informations forums :
    Inscription : Avril 2016
    Messages : 9
    Points : 3
    Points
    3
    Par défaut
    Bonjour et merci .

    Il ne faut donc pas les utiliser dans le thread UI
    .
    Du coup tu me conseillerais de les mettre où ? Et quand tu parles de thread UI, tu parles de l'activité ou pas du tout ? J’avoue que les termes comme ceux là ne me sont pas du tout familier.

    Khoneb.

  7. #7
    Membre éprouvé Avatar de Drowan
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2014
    Messages
    460
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juin 2014
    Messages : 460
    Points : 1 014
    Points
    1 014
    Par défaut
    Le thread UI est le thread "principal", c'est celui de base de ton applicatio. C'est lui qui gere l'nterface graphique (d'où son nom). C'est pour cela qu'il ne faut pas le bloquer sinon cela pose des problèmes de réaction aux actions de l'utilisateur.

    Il faut utiliser ces fonctions dans d'autres threads. Tu peux utiliser la classe Thread ou bien les AsyncTask.
    "On sera toujours mieux installé assis en 1ère que debout en 2nde", un illustre inconnu


    Avant de poser une question vérifiez si elle n'a pas déjà une réponse dans les cours et tutoriels
    Si votre problème est pensez à marquer la conversation comme telle
    Si un message est utile, pertinent, et/ou vous êtes d'accord avec, pensez à à l'inverse s'il est inutile, faux ou que vous n'êtes pas d'accord, pensez à

Discussions similaires

  1. Réponses: 6
    Dernier message: 10/07/2006, 14h46
  2. Aide Probléme Connxion ADSL
    Par amazircool dans le forum Dépannage et Assistance
    Réponses: 4
    Dernier message: 19/03/2006, 23h09
  3. Aide: Problème avec la taille de mon fichier
    Par ATTIA dans le forum Langage
    Réponses: 6
    Dernier message: 15/03/2006, 10h19
  4. de l'aide, problème avec lecteur CD/graveur
    Par princetn dans le forum Périphériques
    Réponses: 2
    Dernier message: 18/02/2006, 06h37
  5. problème application avec 2 BD
    Par PAYASS59 dans le forum Requêtes
    Réponses: 2
    Dernier message: 16/01/2006, 15h13

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