Autore Topic: Bluetooth: come inviare oggetti serializzati e foto?  (Letto 525 volte)

Offline Verandi

  • Moderatore globale
  • Utente normale
  • *****
  • Post: 378
  • Respect: +74
    • Mostra profilo
  • Sistema operativo:
    Windows 7
Re:Bluetooth: come inviare oggetti serializzati e foto?
« Risposta #15 il: 22 Gennaio 2012, 18:36:32 CET »
0
Dovresti dare un'occhiata alla bluetooth chat che c'è negli api demos e capire bene la logica con cui creano e gestiscono la connessione. Una volta testato che il tutto funzioni passando una stringa di testo da un device all'altro, puoi fare tutti i test che vuoi usando le immagini.
Secondo me, procedere così, senza aver ben chiaro cosa si sta facendo, ti fa perdere un sacco di tempo.  ;-)

Offline franluzzi

  • Nuovo arrivato
  • *
  • Post: 32
  • Respect: 0
    • Mostra profilo
Re:Bluetooth: come inviare oggetti serializzati e foto?
« Risposta #16 il: 22 Gennaio 2012, 18:42:50 CET »
0
Dovresti dare un'occhiata alla bluetooth chat che c'è negli api demos e capire bene la logica con cui creano e gestiscono la connessione. Una volta testato che il tutto funzioni passando una stringa di testo da un device all'altro, puoi fare tutti i test che vuoi usando le immagini.
Secondo me, procedere così, senza aver ben chiaro cosa si sta facendo, ti fa perdere un sacco di tempo.  ;-)

Si infatti ormai la bluetooth chat la conosco a memoria :-) . L'applicazione che sto sviluppando fa scambio sia di testi (stringhe) che immagini. I testi vengono trasferiti senza problemi le immagini invece a tutt'ora mi stanno dando filo da torcere!!! :-D

Offline Verandi

  • Moderatore globale
  • Utente normale
  • *****
  • Post: 378
  • Respect: +74
    • Mostra profilo
  • Sistema operativo:
    Windows 7
Re:Bluetooth: come inviare oggetti serializzati e foto?
« Risposta #17 il: 22 Gennaio 2012, 23:11:36 CET »
0
Ho fatto qualche prova usando il codice della bluetooth chat, ed effettivamente, cercando di ricostruire l'immagine dall'array di byte, l'immagine è nulla.
Ho provato a ricavarla direttamente con il metodo che prende l'input stream come parametro - BitmapFactory.decodeStream(inputStream) - e l'immagine viene "ricostruita" correttamente.
Cercando di capire perché il primo metodo non funzionasse, ho fatto un po' di test loggando l'array prima dell'invio e dopo la ricezione, e ho scoperto che viene ricevuto a colpi. L'array della mia immagine era 1504 byte e mi veniva passato prima un pezzo di 1008, poi il restante pezzo di 496 byte. Quindi ad ogni invio la BitmapFactory veniva richiamata due volte, una per ogni pezzo inviato. Pensavo fosse un problema del mio codice, quindi ho cercato qualche esempio, trovando un paio di post in cui parlavano proprio della ricezione a "batches" dell'array. Dicoono che le dimensioni di ogni pezzo di array cambino in base alla dimensione del buffer in ricezione, ma a me rimane sempre fisso a 1008. Qui suggeriscono di ricomporlo, ma secondo me conviene usare direttamente il metodo che ricompone l'immagine direttamente dall'inputstream.  ;-)

Offline franluzzi

  • Nuovo arrivato
  • *
  • Post: 32
  • Respect: 0
    • Mostra profilo
Re:Bluetooth: come inviare oggetti serializzati e foto?
« Risposta #18 il: 23 Gennaio 2012, 10:00:27 CET »
0
Ho fatto qualche prova usando il codice della bluetooth chat, ed effettivamente, cercando di ricostruire l'immagine dall'array di byte, l'immagine è nulla.
Ho provato a ricavarla direttamente con il metodo che prende l'input stream come parametro - BitmapFactory.decodeStream(inputStream) - e l'immagine viene "ricostruita" correttamente.
Cercando di capire perché il primo metodo non funzionasse, ho fatto un po' di test loggando l'array prima dell'invio e dopo la ricezione, e ho scoperto che viene ricevuto a colpi. L'array della mia immagine era 1504 byte e mi veniva passato prima un pezzo di 1008, poi il restante pezzo di 496 byte. Quindi ad ogni invio la BitmapFactory veniva richiamata due volte, una per ogni pezzo inviato. Pensavo fosse un problema del mio codice, quindi ho cercato qualche esempio, trovando un paio di post in cui parlavano proprio della ricezione a "batches" dell'array. Dicoono che le dimensioni di ogni pezzo di array cambino in base alla dimensione del buffer in ricezione, ma a me rimane sempre fisso a 1008. Qui suggeriscono di ricomporlo, ma secondo me conviene usare direttamente il metodo che ricompone l'immagine direttamente dall'inputstream.  ;-)


