2012-08-24 39 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