TIdCompressorZLib 在为 Android 编译的 FireMonkey 应用程序中不起作用

TIdCompressorZLib doesn't work in FireMonkey app compiled for Android

我有一个使用 TIdCompressorZLibTIdHTTP 的函数,像这样:

pegar := tidhttp.create(nil);
compressor := TIdCompressorZLib.create(pegar);
seguro := TIdSSLIOHandlerSocketOpenSSL.create(pegar);
pegar.compressor := compressor;
pegar.Request.UserAgent := UserAgent;
pegar.Request.Accept := '*/*';
pegar.Request.AcceptEncoding := 'gzip, deflate';
pegar.Request.AcceptLanguage := 'pt-BR,pt;q=0.9,en-US;q=0.8,en;q=0.7';
pegar.HTTPOptions := [hoForceEncodeParams];
pegar.ReadTimeout := 60000;
pegar.ConnectTimeout := 60000;
pegar.HandleRedirects := true;
pegar.IOHandler := seguro;
pegar.CookieManager := cookm;
pagina := pegar.Get(proxima_pagina);

此代码在为 Windows 编译时工作正常,但在为 Android 编译时效果不佳。在 Android 上,TIdCompressorZLib 不解压源代码,返回不可读的字符。

有什么办法可以解决这个问题吗?我正在使用 Delphi 10.3.

去掉AcceptEncoding属性的赋值。让 TIdHTTP 根据 Compressor 的实际能力在内部为您处理。您明确授予 HTTP 服务器发送压缩响应的权限,即使 Compressor 无法处理它(即,如果 Compressor.IsReady 为 False)。

也就是说,Indy 使用动态加载库在 non-Windows 平台上访问 ZLib。在这种情况下,'Nix 平台上的 libz dylib(Android 在 Linux 之上运行),它可能不存在于您的 Android 项目中。 Compressor.IsReady returns 如果 Indy 无法在运行时加载 ZLib 库,则为 False。因此,请确保您的部署中存在 dylib。如果您需要在运行时指定该文件的位置,Indy 在 IdZLibHeaders 单元中有一个 IdZLibSetLibPath() 函数。