2012-01-04 7 views
7

Heres mia situazione:che ottiene da array di byte in oggetto JSON per android app

Ho un servizio WCF RESTful in esecuzione sul mio server, il servizio ha lo scopo di ottenere vari tipi di dati relativi a persone provenienti da un database e marche quei dati disponibili come un singolo oggetto JSON. Funziona alla grande!

[EDIT] Esiste un altro servizio che mantiene una cache di immagini nel file system sul server. Quando una richiesta viene inviata al servizio RESTful, quel servizio richiede quindi un'immagine dal servizio immagini. Se l'immagine è già nella cache (stessa larghezza, altezza e persona della richiesta), la restituisce (come array di byte). Dobbiamo utilizzare questo servizio per recuperare le immagini.

Ora quello che voglio è l'immagine di quella persona. Nel nostro database, l'immagine è lunga e cruda (ew). Tuttavia, ho già trattato questo problema (paragrafo precedente). L'immagine ora è una matrice Byte. Sono abbastanza nuovo per Android e non sono sicuro di quale sia il modo migliore per recuperare questa immagine. Quello che pensavo di poter fare era aggiungere l'array di byte all'oggetto JSON e quindi usare il decodificatore base64 per convertirlo in un'immagine disegnabile. Tuttavia, ogni volta che provo, si verifica un timeout e mi dice che è previsto "," o "]" in corrispondenza di un indice arbitrario del char buffer per l'oggetto JSON.

Sono stato in grado di estrarre i piccoli bit di dati dall'oggetto JSON senza problemi, ma ora che c'è un enorme array di byte, JSONObject mi odia. Quale sarebbe un modo migliore per ottenere questa immagine dal mio servizio?

risposta

10
  1. Base64 codificare l'array di byte per ottenere una stringa.
  2. Aggiungere la stringa all'oggetto JSON e inviarla.
  3. Quando viene ricevuto JSON, estrarre la stringa.
  4. Base64 lo decodifica per recuperare l'array di byte.
  5. Utilizzare la matrice di byte per creare Immagine.
+0

Credo che sia quello che stavo cercando. –

+0

Credo che sia il modo migliore: http://stackoverflow.com/a/15929125/245460 –

0

Vedere questa domanda su storing images, è sempre meglio memorizzare questo tipo di dati sul file system. Se possibile, deprecare quel campo e creare uno script per spostare le immagini esistenti sul file system.

È quindi necessario memorizzare le immagini su un file system (o una sorta di sistema di gestione dei contenuti) che può essere recuperato da un URL.

Quindi memorizzare l'URL nel database. puoi quindi inviarlo nel tuo oggetto json.

{ 
... 
    image_url:<url from database> 
... 
} 

Quando il client riceve questo, effettua una chiamata a tale URL e scarica l'immagine.

Il client dovrà effettuare una chiamata separata per recuperare l'immagine, ma in genere è meglio che riempire il database con dati binari. Questo può anche funzionare a tuo vantaggio se vuoi visualizzare velocemente i dati mentre permetti di scaricare l'immagine in background.

+0

Non esattamente quello che intendevo, ho cercato di chiarire un po 'di più. Controlla la mia modifica. –

0

meglio che usare la codifica Base64 è questo modo di tornare Stream (da WCF RAW programming)

 

[OperationContract, WebGet] 
public Stream GetTestImage(Image image) 
{ 
    MemoryStream stream = new MemoryStream(); 
    image.Save(stream, System.Drawing.Imaging.ImageFormat.Jpeg); 
    stream.Position = 0; 
    WebOperationContext.Current.OutgoingResponse.ContentType = "image/jpeg"; 
    return stream; 
} 
 
Problemi correlati