Italian Errore invio Astreams

nicolino33

Active Member
Licensed User
Longtime User
Buongiorno a tutti, sto utilizzando un pc per inviare immagini a un telefono android, nel pc utilizzo B4J, mentre nel telefono B4A, la procedura che eseguo per inviare l'immagine dal pc al telefono è la seguente:

- leggo i byte del file immagine presente sul pc utilizzando
Buffer = Bit.InputStreamToBytes(File.OpenInput(IndirizzoFoto ,""))

- invio i byte al telefono utilizzando
AStreams.Write(Buffer)

non uso il WriteStream perché ho necessità di evitare il salvataggio del file nel telefono, quindi una volta ricevuti i byte li converto in immagine e dovrei visualizzarla, invece succede che seppur il numero di byte inviati sia corretto, e il valore di ogni singolo byte idem, quando effettuo la lettura dell'immagine utilizzando la seguente funzione mi restituisce un errore di caricamento bitmap al punto btm.Initialize2(in):

B4X:
 Private bmp As Bitmap
 Private in As InputStream
 in.InitializeFromBytesArray(Buffer,0,Buffer .Length-1)
 bmp.Initialize2(in)
 Return bmp

Mentre se faccio l'opposto utilizzando lo stesso sistema, quindi invio un immagine dal telefono al pc, tutto funziona, lo stesso vale se provo convertire il buffer di byte nel pc in un immagine mediante il codice sopra esposto, la posso imprimere in una imageview e la vedo.

Ho provato a visualizzare i byte ricevuti dal telefono in formato numerico ed è tutto ok, ogni byte è lo stesso che visualizzo nel pc, ma se provo a visualizzarli convertendoli in caratteri nel telefono alcuni non sono gli stessi che vedo nel pc, sembra essere un errore di codifica, avete qualche idea su come risolvere?
 

nicolino33

Active Member
Licensed User
Longtime User
Ciao Mario grazie del consiglio, utilizzo già il prefix, mi sono accorto però che questo problema lo fa soltanto su telefoni che hanno una versione Android inferiore alla 7, è probabile che l'inizializzazione della bmp non avvenga a causa di questo?
 

nicolino33

Active Member
Licensed User
Longtime User
Tra l'altro per ovviare al problema avevo pensato di provare ad estrarre i byte singolarmente e metterli in un altro buffer uno ad uno mediante un ciclo for-next, l'ho fatto ma aparte che impiega una vita per immagini già di 5/600k, il problema rimane, praticamente legge i byte in un formato differente da quello che invia il pc, cosa strana come dicevo accade solo nelle versioni Android <7, e cosa ancor più strana è che seppure il valore numerico di ogni byte coincide con quello inviato dal pc non c'è modo di far inizializzare la bitmap, non gli piace il buffer, eppure è identico, stessi valori numerici, stesso numero di byte, lo fa solo su buffer inviati mediante astreams, e ho provato anche senza il prefix, stesso problema.
 

LucaMs

Expert
Licensed User
Longtime User
Ciao Mario grazie del consiglio, utilizzo già il prefix, mi sono accorto però che questo problema lo fa soltanto su telefoni che hanno una versione Android inferiore alla 7, è probabile che l'inizializzazione della bmp non avvenga a causa di questo?
Non mi pare l'inizializzazione della bitmap, il problema, visto che i byte sembra che non corrispondano esattamente.

Potresti pubblicare un sorgente d'esempio? Così ci smanetto un po' :D

[C'è un motivo ben preciso per non salvare i byte nel telefono? Non puoi semplicemente cancellarli una volta ricreata la bitmap?]
 

Star-Dust

Expert
Licensed User
Longtime User
Nella versione Android inferiore alla 6 c'è un bug e quindi l'immagine deve essere necessariamente salvata vedi la mia libreria
 

nicolino33

Active Member
Licensed User
Longtime User
:) grazie ancora... allora questa è la sub che si occupa di inviare i byte dal PC al telefono:

B4X:
Sub InviaMessaggio(StrToByte() As Byte,IndirizzoFoto As String)
 
 Log("Invio messaggio:")
 Private inp As InputStream
 Private bc As ByteConverter
 Private countingStream As CountingInputStream
 Private Buffer() As Byte
 'se è presente l'indirizzo di una foto la allego
 If IndirizzoFoto <> Null Then
  If IndirizzoFoto <> "NoFoto" And IndirizzoFoto <> "" Then
   Buffer = Bit.InputStreamToBytes(File.OpenInput(IndirizzoFoto ,""))
  End If
 End If
 
 Private TotBytes(StrToByte.Length + Buffer.Length) As Byte
 Dim bc As ByteConverter
 bc.ArrayCopy(StrToByte,0,TotBytes,0,StrToByte.Length)
 
 If Buffer.Length > 0 Then
  bc.ArrayCopy(Buffer,0,TotBytes,StrToByte.Length,Buffer.Length)
  Log("E' presente una foto da inviare")
 End If
 Dim Str As String=BytesToString(TotBytes, 0, TotBytes.Length, "UTF8")
 
 Log("Stringa dati: " & Str)
 
 'preparo i bytes da inviare
 inp.InitializeFromBytesArray(TotBytes, 0, TotBytes.Length)
   
 'invio la foto
 AStreams.Write(TotBytes)
 Log("Messaggio inviato")
