2017-01-16 24 views
1

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

RequestHandler接受两种类型的结果:

1.位图或2.流。

我试图返回流。这样毕加索可以使用最佳实践加载图像,防止内存不足。我创建了一个自定义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

您的自定义流类是什么样的?不知道你的代码是什么样子,很难诊断问题。 – JohnWowUs

回答

0

我在代码中发现了一个小错误,修复后我的问题解决了。代码为EncryptedFilenameRequestHandler张贴在问题是没有任何问题的工作。