我组装了一个小型测试网络应用程序,它将 HTML 画布转换为图像(通过使用 Nihilogic 的canvas2image JavaScript 库),然后用生成的图像替换画布并显示一条消息,通知用户触摸(长)该图像以便将其保存到他们的手机中。
我遇到的问题是 Android 的默认 Web 浏览器(“Internet”)不会呈现代表图像的 base64 编码数据流,而是显示一个问号符号。有没有办法解决这个问题?如果是,那么如何?
我组装了一个小型测试网络应用程序,它将 HTML 画布转换为图像(通过使用 Nihilogic 的canvas2image JavaScript 库),然后用生成的图像替换画布并显示一条消息,通知用户触摸(长)该图像以便将其保存到他们的手机中。
我遇到的问题是 Android 的默认 Web 浏览器(“Internet”)不会呈现代表图像的 base64 编码数据流,而是显示一个问号符号。有没有办法解决这个问题?如果是,那么如何?
使用自定义 ContentProvider 并覆盖 openFile() 以将流作为 Tempfile 返回。
您可以使用 URI 作为 html A 标签中的 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();
}
}
}
}
基于@goldenparrot 图像的评论可以看到
<img src="data:image/png;base64,BASE64_STRING_HERE" />
(以及建议的 css 背景图像)当加载页面时已经存在 base64 数据时。但是,当动态输入完全相同的数据字符串时,由于某种原因,它不起作用。即使是带有 base64 数据的静态加载图像也存在问题:它不会以任何方式对长按做出反应,因此无法下载。我使用的是安卓 2.3.6。
编辑:您也可以尝试添加额外的下载链接
<a href="data:application/octet-stream;base64,BASE64_STRING_HERE">download file</a>
但这对我不起作用。Android 只是将该文件的内容显示为文本。普通桌面网络浏览器确实打开了“下载文件”对话框,但没有建议该文件的任何扩展名,因此用户必须手动添加它。
另请参阅浏览器/HTML 强制从 src="data:image/jpeg;base64..." 下载图像
我的测试 html 页面是http://kuitsi.bitbucket.org/stackoverflow12113616.html