End Sub

mentre per la ricezione utilizzo questa, dove StrStop è una stringa che indica lo stop della parte di testo inclusa nei byte dell'immagine, buffer è tutto il pacchetto di bytes che include anche un testo, praticamente invio un buffer che include anche un messaggio testuale separato dai byte dell'immagine mediante appunto la StrStop che equivale a una stringa di 14 caratteri. La stringa la leggo correttamente, i byte dell'immagina se letti uno ad uno pure, quindi estraggo con il copy soltanto la parte di byte che mi serve per l'immagine, e tento di visualizzarla. Fatto da telefono a PC funziona, e le sub per la trasmissione e ricezione sono identiche, i byte arrivano come quando sono trasmessi da PC a telefono, stessi valori, il PC visualizza l'immagine mentre il telefono no, ripeto, problema solo con Android<7, con la 7 non ho problemi.

B4X:
 Dim Str As String
 If Buffer.Length>StrStop.Length Then
  For a = 0 To Buffer.Length - StrStop.Length
   Str=BytesToString(Buffer, a, StrStop.Length, "UTF8")
   If Str = StrStop Then
    StrIn = Regex.Split(SP1,BytesToString(Buffer, 0, a+StrStop.Length, "UTF8"))
   
    If Buffer.Length > a+StrStop.Length Then
     
     Dim bc As ByteConverter
   
     'genero l'indirizzo e il nome della foto
     DateTime.DateFormat = "ddMMyyyyHHmmSSSS"
     NomeFotoRicevuta = DateTime.Date(DateTime.Now) & ".png"
     
     Dim BuffImg(Buffer.Length-(a+StrStop.Length)) As Byte
     bc.ArrayCopy(Buffer,a+StrStop.Length,BuffImg,0,Buffer.Length-(a+StrStop.Length))
     
     For a = 0 To 20
      Log(Chr(BuffImg(a)))
     Next
     
     Dim Bmp As Bitmap = Funzioni.BytesToBitmap(BuffImg)
     Dim out As OutputStream = File.OpenOutput(DirStream, NomeFotoRicevuta, False)
     Bmp.WriteToStream(out,100,"PNG")
     Log("Immagine ricevuta")
     
     Exit
    End If
    
   End If
  Next
 End If
 

nicolino33

Active Member
Licensed User
Longtime User
Il for a = 0 to 20 l'ho usato per vedere i byte, sia con char che senza, con char non sono corretti, senza si, vedo i valori esatti sul telefono come quelli che ci sono sul PC, LA Funzioni.BytesToBitmap(BuffImg) INCLUDE IL CODICE POSTATO IN PRECEDENZA CHE DA ERRORE....
 

nicolino33

Active Member
Licensed User
Longtime User
Nella versione Android inferiore alla 6 c'è un bug e quindi l'immagine deve essere necessariamente salvata vedi la mia libreria

A..... ecco..... infatti pareva qualcosa di veramente strano, quindi devo perforza fare il salvataggio e poi eliminare, ovvero devo tassativamente utilizzare l'evento AStreams_NewStream vincolando l'applicazione all'attesa di un secondo messaggio che contiene il file immagine? Ma mi chiedo: se l'evento AStreams_NewStream scaturisce è perché il file è stato ricevuto e salvato, quindi, non è possibile sfruttare la tecnica che attiva questo evento per salvare il file? magari utilizzando qualche java runmethod?
 

Star-Dust

Expert
Licensed User
Longtime User
non ho capito cosa vuoi fare.

Cmq fai in controllo , se la versione è inferiore a 6 (SDK 23) devi salvare.

Il problema si trova nel passaggio dei byte letti nell'immagine. esempio:
B4X:
Private Sub BytesToImage(bytes() As Byte) As Bitmap
    Try
        Dim In As InputStream
        In.InitializeFromBytesArray(bytes, 0, bytes.Length - 1)
        Dim bmp As Bitmap
        bmp.Initialize2(In)                           ' <<< Here occurs the error
      
    Catch
        Dim out As OutputStream = File.OpenOutput(File.DirInternalCache, "tmp.png", False)
        out.WriteBytes(bytes, 0, bytes.Length)
        out.Close
          
        Dim bmp As Bitmap = LoadBitmap(File.DirInternalCache, "tmp.png")
    End Try
  
    Return bmp
