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

Offline franluzzi

  • Nuovo arrivato
  • *
  • Post: 32
  • Respect: 0
    • Mostra profilo
Bluetooth: come inviare oggetti serializzati e foto?
« il: 05 Gennaio 2012, 18:33:32 CET »
0
Salve a tutti io dovrei inviare via bluetooth sia una foto e anche degli oggetti serializzati.
Fino ad aprire il socket ci sono arrivato anche grazie all'esempio della BluethootChat, però quest'ultima invia sul socket solo stringhe io invece devo inviare foto e oggetti :-)

Come posso fare?

Spero di ricevere presto una risposta
Grazie mille

Offline franluzzi

  • Nuovo arrivato
  • *
  • Post: 32
  • Respect: 0
    • Mostra profilo
Re:Bluetooth: come inviare oggetti serializzati e foto?
« Risposta #1 il: 07 Gennaio 2012, 10:28:09 CET »
0
Nessuno sà come aiutarmi?

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:Bluetooth: come inviare oggetti serializzati e foto?
« Risposta #2 il: 07 Gennaio 2012, 10:47:47 CET »
0
Nessuno sà come aiutarmi?

Non banalissimo, credo che nel tuo caso dovresti convertire gli oggetti in stream esadecimali e mandarli come testo. Dico non banalissimo perchè per distinguere tra testo e dati ci vuole un minimo di protocollo.
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline franluzzi

  • Nuovo arrivato
  • *
  • Post: 32
  • Respect: 0
    • Mostra profilo
Re:Bluetooth: come inviare oggetti serializzati e foto?
« Risposta #3 il: 07 Gennaio 2012, 16:36:34 CET »
0
Sai indicarmi dove posso trovare qualche codice di esempio?

Offline doctorX

  • Nuovo arrivato
  • *
  • Post: 37
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    Galaxy S2
  • Sistema operativo:
    Ubuntu 10.04
Re:Bluetooth: come inviare oggetti serializzati e foto?
« Risposta #4 il: 09 Gennaio 2012, 20:26:53 CET »
0
Potresti inviare una prima stringa con l informazione sul file..tipo nome e estensione..
Quindi realizzare un protocollo che invia l'intero file dopo averlo convertito in array di byte..piu o meno allo stesso modo in cui avviene per bluetoothchat..
infatti se ci fai caso le stringhe prima di essere trasmesse sono convertite in array di byte..

Offline franluzzi

  • Nuovo arrivato
  • *
  • Post: 32
  • Respect: 0
    • Mostra profilo
Re:Bluetooth: come inviare oggetti serializzati e foto?
« Risposta #5 il: 21 Gennaio 2012, 11:36:44 CET »
0
Ragazzi ho bisogno di voi. Io devo inviare via bluetooth una foto .jpg. Ho scritto questo codice:

SENDER
Codice (Java): [Seleziona]
ByteArrayOutputStream baos = new ByteArrayOutputStream();
fotoBitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos);
final byte[] foto_byte = baos.toByteArray();
     
Thread invio_byte_foto=new Thread(){
        public void run(){
           //Write to the connected OutStream
        try {
                mmOutStream.write(foto_byte);
        } catch (IOException e) {
            Log.e("ERRORE", "Exception during write", e);
           cancel();
           state.set(NOT_CONNECTED);
           return;
        }
        Log.i("Scambio Profili Completi", "Termine invio Foto");
        }
};
invio_byte_foto.start();

RECIVER
Codice (Java): [Seleziona]
buffer = new byte[1024];
bytes = mmInStream.read(buffer);
Bitmap bitmapimage = BitmapFactory.decodeByteArray(buffer, 0, bytes);
String filepath = "/sdcard/foto_"+device.getAddress()+".jpg";
File imagefile = new File(filepath);
FileOutputStream fos = new FileOutputStream(imagefile);
bitmapimage.compress(CompressFormat.JPEG, 100, fos);
fos.flush();
fos.close();

Però sul ricevente il metodo BitmapFactory.decodeByteArray(buffer, 0, bytes); mi ritorna null e mi viene lanciata questa eccezione:

01-21 10:24:59.547: E/ERRORE(5787): java.io.FileNotFoundException: /sdcard/foto_5C:4C:A9:CA:C2:B2.jpg
01-21 10:24:59.547: E/ERRORE(5787):    at org.apache.harmony.luni.platform.OSFileSystem.open(OSFileSystem.java:244)
01-21 10:24:59.547: E/ERRORE(5787):    at java.io.FileOutputStream.<init>(FileOutputStream.java:97)
01-21 10:24:59.547: E/ERRORE(5787):    at java.io.FileOutputStream.<init>(FileOutputStream.java:69)

Sapreste dirmi qual'è il problema?
Grazie mille

Offline franluzzi

  • Nuovo arrivato
  • *
  • Post: 32
  • Respect: 0
    • Mostra profilo
Re:Bluetooth: come inviare oggetti serializzati e foto?
« Risposta #6 il: 21 Gennaio 2012, 14:53:52 CET »
0
Nessuno sà aiutarmi? :'(

