Italian Errore invio Astreams

Discussion in 'Italian Forum' started by nicolino33, May 7, 2018.

  1. nicolino33

    nicolino33 Active Member Licensed 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):

    Code:
    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?
     
  2. LucaMs

    LucaMs Expert Licensed User

  3. nicolino33

    nicolino33 Active Member Licensed 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?
     
  4. nicolino33

    nicolino33 Active Member Licensed 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.
     
  5. LucaMs

    LucaMs Expert Licensed User

    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?]
     
  6. LucaMs

    LucaMs Expert Licensed User

    Anzi, "ci smanettiamo" un po', perché chiaramente la "discussione" è apertissima a tutti.
     
  7. Star-Dust

    Star-Dust Expert Licensed User

    Nella versione Android inferiore alla 6 c'è un bug e quindi l'immagine deve essere necessariamente salvata vedi la mia libreria
     
  8. LucaMs

    LucaMs Expert Licensed User

    Che bello, "non siamo soli" :p
     
    Star-Dust likes this.
  9. nicolino33

    nicolino33 Active Member Licensed User

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

    Code:
    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.

    Code:
    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
     
  10. nicolino33

    nicolino33 Active Member Licensed 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....
     
  11. nicolino33

    nicolino33 Active Member Licensed User

    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?
     
  12. Star-Dust

    Star-Dust Expert Licensed 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:
    Code:
    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:
    Code:
    Dim Bmp As Bitmap = Funzioni.BytesToBitmap(BuffImg)
    in questo
    Code:
    Dim Bmp As Bitmap = BytesToImage(BuffImg)
    Con questo non mi chiedere più informazioni, senno lo sviluppo io il programma. :p
    Buona giornata
     
    sirjo66 likes this.
  13. nicolino33

    nicolino33 Active Member Licensed 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...
     
  14. Star-Dust

    Star-Dust Expert Licensed 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: May 7, 2018
  15. nicolino33

    nicolino33 Active Member Licensed User

    E' si... va bene, grazie ancora!
     
  16. nicolino33

    nicolino33 Active Member Licensed 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?
     
  17. nicolino33

    nicolino33 Active Member Licensed User

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

    Code:
    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.
     
  18. LucaMs

    LucaMs Expert Licensed User

    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...
     
  19. nicolino33

    nicolino33 Active Member Licensed 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.
     
  20. LucaMs

    LucaMs Expert Licensed User

    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)
     
Loading...
  1. This site uses cookies to help personalise content, tailor your experience and to keep you logged in if you register.
    By continuing to use this site, you are consenting to our use of cookies.
    Dismiss Notice