Grande! Mi posteresti il codice che hai provato e ti funziona dove usi BitmapFactory.decodeStream(inputStream) inserendo sia il Thread che invia che quello che riceve l'immagine. Ti ringrazio moltissimo
« Ultima modifica: 23 Gennaio 2012, 10:05:43 CET da franluzzi »

Offline Verandi

  • Moderatore globale
  • Utente normale
  • *****
  • Post: 378
  • Respect: +74
    • Mostra profilo
  • Sistema operativo:
    Windows 7
Re:Bluetooth: come inviare oggetti serializzati e foto?
« Risposta #19 il: 23 Gennaio 2012, 10:12:08 CET »
0
Ho usato il codice della bluetooth chat passando la bitmap come array di byte invece che il testo digitato e nel connectedThread della classe BluetoothChatService, nel metodo run:
Codice (Java): [Seleziona]
       public void run() {
            Log.i(TAG, "BEGIN mConnectedThread");

            // Keep listening to the InputStream while connected
            while (true) {
                try {
                    // Read from the InputStream
               Bitmap bitmap =  BitmapFactory.decodeStream(mmInStream);
               
                } catch (IOException e) {
                    Log.e(TAG, "disconnected", e);
                    connectionLost();
                    // Start the service over to restart listening mode
                    BluetoothChatService.this.start();
                    break;
                }
            }
        }

Offline franluzzi

  • Nuovo arrivato
  • *
  • Post: 32
  • Respect: 0
    • Mostra profilo
Re:Bluetooth: come inviare oggetti serializzati e foto?
« Risposta #20 il: 23 Gennaio 2012, 10:24:52 CET »
0
Ho usato il codice della bluetooth chat passando la bitmap come array di byte invece che il testo digitato e nel connectedThread della classe BluetoothChatService, nel metodo run:
Codice (Java): [Seleziona]
       public void run() {
            Log.i(TAG, "BEGIN mConnectedThread");

            // Keep listening to the InputStream while connected
            while (true) {
                try {
                    // Read from the InputStream
               Bitmap bitmap =  BitmapFactory.decodeStream(mmInStream);
               
                } catch (IOException e) {
                    Log.e(TAG, "disconnected", e);
                    connectionLost();
                    // Start the service over to restart listening mode
                    BluetoothChatService.this.start();
                    break;
                }
            }
        }


Per Trasformare la Bitmap in array di byte hai usato il metodo
Codice (Java): [Seleziona]
ByteArrayOutputStream baos = new ByteArrayOutputStream();
boolean valrest=fotoBitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos);
byte[] foto_byte = baos.toByteArray();
                        
OPPURE DIRETTAMENTE QUESTA?
Codice (Java): [Seleziona]
fotoBitmap.toString().getBytes();   

Di nuovo grazie. Comunque provo e ti faccio sapere  :-)

Offline Verandi

  • Moderatore globale
  • Utente normale
  • *****
  • Post: 378
  • Respect: +74
    • Mostra profilo
  • Sistema operativo:
    Windows 7
Re:Bluetooth: come inviare oggetti serializzati e foto?
« Risposta #21 il: 23 Gennaio 2012, 10:27:05 CET »
0

Per Trasformare la Bitmap in array di byte hai usato il metodo
Codice (Java): [Seleziona]
ByteArrayOutputStream baos = new ByteArrayOutputStream();
boolean valrest=fotoBitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos);
byte[] foto_byte = baos.toByteArray();
                        

Sì, proprio questa.  :-)

Offline franluzzi

  • Nuovo arrivato
  • *
  • Post: 32
  • Respect: 0
    • Mostra profilo
Re:Bluetooth: come inviare oggetti serializzati e foto?
« Risposta #22 il: 24 Gennaio 2012, 12:04:15 CET »
0
Allora con il comando "Bitmap bitmap =  BitmapFactory.decodeStream(mmInStream)" non và, mentre se implemento i burst sembra che l'immagine venga trasmessa!!Ho scritto sembra perchè eseguito normalmente mi lancia eccezione sul socket mentre se eseguito in modalità debug va perfetto, la foto viene trasmessa perfettamente!!!MISTERO!!!

L'errore è
01-24 12:33:40.056: E/ERRORE(3642): java.io.IOException: Connection reset by peer

Si verifica quando faccio la write dei byte presi dal ByteArrayOutputStream
« Ultima modifica: 24 Gennaio 2012, 12:38:13 CET da franluzzi »