2012-08-24 41 views
11

我把一個小test web app,一個HTML畫布轉換爲圖像(通過使用Nihilogic的canvas2image JavaScript庫),則替換所生成的圖像的帆布和顯示一條消息通知用戶觸摸(長)該圖像以將其保存到他們的手機。渲染圖像作爲數據流中的Android瀏覽器

我遇到的問題是Android的默認網頁瀏覽器(「Internet」)不呈現表示圖像的base64編碼數據流,而是顯示問號標誌。有沒有辦法解決這個問題?如果是,那麼如何?

+0

正在運行什麼Android版本?它適用於果凍豆(4.1.1)。我可以從畫布生成圖像,並可以保存它沒有問題。 – alex

+0

你可以嘗試,看看是否創建一個與CSS風格'背景圖像的div:url(數據:圖像/ PNG; base64datahere ....);'工程,而不是與src創建一個IMG? – Prasanth

回答

4

使用自定義ContentProvider並重寫openFile()以將該流作爲Tempfile返回。

您可以使用URI作爲html標籤中的src。

<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

非常好的解決方案。 這種解決方案總是爲項目團隊提供一個完全控制的開發模型,允許您處理異常以修復它,並在不需要處理異常時保持默認方式。 但是,我認爲這似乎是一種很好的方法,只要向後兼容性也是你的關注點。 – Miere

+0

@Ty S.究竟是什麼語言?我不知道。 –

+0

Android平臺上的Java。 – tsmith

1

基於@goldenparrot圖像的註釋可以與

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

(並且還與建議的CSS背景圖像)時的base64數據已經存在當頁面加載可以看出。但是,由於某些原因,動態輸入完全相同的數據字符串時,它不起作用。即使使用base64數據靜態加載的圖像也存在問題:它不會以任何方式對長時間點擊做出反應,因此無法下載。我正在使用Android 2.3.6。

編輯:您也可以嘗試增加額外的下載鏈接

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

但它並沒有爲我工作。 Android只是將文件的內容顯示爲文本。普通桌面Web瀏覽器確實打開了「下載文件」對話框,但沒有爲該文件提供任何擴展名,所以用戶必須手動添加它。

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

我的測試HTML頁面http://kuitsi.bitbucket.org/stackoverflow12113616.html