Picasso RequestHandler-在加载图像之前解密文件



我的所有图像都在Android文件系统中加密。当我需要显示它们时,我需要解密,生成位图,然后删除文件。我正试图用毕加索来加载我的图像。我创建了一个RequestHandler来解密和加载图像。

RequestHandler接受两种类型的结果:

1.位图或2.流。

我正试图让水流回流。这样毕加索就可以使用最佳实践加载图像,防止内存不足。我创建了一个自定义Stream类,并重写Dispose()方法以在使用后删除解密的文件。

问题是:加载图像后,流没有被处理,也没有关闭,我无法通过GAC自动处理(我使用的是Xamarin/C#)有什么想法吗?我能做什么

更新(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);
}
}

我在代码中发现了一个小错误,修复后,我的问题得到了解决。问题中发布的EncryptedFilenameRequestHandler的代码运行正常,没有任何问题。

最新更新