End Sub

Correggi questo:
B4X:
 Dim Bmp As Bitmap = Funzioni.BytesToBitmap(BuffImg)
in questo
B4X:
 Dim Bmp As Bitmap = BytesToImage(BuffImg)

Con questo non mi chiedere più informazioni, senno lo sviluppo io il programma. :p
Buona giornata
 

nicolino33

Active Member
Licensed User
Longtime User
Grazie per il consiglio, ma questo però mi costringe a salvare ogni volta il file (File.OpenOutput(File.DirInternalCache, "tmp.png", False) ) , inizialmente era cosi che avevo fatto, e poi visti i tempi stretti di cui necessitavo ho pensato di evitare il salvataggio ricorrendo appunto all'inizializzazione diretta della bmp. In poche parole comunque mi stai confermando che prima della 6 non ho scelta, devo per forza salvare il file. Mi rattrista un po' sta cosa, che brutto bug...
 

Star-Dust

Expert
Licensed User
Longtime User
Metti come requisito minimo MinTarget 23 ;)

Se hai tempo da perdere puoi creare una Bitmap Mutable e Canvas .... e byte per byte ti disegni l'immagine...
Vedinil BitmapCreator di Erel come esempio usando la xui
 
Last edited:

nicolino33

Active Member
Licensed User
Longtime User
Ragazzi torno un attimo su questo post, il trasferimento dei file è ok, ma sorge un altro problema: quando trasferisco delle foto dal pc al telefono, posso aprirle con le imageview, posso esportarle in altre app come Facebook Instagram etc... ma non posso aprirle direttamente, quando clicco sul file scaricato nel telefono si apre la galleria! Non posso nemmeno inviarle tramite email, quando le allego e invio il messaggio questo non parte e rimane in coda in gmail. Avete idea di cosa possa trattarsi?
 

nicolino33

Active Member
Licensed User
Longtime User
Aggiungerei che lo stesso problema avviene semplicemente copiando un file dalla DirAssets ad una qualunque altra directory, ad esempio con

B4X:
File.Copy(File.DirAssets,"logo.jpg",File.DirDefaultExternal,"logo.jpg")

il file copiato in DirDefaultExternal è presente, si può girare in altre app e visualizzarlo in una imageview, ma non si può ne inviare in email, ne aprirlo cliccandoci sopra.
 

LucaMs

Expert
Licensed User
Longtime User
il file copiato in DirDefaultExternal è presente, si può girare in altre app e visualizzarlo in una imageview, ma non si può ne inviare in email, ne aprirlo cliccandoci sopra.
Suppongo che dipenda solo dalla versione di Android che utilizzi.

Normalmente, con un click o long click su un file, vedi le opzioni che hai a disposizione.

Ad esempio, ho appena provato su un 4.4.2, singolo click su un file immagine nella Root, si apre l'immagine; click sull'immagine aperta, compaiono vari menu, per cestinarla, condividerla (email compresa) e anche "Apri con... - Modifica - Imposta immagine come...
 

nicolino33

Active Member
Licensed User
Longtime User
Grazie Luca, ma il problema persiste, versione android 7, clicchi sul file copiato e si apre la galleria, tenti di inviarlo con gmail e il messaggio non parte, è come se il file fosse corrotto, ho provato a utilizzare sia il copy che le varie opzioni di stream, il file c'è si crea e lo puoi condividere con altre app e vederlo nella imageview quando lo carichi tramite Imageview.bitmap =, ma non c'è modo di aprirlo manualmente. Quindi se per ipotesi invio un file da server a telefono, per vederlo sono costretto ad aprirlo con una view di B4A.
 

LucaMs

Expert
Licensed User
Longtime User
Grazie Luca, ma il problema persiste, versione android 7, clicchi sul file copiato e si apre la galleria, tenti di inviarlo con gmail e il messaggio non parte, è come se il file fosse corrotto, ho provato a utilizzare sia il copy che le varie opzioni di stream, il file c'è si crea e lo puoi condividere con altre app e vederlo nella imageview quando lo carichi tramite Imageview.bitmap =, ma non c'è modo di aprirlo manualmente. Quindi se per ipotesi invio un file da server a telefono, per vederlo sono costretto ad aprirlo con una view di B4A.
Hai provato a passare un file immagine da pc a root del dispositivo direttamente da pc (cavo usb)? Secondo me farà la stessa cosa.
Ora provo anch'io su un android 7 (il tempo di accenderlo e collegarlo)
 
Top