我的所有图片都是在Android文件系统中加密的。当我需要显示它们时,我需要解密,生成位图然后删除文件。我正在尝试使用Picasso来加载我的图像。我创建了一个 RequestHandler 来解密和加载图像。
RequestHandler 接受两种类型的结果:
1。位图或 2。一个流。
我正在尝试返回该流。这样Picasso可以使用最佳实践加载图像,防止内存不足。我创建了一个自定义的Stream类并重写Dispose()方法以在使用后删除解密的文件。
问题是:在加载图片后,流没有处理,也没有关闭,我无法通过GAC自动处理(我正在使用Xamarin / C#)。 任何想法?我该怎么办?
UPDATE(19/01/17):我在代码中发现了一个小错误,修好后我的问题就解决了。但是这是我的自定义 RequestHandler 以供将来参考... EncryptedFileStream 是我的自定义流,它包装原始流并删除 Dispose()上的解密文件
public class EncryptedFilenameRequestHandler : RequestHandler
{
private readonly Context _context;
private readonly ICriptoService _criptoService;
public EncryptedFilenameRequestHandler(Context context, ICriptoService criptoService)
{
if (context == null) throw new ArgumentNullException(nameof(context));
if (criptoService == null) throw new ArgumentNullException(nameof(criptoService));
_context = context;
_criptoService = criptoService;
}
public override bool CanHandleRequest(Request request)
{
var uri = request.Uri;
return string.Compare(uri.Scheme, Constantes.AppSchema, true) == 0 &&
string.Compare(uri.Authority, Constantes.Host, true) == 0 &&
string.Compare(uri.Path, "/loadimagem/filename/encrypted", true) == 0;
}
public override Result Load(Request request, int networkPolicy)
{
string password = request.Uri.GetQueryParameter("p");
string encryptedFilename = request.Uri.GetQueryParameter("f");
string decryptedFilename = System.IO.Path.Combine(AppEnviroment.GetTempDirectory(), Guid.NewGuid().ToString("N"));
if (string.IsNullOrWhiteSpace(encryptedFilename) || !File.Exists(encryptedFilename))
return null;
_criptoService.Decrypt(encryptedFilename, decryptedFilename, password);
//retorna um stream para leitura do arquivo descriptografado
var uri = Android.Net.Uri.FromFile(new Java.IO.File(decryptedFilename));
var stream = new EncryptedFileStream(decryptedFilename, _context.ContentResolver.OpenInputStream(uri));
return new Result(stream, Picasso.LoadedFrom.Disk);
}
}
答案 0 :(得分:0)
我在代码中发现了一个小错误,在修复之后,我的问题就解决了。此问题中发布的 EncryptedFilenameRequestHandler 代码正常运行。