Offline Verandi

  • Utente normale
  • ***
  • Post: 378
  • Respect: +75
    • Mostra profilo
  • Sistema operativo:
    Windows 7
Re:Bluetooth: come inviare oggetti serializzati e foto?
« Risposta #7 il: 21 Gennaio 2012, 18:12:17 CET »
0
Ciao!
Nella stringa filepath devi usare il metodo getExternalStorageDirectory() della classe Environment e da ciò prendere la stringa della directory. In più devi richiamare il mkDir()  sull'imageFile e controllare di aver inserito nel manifest i permessi di scrittura sull'external storage.

Offline franluzzi

  • Nuovo arrivato
  • *
  • Post: 32
  • Respect: 0
    • Mostra profilo
Re:Bluetooth: come inviare oggetti serializzati e foto?
« Risposta #8 il: 21 Gennaio 2012, 18:56:37 CET »
0
Ciao!
Nella stringa filepath devi usare il metodo getExternalStorageDirectory() della classe Environment e da ciò prendere la stringa della directory. In più devi richiamare il mkDir()  sull'imageFile e controllare di aver inserito nel manifest i permessi di scrittura sull'external storage.

Grazie della risposta. Mi puoi dire quali permessi devo settare? Con il debug ho notato che
Codice (Java): [Seleziona]
BitmapFactory.decodeByteArray(buffer, 0, bytes);
ritorna un valore null. Come posso risolvere?

Di nuovo grazie mille

Offline Verandi

  • Utente normale
  • ***
  • Post: 378
  • Respect: +75
    • Mostra profilo
  • Sistema operativo:
    Windows 7
Re:Bluetooth: come inviare oggetti serializzati e foto?
« Risposta #9 il: 21 Gennaio 2012, 19:11:36 CET »
0
Grazie della risposta. Mi puoi dire quali permessi devo settare?
Ti serve il WRITE_EXTERNAL_STORAGE.
Citazione
Con il debug ho notato che
Codice (Java): [Seleziona]
BitmapFactory.decodeByteArray(buffer, 0, bytes);ritorna un valore null. Come posso risolvere?

Prova a controllare tramite log che l'immagine di partenza non sia nulla. Eventualmente posta il codice del thread che fa l'ascolto per 9i dati in entrata dal bluetooth.  ;-)

Offline franluzzi

  • Nuovo arrivato
  • *
  • Post: 32
  • Respect: 0
    • Mostra profilo
Re:Bluetooth: come inviare oggetti serializzati e foto?
« Risposta #10 il: 21 Gennaio 2012, 19:39:00 CET »
0
Ti serve il WRITE_EXTERNAL_STORAGE.
Prova a controllare tramite log che l'immagine di partenza non sia nulla. Eventualmente posta il codice del thread che fa l'ascolto per 9i dati in entrata dal bluetooth.  ;-)

Si l'immagine di partenza non è nulla e l'ascolto lo faccio con il codice che ho postato prima:
Codice (Java): [Seleziona]
buffer = new byte[1024];
bytes = mmInStream.read(buffer);
ByteArrayInputStream bais=new ByteArrayInputStream(buffer);
Bitmap bitmapimage = BitmapFactory.decodeStream(bais);
Con la read leggo l'array di byte che ho inviato sull'input stream del socket bluetooth.
Mi sta venendo il dubbio che un array di byte grande 1024 non basti per contenere un immagine jpeg. Ho provato a farlo più grande ma il metodo  BitmapFactory.decodeStream(bais) mi restituisce sempre null!! Non sò più cosa fare!!

HELP! :-)

Offline Verandi

  • Utente normale
  • ***
  • Post: 378
  • Respect: +75
    • Mostra profilo
  • Sistema operativo:
    Windows 7
Re:Bluetooth: come inviare oggetti serializzati e foto?
« Risposta #11 il: 21 Gennaio 2012, 20:51:32 CET »
0
Sì, ma l'ascolto dove l'hai inserito? Deve essere in background.
« Ultima modifica: 21 Gennaio 2012, 20:56:12 CET da Verandi »

Offline doctorX

  • Nuovo arrivato
  • *
  • Post: 37
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    Galaxy S2
  • Sistema operativo:
    Ubuntu 10.04
Re:Bluetooth: come inviare oggetti serializzati e foto?
« Risposta #12 il: 22 Gennaio 2012, 08:19:08 CET »
0
Non vorrei sbagliare ma con quel codice il buffer legge max 1024 bytes e non tutta la dimensione del file..mentre un buffer più ampio pare che non funziona..in precedenza avevo provato anche io non riuscendo..
A meno che non esista un metodo per inviare l'intero oggetto serializzato (correggetemi se sbaglio), una soluzione potrebbe essere quella di un protocollo in cui un ciclo nel mittente spezzetta l'array di byte in tanti array da 1024 inviandolo uno per volta..e dall'altra parte un ciclo ricevente che ricostruisce il file dopo aver letto e memorizzato tutti i prezzi..
« Ultima modifica: 22 Gennaio 2012, 08:21:24 CET da doctorX »

