7
votes

Android - Objet Pass via Bluetooth

L'exemple de chat Bluetooth pour Android est très utile pour apprendre à passer des chaînes entre téléphones - est-il possible d'utiliser le même code pour passer des objets entre les téléphones? J'ai les mêmes classes définies dans les deux téléphones, je veux juste passer l'instance d'une classe d'un téléphone à un autre. Y a-t-il un exemple de code disponible? J'ai essayé d'utiliser la sérialisation et le remplacement de sortiestream et d'introuvream dans l'exemple de discussion avec ObjectOutputStream et ObjectInPhatStream, mais cela ne semblait pas fonctionner


0 commentaires

6 Réponses :


2
votes

L'exemple de chat Bluetooth est une démonstration d'utiliser le profilé de port série (SPP) basé sur RFCOMM. Vous pouvez envoyer la série en série des données que vous aimez une fois la connexion établie; Vous devez simplement être capable de représenter vos objets dans un courant d'octets en série, c'est-à-dire la sérialiser.

Par conséquent, l'utilisation de la sérialisation serait certainement un moyen d'obtenir vos objets envoyés sur le lien. Les fonctions d'envoi et de réception de l'API Bluetooth traitent des tableaux d'octets, mais vous pourriez facilement adapter l'exemple de chat Bluetooth pour utiliser des flux, par exemple. La fonction d'envoi lirait des octets à partir d'un flux et les placerait dans un tampon de matrice, puis vous envoyez ce tampon, etc. Ensuite, le code de l'application parlerait simplement par des tuyaux de flux d'entrée et de sortie - c'est un moyen que je l'ai fait dans le passé.

Donc, il n'y a rien de mal à votre idée réelle. Le plus gros problème est que la façon dont vous avez mis en œuvre n'est pas correcte et que plus problématique est que la façon dont vous avez posée votre question est assez médiocre. Vous devez être plus descriptif sur exactement ce que n'a pas fonctionné, expliquez ce que vous avez déjà essayé et publier des échantillons de code et des sorties de logcat afin que nous puissions vous aider correctement.

Enfin, j'ai trouvé ce que je pense être un bogue dans l'exemple de code de chat Bluetooth: la fonction de réception des données passe une référence du tableau d'octet de réception à la flambée utilisée pour afficher chaque ligne de texte reçue. C'est bon lorsque de petites quantités de texte lent sont transmises, mais lorsque vous essayez d'envoyer de grandes quantités de données, vous commencez à voir que les données étant corrompues, probablement parce que l'adaptateur ArrayList est toujours en train de lire des octets de la même matrice lorsque Le tableau est rempli de données encore plus récentes.


0 commentaires

0
votes

trev16v, Tout d'abord, merci pour vos commentaires initiaux.

Pour sérialiser mon objet, j'ai utilisé les classes SerializeObject et désériializeObject de http://www.jondev.net/articles/android_Serialization_example_(java ) Ils semblent bien fonctionner: Si je serai sérialisée un objet (créé d'une classe qui implémente sérialisable) à partir d'un téléphone / une activité et de le désérialiser à partir du même téléphone que je parle d'obtenir un objet sur l'octet généré []. P >

J'ai ensuite essayé d'utiliser le même code dans la classe BluetoothThatServices dans l'exemple de chat Bluetooth dans Oder pour envoyer l'objet sérialisé à l'autre téléphone (dans cet exemple, il existe P>

   public void run() {
        Log.i(TAG, "BEGIN mConnectedThread");
        byte[] buffer = new byte[10240];
        int bytes;
        // Keep listening to the InputStream while connected
        while (true) {
            try {
                // Read from the InputStream
                bytes = mmInStream.read(buffer);

                    // Send the obtained bytes to the UI Activity
                mHandler.obtainMessage(BluetoothManageActivity.MESSAGE_READ, bytes, -1, buffer)
                        .sendToTarget();
            } catch (IOException e) {
                Log.e(TAG, "disconnected", e);
                connectionLost();
                break;
            }
        }
    }


0 commentaires

-1
votes

Je trouvais réellement le problème - lorsque les octets sont chargés à l'aide de

try {
   // Read from the InputStream
    bytes = mmInStream.read(buffer);


0 commentaires

0
votes

La réponse est oui. Une chaîne est un objet. Rappelles toi? Mais comment faire exactement le faire, je cherche toujours une solution et c'est ce qui m'a amené ici ...


0 commentaires

7
votes

Le meilleur moyen que j'ai trouvé pour gérer ceci était ce qui suit:

  1. J'ai configuré mes objets comme mise en œuvre sérialisable que je voulais envoyer. Li>
  2. i Configurez le code suivant pour gérer les messages: P>

    /**
     * Write to the connected OutStream.
     * @param buffer  The bytes to write
     */
    public void write(AbstractMessage buffer) {
        try {
            Log.v(TAG,"Writing \""+(buffer.serialize())+"\"");
            mmOutStream.write(buffer.serialize());
    
            // Share the sent message back to the UI Activity
            mHandler.obtainMessage(AbstractMessageManager.MESSAGE_WRITE, -1, -1, buffer)
                    .sendToTarget();
        } catch (IOException e) {
            Log.e(TAG, "Exception during write", e);
        }
    }
    
  3. J'ai changé les instructions d'écriture pour accepter une série Serializable, puis effectuez la dernière écriture: p>

    public byte[] serialize() throws IOException {
        ByteArrayOutputStream b = new ByteArrayOutputStream();
        ObjectOutputStream o = new ObjectOutputStream(b);
        o.writeObject(this);
        return b.toByteArray();
    }
    //AbstractMessage was actually the message type I used, but feel free to choose your own type
    public static AbstractMessage deserialize(byte[] bytes) throws IOException, ClassNotFoundException {
        ByteArrayInputStream b = new ByteArrayInputStream(bytes);
        ObjectInputStream o = new ObjectInputStream(b);
        return (AbstractMessage) o.readObject();
    


1 commentaires

Ne fonctionne pas pour moi, je reçois une exception que l'en-tête d'octet ne peut pas être lu correctement. Peut-être que les appareils interprètent le tableau d'octets différemment ou envoient / reçoivent dans un mauvais ordre. Des idées?



0
votes

Face au même problème ... Lorsque j'envoie une série d'objets d'un périphérique Android, les données envoient correctement ... mais dans la réception de la fin, tous les objets ne construisent pas d'octet reçu [].

Une erreur se produit au hasard pour tout objet reçu, mais le même code fonctionne correctement en Java ... Je pense que les octets manquent lorsque vous transférez des données d'un périphérique à un autre ...

objet sérialisable à l'octet [ ] et l'octet [] à la conversion d'objet peuvent être effectués avec le code suivant xxx


0 commentaires