Android 毕加索RequestHandler-加载图像前解密文件
我所有的图像都在安卓文件系统中加密。当我需要显示它们时,我需要解密,生成位图,然后删除文件。我想用毕加索来加载我的图像。我创建了一个RequestHandler来解密和加载图像 RequestHandler接受两种类型的结果: 1。位图或2。流 我正试着把这条小溪还回去。这样毕加索就可以使用最佳实践加载图像,防止内存不足。我创建了一个自定义流类,并重写Dispose()方法以在使用后删除解密的文件 问题是:图像加载后,流没有处理,也没有关闭,我无法通过GAC进行自动处理(我使用的是Xamarin/C#)<有什么想法吗?我能做什么? 更新(2017年1月19日):我在代码中发现了一个小错误,修复后,我的问题得到了解决。但这是我的自定义请求处理程序供将来参考EncryptedFileStream是我的自定义流,它在Dispose()上包装原始流并删除解密文件Android 毕加索RequestHandler-加载图像前解密文件,android,picasso,Android,Picasso,我所有的图像都在安卓文件系统中加密。当我需要显示它们时,我需要解密,生成位图,然后删除文件。我想用毕加索来加载我的图像。我创建了一个RequestHandler来解密和加载图像 RequestHandler接受两种类型的结果: 1。位图或2。流 我正试着把这条小溪还回去。这样毕加索就可以使用最佳实践加载图像,防止内存不足。我创建了一个自定义流类,并重写Dispose()方法以在使用后删除解密的文件 问题是:图像加载后,流没有处理,也没有关闭,我无法通过GAC进行自动处理(我使用的是Xamarin
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的代码运行正常。您的自定义流类是什么样子的?如果不知道代码是什么样子,就很难诊断问题。