Offline franluzzi

  • Nuovo arrivato
  • *
  • Post: 32
  • Respect: 0
    • Mostra profilo
Re:Bluetooth: come inviare oggetti serializzati e foto?
« Risposta #13 il: 22 Gennaio 2012, 18:12:59 CET »
0
Oggi ho provato a fare così:

SENDER:
Codice (Java): [Seleziona]
 invio_byte_foto=new Thread(){
                                        public void run(){
                                                SharedPreferences prefs=getSharedPreferences(TabProfileActivity.PROFILO_UTENTE,Context.MODE_PRIVATE);
                                                                String uri_photo=prefs.getString("photo", "");
                                                                Uri picturez = Uri.parse(uri_photo);
                                                                Bitmap fotoBitmap = null;
                                                                try {
                                                                        fotoBitmap = MediaStore.Images.Media.getBitmap(getContentResolver(), picturez);
                                                                } catch (Exception e) {
                                                                        // TODO Auto-generated catch block
                                                                        Log.e("ERRORE", "ERRORE NEL CARICARE LA FOTO",e);
                                                                        return;
                                                                }
                                                        boolean valrest=fotoBitmap.compress(Bitmap.CompressFormat.JPEG, 100, mmOutStream);
                                                        Log.i("VALORE RESTITUITO DA BITMAP COMPRESS", ""+valrest);
                                                        Log.i("Scambio Profili Completi", "Termine invio Foto");
                                   
                                                }
};
invio_byte_foto.start();

RECIVER:
Codice (Java): [Seleziona]
ricevi_byte_foto=new Thread(){
                                                public void run(){
                                                        Log.i("Scambio Profili Completi", "Inizio Ricezione Foto");
                                                        try{
                                                                Bitmap bitmapimage=BitmapFactory.decodeStream(mmInStream);
                                                                String filename = "foto"+device.getAddress()+".jpg";
                                                                File imagefile = new File(Environment.getExternalStorageDirectory() ,filename);
                                                                imagefile.mkdir();
                                                                FileOutputStream fos = new FileOutputStream(imagefile);
                                                                bitmapimage.compress(CompressFormat.JPEG, 100, fos);
                                                                fos.flush();
                                                                fos.close();
                                                                //ricavare dal bitmap l'uri che salverò nel infoProfilo
                                                                Uri foto=Uri.fromFile(new File(filename));
                                                                info_profilo_utente.setUri_string_foto(foto.toString());
                                                                Log.i("Scambio Profili Completi", "Fine Ricezione Foto");
                                                        }catch (Exception e) {
                                                                Log.e("ERRORE", "Exception during read photo", e);
                                                return;
                                                        }
                                                }
};
ricevi_byte_foto.start();

Però mi dà il seguente errore:

01-22 17:04:47.696: W/System.err(3116): java.io.IOException: Operation Canceled
01-22 17:04:47.696: W/System.err(3116):    at android.bluetooth.BluetoothSocket.readNative(Native Method)
01-22 17:04:47.696: W/System.err(3116):    at android.bluetooth.BluetoothSocket.read(BluetoothSocket.java:307)
01-22 17:04:47.706: W/System.err(3116):    at android.bluetooth.BluetoothInputStream.read(BluetoothInputStream.java:96)
01-22 17:04:47.706: W/System.err(3116):    at java.io.InputStream.read(InputStream.java:133)
01-22 17:04:47.706: W/System.err(3116):    at java.io.BufferedInputStream.fillbuf(BufferedInputStream.java:157)
01-22 17:04:47.706: W/System.err(3116):    at java.io.BufferedInputStream.read(BufferedInputStream.java:346)
01-22 17:04:47.706: W/System.err(3116):    at android.graphics.BitmapFactory.nativeDecodeStream(Native Method)
01-22 17:04:47.706: W/System.err(3116):    at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:459)
01-22 17:04:47.706: W/System.err(3116):    at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:515)
01-22 17:04:47.706: W/System.err(3116):    at griglie.progetto.CercaPersoneService$ConnectedThread$4.run(CercaPersoneService.java:593)
01-22 17:04:47.706: D/skia(3116): ---- read threw an exception
01-22 17:04:47.716: D/skia(3116): --- decoder->decode returned false


Non sò più dove mettere le mani!!! E come se mi chiudesse il socket!!
« Ultima modifica: 22 Gennaio 2012, 18:18:35 CET da franluzzi »

Offline franluzzi

  • Nuovo arrivato
  • *
  • Post: 32
  • Respect: 0
    • Mostra profilo
Re:Bluetooth: come inviare oggetti serializzati e foto?
« Risposta #14 il: 22 Gennaio 2012, 18:30:40 CET »
0
Ho provato adesso con il Debug e l'operazione

Codice (Java): [Seleziona]
boolean valrest=fotoBitmap.compress(Bitmap.CompressFormat.JPEG, 100, mmOutStream);
del SENDER genera la seguente eccezione:
java.io.IOException: Connection reset by peer