Android 毕加索RequestHandler-加载图像前解密文件

Android 毕加索RequestHandler-加载图像前解密文件,android,picasso,Android,Picasso,我所有的图像都在安卓文件系统中加密。当我需要显示它们时,我需要解密,生成位图,然后删除文件。我想用毕加索来加载我的图像。我创建了一个RequestHandler来解密和加载图像 RequestHandler接受两种类型的结果: 1。位图或2。流 我正试着把这条小溪还回去。这样毕加索就可以使用最佳实践加载图像,防止内存不足。我创建了一个自定义流类,并重写Dispose()方法以在使用后删除解密的文件 问题是:图像加载后,流没有处理,也没有关闭,我无法通过GAC进行自动处理(我使用的是Xamarin

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

RequestHandler接受两种类型的结果:

1。位图或2。

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

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

更新(2017年1月19日):我在代码中发现了一个小错误,修复后,我的问题得到了解决。但这是我的自定义请求处理程序供将来参考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的代码运行正常。

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