2012-08-24 21 views
11

ho messo insieme un piccolo test web app che converte una tela HTML per un'immagine (utilizzando canvas2image di Nihilogic libreria JavaScript), poi sostituisce la tela con l'immagine generata e visualizza un messaggio di notifica all'utente di toccare (lungo) quell'immagine per salvarla sul proprio telefono.Render immagine come flusso di dati nel browser di Android

Il problema che ho riscontrato è che il browser Web predefinito di Android ("Internet") non esegue il rendering del flusso di dati codificati base64 che rappresenta l'immagine, ma visualizza invece un segno di punto interrogativo. C'è un modo per risolvere questo? Se sì, allora come?

+0

Quale versione di Android sono in esecuzione? Funziona in Jelly Bean (4.1.1). Posso generare l'immagine dalla tela e salvarla senza problemi. – alex

+0

puoi provare a vedere se creare un div con stile css 'background-image: url (data: image/png; base64datahere ....);' funziona invece di creare un img con src? – Prasanth

risposta

4

Utilizzare ContentProvider personalizzato ed eseguire l'override di openFile() per restituire lo stream come Tempfile.

È possibile utilizzare l'URI come src nel tag html A.

<a src="Example://file"></a> 
public class ExampleProvider extends ContentProvider { 

    @Override 
    public ParcelFileDescriptor openFile(Uri uri, String mode) throws FileNotFoundException {   
     //Get your bitmap 
     Bitmap bmp = BitmapFactory.decodeResource(getContext().getResources(), R.drawable.file_example); 
     File tempFile = null; 
     try { 
      //Create the tempfile form a stream 
      tempFile = File.createTempFile("tempfile", ".thumb", getContext().getCacheDir()); 
      BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(tempFile)); 
      bmp.compress(Bitmap.CompressFormat.JPEG, 100, out); 
      out.close(); 
      if(mode.equals("r")) { 
       return ParcelFileDescriptor.open(tempFile, ParcelFileDescriptor.MODE_READ_ONLY); 
      } 
     } 
     catch(IOException e) { 
      LOGGER.error("Couldn't generate temp file for thumb view, guid:" + guid, e); 
     } 
     finally { 
      if(tempFile != null { 
       //The unix filesystem automatically deletes the file once all handles are gone 
       tempFile.delete(); 
      } 
     } 
    } 
} 
+0

Soluzione molto bella. Questo tipo di soluzione fornisce sempre un modello di sviluppo del controllo completo al team di progetto, consentendo di trattare l'eccezione per risolverlo e mantenere il modo predefinito quando l'eccezione non è necessaria per essere trattata. Ma penso che questo sia un buon approccio se, e solo se, anche la retrocompatibilità è il tuo obiettivo. – Miere

+0

@Ty S. Che lingua è esattamente? Non posso dirlo –

+0

Java sulla piattaforma Android. – tsmith

1

Sulla base di commento immagine @goldenparrot di può essere visto con

<img src="data:image/png;base64,BASE64_STRING_HERE" /> 

(e anche con i CSS suggerito background-image) quando i dati base64 è già presente quando la pagina viene caricata . Tuttavia, non funziona per qualche motivo quando viene immessa esattamente la stessa stringa di dati in modo dinamico. Anche l'immagine caricata staticamente con dati base64 ha problemi: non reagisce in alcun modo al clic lungo, quindi non può essere scaricato. Sto usando Android 2.3.6.

Edit: Si può anche provare ad aggiungere ulteriore collegamento per il download

<a href="data:application/octet-stream;base64,BASE64_STRING_HERE">download file</a> 

ma non ha funzionato per me. Android ha appena mostrato i contenuti di quel file come testo. Il normale browser web del desktop ha aperto la finestra di dialogo "download file" ma non ha suggerito alcuna estensione per quel file, quindi l'utente deve aggiungerlo manualmente.

Vedi anche Browser/HTML Force download of image from src="data:image/jpeg;base64..."

La mia pagina html di prova è http://kuitsi.bitbucket.org/stackoverflow12113616.html

Problemi correlati